What's new in chart-v0.9.27
The daemon has loaded ordered TOML fragments from .perf-sentinel.d/ since application 0.9.25, and this chart had no way to fill that directory. The ready-to-copy energy backends in examples/ could only reach a cluster pasted by hand into one large config.toml, which is exactly the merge the fragment loader exists to avoid. config.fragments closes that gap, and the six backends now ship as Helm values overlays you stack on the base file. Chart-only release, appVersion stays on 0.9.26, and a values file that carries no config.fragments renders byte for byte as it did under the previous chart, so an upgrade rolls nothing at all.
Added
config.fragmentsmounts ordered TOML documents. A map ofNN-name.tomlkeys renders into a second ConfigMap, mounted read-only as a directory at/etc/perf-sentinel/.perf-sentinel.d/. The daemon merges them in ascendingNNorder, then appliesconfig.tomllast as the override. The directory is mounted whole rather than key by key, so adding or removing a fragment reaches a running pod, and thechecksum/configannotation now folds in both ConfigMaps, so editing either one rolls the pods. It only folds in the fragments template once that template renders something, which is why an upgrade over a config that did not change stays still.- One values overlay per energy backend in
examples/helm/.alumet,cloud,scaphandre,kepler,redfishandelectricity-maps, each the Kubernetes port of theexamples/file of the same number, stackable on the base values with a second-f. Endpoints resolve through in-cluster DNS rather thanlocalhost, credentials move to a Secret read viaextraEnvFrom, and each overlay names the Kubernetes prerequisite it assumes. Every field of the source.tomlis mirrored, and the exemptions are listed inexamples/helm/README.mdrather than left to be rediscovered. - The three per-node scrapers now state their reach. Alumet, Kepler and Scaphandre run as DaemonSets, and a ClusterIP in front of a DaemonSet load-balances each scrape to one arbitrary pod, which answers for its own node only. On a single-node cluster that is the whole cluster. On a multi-node one the attributed energy hops between nodes and under-reports without ever failing, so the overlays now spell that out and point at a Prometheus federation endpoint as the cluster-wide alternative, with the caveat that keeping the metric name and label intact through federation depends on your own relabeling.
Changed
- Two render-time guards, because the daemon validates at startup and the image has no shell. A boot failure in a
FROM scratchimage leaves nothing to read the error in, so both rules move tohelm template. Fragment names must beNN-lowercase-name.tomlwith a two-digitNN, a[a-z0-9-]slug and no shared priority, which is exactly what the loader accepts. Andlisten_port_*and turning[green]off are rejected inside a fragment, as are[daemon.ack]and[daemon.archive]when persistence has the chart writing them itself. Those are the keys the chart cross-checks againstservice.ports.*, the probes and the PVC while readingconfig.tomlalone, so a fragment redefining one would pass a green check and still produce a pod listening where nothing routes, or a TOML with a table opened twice. Without persistence, or withmanageDaemonPaths=false, you own the ack and archive paths and a fragment carrying them renders fine. - The reserved-key check folds TOML spellings into one before matching. A spaced header
[ green ], a quoted"listen_port_http"and an inlinegreen = { enabled = false }are caught like the plain spelling, while a reserved key merely named in a comment is not. Twenty-two scenarios inscripts/test/chart-render-guards-test.shpin the whole surface. values-perf-sentinel.yamlregainsn_plus_one_messaging_warning_max. The bundledconfig.tomlhas carried that threshold since0.9.23and the example had drifted from it. The overlay file itself stays backend-free, so the base values install unchanged and a backend is a deliberate second-f.
Fixed
scripts/test/examples-helm-load-test.shloads what the render produced. It projects both ConfigMaps the way kubelet does, real files under a timestamped directory, a..datasymlink and one relative symlink per key, then hands the result to a real binary.helm templateproving that a values file renders says nothing about whether the daemon accepts what came out, and a fragment that parses but does not validate renders fine and CrashLoopBackOffs. The script also plants an unparseable fragment in that directory and requires the binary to reject it by name, because every other assertion it makes is satisfied byconfig.tomlalone and would stay green if the fragments were never read at all.- Both Helm harnesses now fail on their own faults instead of passing. A test script that mis-invokes
helmor loses its fixture used to exit clean, which is the failure mode that makes a suite worth less than no suite. Both scripts assert their own setup, and the parity check fails when a Helm overlay drops a field its source.tomlfragment carries.
Behavior
- No change for a values file with no
config.fragments. Every workload kind renders identically to0.9.26,checksum/configincluded, with no second ConfigMap and no extra volume. An upgrade from the previous chart version is metadata-only and rolls no pod. appVersionstays on0.9.26. No new daemon image, so nothing about detection, scoring,/metricsor the query API moves. The fragment loader this chart now feeds shipped in application0.9.25and is already present in the running image.- The two guards can fail a render that used to pass, but only if you adopt
config.fragments. Neither rule can trigger on a values file written for0.9.26, since that file has no fragments to check.
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.9.27Upgrade an existing release:
helm upgrade perf-sentinel oci://ghcr.io/robintra/charts/perf-sentinel --version 0.9.27Add an energy backend by stacking its overlay on the base values:
helm upgrade perf-sentinel oci://ghcr.io/robintra/charts/perf-sentinel --version 0.9.27 \
-f examples/helm/values-perf-sentinel.yaml \
-f examples/helm/values-green-alumet.yamlRead examples/helm/README.md for what each backend expects from the cluster, and docs/HELM-DEPLOYMENT.md for the fragment rules in full.
Full Changelog: chart-v0.9.26...chart-v0.9.27