Roadmap¶
sdmetrics was planned in four milestones, each with a gate: a concrete check against real systemd. All four are implemented in the initial release, and the gates run in CI on every change as integration tests.
timeline
title sdmetrics milestones
section Consume
v0.1 Scraper + exporter : discover sources : Describe and List : unit identity : OTLP push
section Publish
v0.2 Provider SDK : gauges, counters, strings : labels and objects : socket activation
section Integrate
v0.3 Bridges + Prometheus : prombridge, otelbridge : /metrics endpoint : OTel naming mode
section Collector
v0.4 Receiver : systemdreport receiver : mdatagen + scraperhelper : ocb builds
Milestones and gates¶
| Milestone | Scope | Gate | Status |
|---|---|---|---|
| v0.1 Scraper and exporter | scrape, otelmap, sdmetrics-exporter with OTLP, -once, the packaged unit. |
systemd's own sources scrape with correct types and identity (TestSystemdSources), and the exporter delivers them to an OTLP sink (TestExporterToOTLP). |
done |
| v0.2 Provider SDK | provider: metric types, labels, objects, callbacks, collectors, socket options, FromActivation. |
The sample daemon, run as a service, shows up in systemd-report and the scraper, attributed to its unit (TestSampleDaemon); socket-activated too (TestSocketActivated). |
done |
| v0.3 Bridges and Prometheus | prombridge, otelbridge, the Prometheus endpoint, naming: otel. |
Round-trip tests through a provider for both bridges (TestRoundTrip); the endpoint serves both naming modes (TestPrometheusRaw, TestPrometheusOTelNaming). |
done |
| v0.4 Receiver | systemdreportreceiver with mdatagen, scraperhelper, golden files. |
The generated lifecycle tests and the golden-file test (TestScrapeGolden) pass against Collector v0.163.0 / v1.69.0. |
done |
Gate checklist¶
- systemd's own sources scrape on v262 with every value typed (no drops from the manager).
- The sample daemon is attributed to its unit, as a service and socket-activated.
-
systemd-reportreads a Go provider. - The packaged unit starts, serves
/metrics, and scores 1.5 insystemd-analyze security. - 50 sources and 5,000 values scrape in well under a second (about 27 ms).
- Provider updates don't allocate.
- CI fails on benchmark regressions over 25%.
Follow-ups¶
-
The
objectfamily type
systemd v262 added an
objecttype, and journald uses it. Today those values are dropped and counted (sdmetrics.metrics.dropped,reason="untyped"). Next: decode them and decide on a mapping, likely flattening members into attributes or separate metrics. -
Semantic conventions
Propose
systemd.report.source,systemd.unit.name,systemd.objectandsystemd.valueto OpenTelemetry semantic conventions, so the mapping stops being sdmetrics-specific. -
Upstream the receiver
Propose
systemdreportreceivertoopentelemetry-collector-contrib. It already follows contrib's layout:metadata.yaml,mdatagen,scraperhelper, golden tests. -
Signed report forwarding
systemd v262 adds
io.systemd.Report.SignPlain. Explore forwarding signed reports, so a backend can verify which host produced them.
Out of scope¶
Replacing node_exporter or the Collector's host metrics, storing or querying metrics, remote transports, and systemd older than v260. See Design decisions.
Have a use case that doesn't fit? Open an issue.