A ctlplne studio product

Carbon / power observability (estimate)

What this is

The sustainability view of network traffic, for ESG reporting (environmental, social, governance — the corporate-disclosure framework that asks "what is your footprint?"): an estimate of how much electricity (kWh — kilowatt-hours, the unit on your power bill) and carbon (gCO2e — grams of CO₂-equivalent, the standard unit that folds every greenhouse gas into one number) the network spends moving your bytes, broken down by traffic class, service, and team. It is the same idea as Kepler — the Kubernetes project that attributes datacenter energy to workloads — applied to the network plane, and it is computed entirely from telemetry probectl already has.

It lives in the control plane (internal/carbon) and reuses the FinOps engine's plumbing: the same flow stream and the same zone/owner attribution, so the dollar view and the carbon view always agree on who owns which traffic. It is fully local: no external calls, and the grid carbon intensity is operator-set configuration — per the no-phone-home rule in the Non-negotiables, nothing is fetched and nothing leaves your network.

The estimate, and its honesty

Two multiplications:

kWh   = (bytes / GiB) × kWh-per-GB(traffic class)
gCO2e = kWh × grid intensity (gCO2e/kWh)
  • Energy coefficients — a coefficient here is a fixed kWh-per-GB multiplier for fixed-network transmission energy, taken from the published literature (the Aslan et al. 2017 band and its successors). probectl scales the coefficient by path locality, because traffic crossing more network hops costs more energy to move. The defaults span roughly 0.004 to 0.06 kWh/GB:

    Traffic class kWh per GB
    same_zone 0.004
    inter_az 0.01
    inter_region 0.03
    internet_egress 0.06
    unknown (zones unmapped) 0.01 (conservative mid-band)
  • Grid intensity — PROBECTL_CARBON_GRID_GCO2E, the carbon your electricity carries per kWh. It defaults to roughly the world average (436 gCO2e/kWh). Set your real figure — your utility or national grid operator publishes it, and it varies enormously by region (a hydro-heavy grid is a fraction of a coal-heavy one).

  • Attribution — the exact same zone and owner maps the FinOps engine uses (PROBECTL_COST_ZONES / PROBECTL_COST_SERVICES), so dollars and grams line up on the same services and teams.

The honesty contract is structural, not a footnote. The estimate has the same shape as planning a road trip's fuel burn from distance × the manufacturer's liters-per-100km figure: excellent for comparing routes, drivers, and months — and never a substitute for the receipt at the pump. Every response therefore carries a methodology block: measured: false, the coefficient source, the grid intensity used, and a note stating plainly that these are coefficient-based estimates of transmission energy, not measured device power. They are good for relative attribution ("service A moves ~3× the carbon of service B"), trends over time, and ESG reporting that cites its methodology — they are not audited absolute footprints, and the engine never pretends otherwise.

Serving

GET /v1/carbon (permission metrics.read) — the tenant's totals, the breakdowns by class / service / team, a 7-day hourly trend, and the methodology block. In the UI, the Carbon / energy (estimate) card folds into the Cost page — the sustainability sibling of dollar showback. carbon_running: false distinguishes an engine that is not wired in from one that simply has no data yet.

Configuration

Variable Default Purpose
PROBECTL_CARBON_ENABLED true the estimation engine (local-only)
PROBECTL_CARBON_GRID_GCO2E 436 your grid's carbon intensity in gCO2e/kWh (accepted range 1–5000)

Deferred by design:

  • Device-measured power. The methodology block's measured flag is the structural seam for one day distinguishing real device power (e.g. PSU watts over SNMP) from coefficient estimates — today it is always false, no supported device reports watts, and the engine never fabricates them.
  • Per-region grid intensities. For now a deployment uses one grid figure; there is no per-region split.
Rendered live from github.com/ctlplne/probectl — found a mistake? edit this page.