What's new in chart-v0.24.0
One default moves and nothing else does. workload.statefulset.persistence.size goes from 1Gi to 2Gi, no template changes, no values.yaml key is added or removed, the shipped PrometheusRule is untouched, and the rendered perf-sentinel.toml is byte-for-byte what chart-v0.23.0 rendered, same 5477 bytes and the same digest. appVersion moves to 0.24.0 and image.tag follows it to :0.24.0.
A claim that could never hold what the chart puts on it
With persistence.enabled, the chart points [daemon.archive] path at the volume it creates. At its own defaults that archive keeps one active file plus max_files (12) rotated ones of max_size_mb (100) each, about 1.3 GB, and the ack store sits beside it. The claim was 1Gi.
A full volume does not stop the daemon. The archive writer drops the windows it cannot write and counts them on perf_sentinel_archive_windows_dropped_total{reason="write_error"}, so the loss was silent unless somebody watched that counter, and the periodic disclosure built from that archive came out with holes its hash chain cannot show.
2Gi covers the archive at its defaults with room beside it. It leaves nothing for a [daemon.incidents] archive_path pointed at the same volume, which the incidents note in values.yaml suggests doing: that file is append-only and never rotates, so raise the claim further for it or keep it off the PVC.
What moves inside the pod
The daemon reads its incident ring back from [daemon.incidents] archive_path at startup, so /api/incidents and the Grafana incident panels no longer come back empty after every restart and every helm upgrade. The archive was written and never read. The replay is bounded to the file's last 256 MiB so an unrotated file cannot hold the daemon past its liveness probe, it runs before the API serves, and nothing is appended back.
Findings that carried no framework signal now carry a suggested_fix: an OpenTelemetry Java agent scope identifies Java, cross-trace and cross-batch slow findings go through the suggestions step, the four structural types carry the scopes and code_location of one representative call, and a framework with no fix for a type falls back to its language generic. Finding signatures depend on neither field, so existing acknowledgments still match.
GET /api/incidents takes an id and GET /api/acks takes an include_toml. Both are additions, and a client that sends neither sees the response it saw before.
The v0.24.0 binary notes describe all of it.
Upgrade impact
- An existing StatefulSet keeps its
1Giclaim. AvolumeClaimTemplateis immutable, sohelm upgradecannot grow it. Resize the PVC itself where the StorageClass allows expansion, or reinstall the release. A fresh install gets2Gi. - Go back below
2Gionly with the archive sized to match.persistence.manageDaemonPaths: falseand a smaller[daemon.archive]inconfig.toml, when storage rather than the archive is what you are short of. - Pods roll on the image.
helm upgradereplaces them becauseappVersionandimage.tagmove together. - Incidents come back on the first restart after the upgrade, where
[daemon.incidents] archive_pathis set. The ring is repopulated from a file the daemon has been writing all along, so the incident panels show history they never had. - Findings gain fields they did not carry.
suggested_fix,instrumentation_scopesandcode_locationappear on findings that had none. No finding appears or disappears and no signature changes. checksum/configmoves too, and not because your configuration changed. The renderedperf-sentinel.tomlis identical, but the ConfigMap carrieshelm.sh/chartandapp.kubernetes.io/versionlabels that bump with the chart, so the checksum over it differs on every version bump.- The two example Grafana dashboards live outside this chart. The findings one moves to
version11: aHistory (Hub)row that reads PerfSentinelHub through a second, optional Infinity datasource, anAckcolumn on its three findings tables, incident panels that page the whole ring, and a readableinfoseverity on a dark theme. Re-import it wherever you provision it. - The example incident alerting rules live outside this chart too, and they gain a
perf_sentinel:untraced_services:1drecording rule so a workload the daemon has never traced raises nothing. Under the VictoriaMetrics operator that rule needs the VMAlert'sremoteWrite, without which vmalert refuses every rule it selects.
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.24.0Upgrade an existing release:
helm upgrade perf-sentinel oci://ghcr.io/robintra/charts/perf-sentinel --version 0.24.0Read docs/HELM-DEPLOYMENT.md for the ServiceMonitor section, sizing and Ingress postures.
If you are upgrading from chart-v0.18.0 or earlier, read the chart-v0.19.0 notes first: that release adds a grouping label to five metrics and is breaking for an unaggregated alert on any of them. From chart-v0.16.0 or earlier, read the chart-v0.17.0 notes as well, which change the shipped PrometheusRule.
Full Changelog: chart-v0.23.0...chart-v0.24.0