What's new in v0.33.0
v0.33.0 is about a database that does not fit one instance type. A writer on a large class with two smaller readers, or one cluster per tenant, could only be declared as one nodes count, one instance_type and one cpu_query, so the daemon priced every host at the same class and the same load. [green.database_static] and [green.broker_static] now take groups of hosts of different sizes, each priced on its own.
One group per size, each on its own query
A dedicated declaration lists its groups of identical hosts as [[green.database_static.hosts]] entries, each with its own nodes, instance_type and optional cpu_query, and leaves those three keys out of the section itself. [[green.broker_static.hosts]] follows the same rules. The section's region holds for every group.
[green.database_static]
placement = "dedicated"
region = "eu-west-3"
[[green.database_static.hosts]]
nodes = 1
instance_type = "db.r6i.xlarge"
cpu_query = 'avg(aws_rds_cpuutilization_average{dbinstance_identifier="orders-writer"})'
[[green.database_static.hosts]]
nodes = 2
instance_type = "db.r6i.large"
cpu_query = 'avg(aws_rds_cpuutilization_average{dbinstance_identifier=~"orders-reader-.*"})'Each group bills from its CPU, falls back to its own ceiling once its query has been silent for three scrape intervals, and recovers on its own. A group whose query stops answering bills its ceiling while the others keep their readings, and the reading that reaches back over the outage once the query answers again is dropped, so the outage is billed once. The subsystem figure is the sum of its groups, tagged cloud_specpower while every group bills from its CPU and database_specpower or broker_specpower as soon as one group billed its ceiling, so a fallback is never published as a reading. The cloud scraper fetches every host probe on one tick, and perf_sentinel_database_cpu_last_scrape_age_seconds and its broker twin read the group that has gone longest without a reading.
The load refuses groups under placement = "shared", next to the Alumet workload, next to a top-level nodes, instance_type or cpu_query, without both nodes and instance_type, past 256 groups or 10000 nodes in all, and two groups reading the same cpu_query. Each message names the group by its index, and the duplicate check cites the two indexes rather than echoing the query. A new simulation lab scenario drives the daemon against a stand-in Prometheus: both groups live at their summed SPECpower envelope, the reader silenced to writer reading plus reader ceiling rather than two ceilings, the outage billed once after recovery, and broker groups at their envelope.
Power and carbon per hour on the example dashboard
The Energy per scoring window (kWh) and Carbon per scoring window (gCO2e) panels of examples/grafana-dashboard.json become Average power (W) and Carbon per hour (gCO2e/h), the rates of perf_sentinel_scored_energy_kwh_total and perf_sentinel_scored_carbon_gco2_total. Scoring windows do not all last the same time, so the per-window gauges plotted an energy per batch that read like a power. The descriptions now state the scope, and the Compatibility badge checks the 0.32.0 counters, so an older daemon reads Partly compatible instead of leaving those panels empty. The French dashboard follows.
Official example on schema v1.8
docs/schemas/examples/example-official-public-G2.json moves to perf-sentinel-report/v1.8 and perf-sentinel 0.32.0, with the binary_hash of the published 0.32.0 Linux binary and a rebaked content_hash.
Upgrade impact
- A section without
hostsloads and bills as before. Groups are opt-in. - Breaking,
perf-sentinel-coreonly.StaticHostsConfiggains a publichosts: Vec<HostGroup>field and agroups()method. A downstream crate building it with a struct literal must follow. - New configuration tables, no new metric, route or wire format, and no disclosure schema change. No detector, normalizer or finding signature changes, the embedded reference data keeps its vintages, and MSRV stays 1.99.1.
Full detail in CHANGELOG.md.
Verifying this release
# Binary integrity via SLSA build provenance attestation (Build Level 2)
gh attestation verify perf-sentinel-linux-amd64 \
--repo Institut-du-Numerique-Responsable/perf-sentinel
# A periodic disclosure produced by this binary, with its attestation and bundle
perf-sentinel verify-hash --report perf-sentinel-report.json \
--attestation perf-sentinel-report.intoto.jsonl --bundle perf-sentinel-report.sig \
--expected-identity "https://github.com/Institut-du-Numerique-Responsable/perf-sentinel/.github/workflows/release.yml@refs/tags/v0.33.0" \
--expected-issuer "https://token.actions.githubusercontent.com" \
--verify-binary ./perf-sentinel-linux-amd64gh CLI 2.49 or newer required for gh attestation verify. Releases up to v0.26.2 were attested under robintra/perf-sentinel and keep their own --repo and identity.