What's new in chart-v0.10.0
One new template, off by default, and an appVersion move from 0.9.28 to 0.10.0. The Ingress is the first resource this chart renders that can publish the daemon beyond the cluster, so it ships disabled and says why. Everything under Behavior is what the new daemon image does differently once it rolls, and one of those things has a memory cost worth knowing before the rollout.
Added
- An optional
Ingress, off by default because the API has no embedded IAM.ingress.enabled=truerenders anetworking.k8s.io/v1Ingress in front of the Service, withclassName, per-controllerannotations,hosts[].paths[]andtls[]passed through.servicePortNamepicks which published port the rules route to,otlp-http(4318: OTLP HTTP, query API,/metrics) by default orotlp-grpc(4317). Anything else fails the render rather than surfacing as a 503 at request time, since the Service publishes no other port. Off by default is a security decision rather than a packaging one: publishing the daemon exposes OTLP ingest,/api/findingswith your SQL templates and endpoint names, and the ack write endpoints, to whoever reaches the host.helm installprints that warning when the Ingress is on.docs/HELM-DEPLOYMENT.mddocuments the two supported postures, internal-only where the boundary is the controller's own exposure plus the NetworkPolicy, and authenticated behind an SSO proxy once the host resolves beyond it. - Enabling an Ingress does not relax the NetworkPolicy. With both on, the controller's pods must be allowed as a peer or every request times out with no useful error, because a NetworkPolicy denies silently. Allow the controller's namespace by the label Kubernetes sets on every namespace since 1.21,
kubernetes.io/metadata.name, rather than by one the controller's own chart may or may not apply. The deployment guide carries the snippet and a way to confirm the peer is what is blocking.
Behavior
- The upgrade rolls the pods. The image tag falls back to
.Chart.AppVersionwhenimage.tagis empty, which is the default, so the pod spec moves from0.9.28to0.10.0. Thechecksum/configannotation also changes, since the ConfigMap carries the chart version in its labels. Pinningimage.tagexplicitly keeps the old image and forgoes everything below. - The daemon gains a second in-memory store, sized by
[daemon] max_retained_traces(default 50). It keeps the masked span trees of the traces its retained findings point at, so a report exported from/api/export/reportcan still draw them. The cost scales withmax_events_per_trace, which is why the default is small next tomax_retained_findings. On a pod with a tight memory limit, size it deliberately or set it to0. It is neutralised automatically, with a startup warning naming the cause, whenapi_enabled = falseormax_retained_findings = 0, since only that one endpoint reads it. The value is exposed on/api/configand listed inperf-sentinel query monitor's Config tab. /api/export/reportreturns a larger body. The span trees ride in it, capped at half the shared client fetch limit soquery monitorand the TUI keep working, but a scraper or a script that stores those snapshots should expect them to grow.- A new bounded-cardinality metric.
perf_sentinel_energy_backend_configured{backend}says which measured-energy backends are actually configured, which no existing gauge could express: every energy gauge is pre-registered at zero whether or not the backend exists, so a ServiceMonitor could not tell "not configured" from "configured and perfectly healthy". Five compile-time label values, published once at startup. - Finding counts can drop on an OTLP ingest that emits blank statements. A span carrying
db.statementwith an empty value now counts as the instrumentation gap it always was, instead of producing an empty-templateredundant_sql. If your collectors run a redacting layer that keeps the attribute, expect fewer findings and a matching rise in the filtered-span tally. - No signature changes. No acknowledgment needs re-capturing, on either the TOML baseline or the daemon's runtime store. The per-window JSON the daemon archives stays byte-identical, so a disclosure
content_hashcomputed under0.9.28still verifies. - No other template, value or default moves. Rendering a values file with no
ingressblock gives you the same objects as0.9.28apart from the image tag, the chart version labels and the checksum they feed. Nothing about the Service, the probes, the ServiceMonitor, the PrometheusRule, the NetworkPolicy or the fragment mounts changes.
Install
The chart is published as an OCI artifact on GHCR, install it directly with no helm repo add step:
helm install perf-sentinel oci://ghcr.io/robintra/charts/perf-sentinel --version 0.10.0Upgrade an existing release:
helm upgrade perf-sentinel oci://ghcr.io/robintra/charts/perf-sentinel --version 0.10.0Verify that the rollout picked up the new image:
kubectl get pod -l app.kubernetes.io/name=perf-sentinel \
-o jsonpath='{.items[*].spec.containers[*].image}'Read docs/HELM-DEPLOYMENT.md for the sizing guidance, the Ingress postures and the NetworkPolicy peer an ingress controller needs.
Full Changelog: chart-v0.9.28...chart-v0.10.0