github Institut-du-Numerique-Responsable/perf-sentinel v0.32.0

latest release: chart-v0.32.0
3 hours ago

What's new in v0.32.0

v0.32.0 is about the energy an official disclosure left out, or counted twice. A SQL finding mostly loads the database, yet without RAPL on the database hosts nothing priced them, and the estimated database_waste figure that docs called database-side was only the application's share of its SQL spans. Meanwhile, services reading the same node each received the whole node. This release bills declared database and broker hosts inside the totals, counts every energy reading once, prices managed instance classes, and adds free real-time carbon intensity from eight grid operators.

Database and broker hosts, inside the totals

[green.database_static] declares the database cluster, and [green.broker_static] now follows the same rules. With placement = "dedicated", nodes and instance_type, the daemon bills the hosts at their SPECpower ceiling, nodes × P_max over elapsed time, under database_specpower or broker_specpower. A cpu_query on [green.cloud] prometheus_endpoint prices them from their CPU instead, idle to max, under cloud_specpower, and the ceiling only covers an outage of that query. Next to [green.alumet.database] or [green.alumet.broker], the measurement wins and the declaration fills the stale stretches.

A host that shares the application nodes declares placement = "shared" with its pod's cpu_query and the shared_with services that read its node. The daemon takes the pod's dynamic watts out of that node before the services split it, so the node is counted once. The load refuses the combinations that would bill one host twice, such as a shared host next to its Alumet workload or a cpu_query equal to an application query, and each message names the fix.

Measured, modeled and declared host energy now joins energy_kwh, co2.total (as co2.database_gco2 and co2.messaging_gco2) and co2.avoidable, where it used to sit beside the totals. disclose records how much of it each period counted in its totals, in a fourth provenance bucket, modeled, for CPU-priced hosts. It adds database_kgco2eq and messaging_kgco2eq to the carbon breakdown and states the host perimeter in the disclaimers, the --tui preview and the PDF. For intent = official, the validator checks that the five breakdown terms add up to the total. The text report, query monitor and the HTML dashboard show the split between applications and hosts, and four counters break the host terms out of perf_sentinel_scored_energy_kwh_total and perf_sentinel_scored_carbon_gco2_total.

One count per energy reading

[green.cloud] services that read one CPU series with one power envelope now split that node by operation count, where each used to receive the whole node. Kepler, Alumet and Scaphandre do the same for a container, a RAPL domain or a process shared by several services. [green.redfish] refuses one chassis under two endpoint ids, and a load warning names node readings that partly overlap across backends. calibrate warns when several services carry an identical energy series.

Managed instance classes, priced

db., cache., kafka., express. and mq. classes, .search and .elasticsearch domains, AWS d, n and b modifiers and Azure temp-disk sizes resolve to the VM family they run on. Cloud SQL db-n1-* and Enterprise Plus tiers, and Azure SQL Gen5 vCore objectives, resolve to their machine series. The embedded table gains 127 rows, Graviton 2, memory-optimized Graviton, GCP n1 and Azure B-series among them. Classes no vendor document ties to a machine, such as db.serverless or the Cloud SQL shared-core tiers, are left out with their reason rather than given an invented figure. docs/INSTANCE-TYPES.md lists the rules.

Live carbon intensity from the grid operators

Eight sections give a cloud region its grid operator's real-time value, daemon only. Four have open licences: [green.rte_eco2mix] (France), [green.neso] (Great Britain), [green.fingrid] (Finland) and [green.energinet] (Denmark). Four more come under restrictive terms: [green.ree_esios] (Spain), [green.open_electricity] (Australia), [green.mavir] (Hungary) and [green.em6] (New Zealand). All count direct emissions, so they read lower than a lifecycle Electricity Maps value. Electricity Maps wins for any region both cover. A record past the operator's lag is rejected, and a silent feed falls back to the embedded profiles. The configuration guide quotes each restrictive operator's terms next to the project's reading of its own use. Reports name the feed in intensity_provider, and carbon_intensity_source accepts the eight names, which bumps the disclosure schema to perf-sentinel-report/v1.8.

Totals over any time range, and two disclose chores gone

perf_sentinel_scored_energy_kwh_total and perf_sentinel_scored_carbon_gco2_total sum every scoring window since daemon start. Summing the existing gauges over a range counted a window once per scrape, while increase(...[$__range]) over the counters survives restarts. The example dashboard gains two stat panels that read them. methodology.calibration.specpower_table_version is now optional, filled by disclose with the binary's table date, and disclose --total-requests-in-period <N> sets the coverage denominator for one run.

Fixes

The shared HTTP fetch bounds the response body with the same deadline as the headers, so a peer that stalls mid-body no longer hangs a scraper loop silently. [green.cloud] prices each tick over the time since the previous one rather than the nominal interval, so a tick delayed by a slow Prometheus answer no longer under-counts. disclose prices each anti-pattern's waste at the service's own energy per operation, where it used a flat 1e-7 kWh. rustls-webpki 0.103.16 and webpki-roots 1.0.10 close RUSTSEC-2026-0382 and RUSTSEC-2026-0381.

Upgrade impact

  • Energy and carbon totals move. A configured database or broker host source now counts inside the totals, services sharing a node split it instead of each billing it whole, and managed or modifier instance names get their VM family's envelope instead of the provider default.
  • Some configurations no longer load, for every subcommand. [green.broker_static] requires placement and an instance_type that resolves. [green.alumet.database] and [green.alumet.broker] need an effective region. A Redfish chassis declared under two endpoint ids is refused, and so are the double-counting combinations listed above. Each message names the fix.
  • A daemon with intent = "official" whose org config declares a stale specpower_table_version refuses to start. Align the date or remove the line.
  • Breaking, perf-sentinel-core only. Several public structs gain fields and some signatures change, listed in the CHANGELOG. A downstream crate building them with a struct literal must follow.
  • New configuration sections and keys, new metrics, sixteen /api/energy backends and the disclosure schema v1.8 (v1.0 to v1.7 stay accepted). A report without host energy or a grid feed keeps its shape. No detector, normalizer or finding signature changes, SPECPOWER_VINTAGE keeps its date, and MSRV stays 1.99.1. A daemon image built from this release passed validate-findings 12/12 and the energy, disclosure, dashboard and output scenarios of the simulation lab.

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.32.0" \
  --expected-issuer "https://token.actions.githubusercontent.com" \
  --verify-binary ./perf-sentinel-linux-amd64

gh 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.

Don't miss a new perf-sentinel release

NewReleases is sending notifications on new releases.