zerodds-monitor v1.1 — Observability substrate — Spec coverage

Source: docs/specs/zerodds-monitor-1.1.md (ZeroDDS vendor spec).

Context: crates/monitor is the ZeroDDS metric/trace substrate — counter/gauge/histogram + registry, Prometheus text rendering, W3C Trace-Context (PID 0x0D00), span schema and declarative topic/GUID policies; 46 tests green. Hook points (§7) live in the layer crates (transport/rtps/discovery/dcps/security).

Implementation:

  • crates/monitor/ · docs.rscounter.rs, gauge.rs, histogram.rs, labels.rs, registry.rs, metric_names.rs, prometheus.rs, trace_context.rs, span_names.rs, config.rs, server.rs; 46 tests green.

§1.1 Data model — layers

Spec: §1.1 — three metric layers (counter/gauge/histogram) over a registry; no_std-capable core.

Repo: crates/monitor/src/lib.rs.

Tests: crates/monitor/src/registry.rs::tests::snapshot_captures_all_three_kinds.

Status: done

§1.2 Counter

Spec: §1.2 — monotonic, atomic, thread-safe counter.

Repo: crates/monitor/src/counter.rs (Counter).

Tests: crates/monitor/src/counter.rs::tests::counter_starts_zero, counter_inc_and_add, counter_concurrent_increments_are_consistent.

Status: done

§1.3 Gauge

Spec: §1.3 — up/down gauge.

Repo: crates/monitor/src/gauge.rs (Gauge).

Tests: crates/monitor/src/gauge.rs::tests::gauge_set_and_get, gauge_inc_dec, gauge_add_negative.

Status: done

§1.4 Histogram

Spec: §1.4 — log10 buckets (11 finite + +Inf); ns/s.

Repo: crates/monitor/src/histogram.rs (Histogram, LabeledHistogram).

Tests: crates/monitor/src/histogram.rs::tests::histogram_records_ns, histogram_records_seconds_converts.

Status: done

§1.5 Labels

Spec: §1.5 — label set, key-sorted/deduplicated; metric key from name+labels.

Repo: crates/monitor/src/labels.rs (Labels, MetricKey).

Tests: crates/monitor/src/labels.rs::tests::empty_labels, labels_dedup_replaces_value, labels_sorted_by_key, metric_key_eq_uses_name_and_labels, metric_key_hashable.

Status: done

§1.6 Registry

Spec: §1.6 — registry with idempotent lookup, snapshot(), default singleton.

Repo: crates/monitor/src/registry.rs (Registry, default_registry).

Tests: crates/monitor/src/registry.rs::tests::default_registry_is_singleton, registry_returns_same_counter_for_same_key, registry_distinct_labels_distinct_counters, snapshot_captures_all_three_kinds.

Status: done

§2 Standard metric naming (31 metrics: 25 counter / 3 gauge / 3 histogram)

Spec: §2.1–§2.5 — 31 metrics across 5 domains (transport 6, RTPS 6, DCPS 10, discovery 5, security 4), dds_ prefix, unique.

Repo: crates/monitor/src/metric_names.rs (31 constants).

Tests: crates/monitor/src/metric_names.rs::tests::all_count_matches_spec, all_have_dds_prefix, all_unique.

Status: done

§3 Prometheus text-format encoding

Spec: §3.1–§3.3 — bucket convention (11 finite + +Inf, _sum/_count), label escaping (\\, ", \n), sorted render; empty registry → empty string.

Repo: crates/monitor/src/prometheus.rs.

Tests: crates/monitor/src/prometheus.rs::tests::render_counter_with_labels, render_gauge, render_histogram_has_buckets_sum_count, render_label_escaping, render_sorted_by_metric_name, render_empty_registry_is_empty_string.

Status: done

§4 W3C Trace-Context as an RTPS vendor PID (0x0D00)

Spec: §4.1–§4.4 — PID 0x0D00, traceparent wire format, encode/decode roundtrip, reject of invalid/short/zero-trace-id payload.

Repo: crates/monitor/src/trace_context.rs.

Tests: crates/monitor/src/trace_context.rs::tests::pid_constant_is_0x0d00, traceparent_format_matches_w3c, traceparent_sampled_bit, pid_roundtrip_with_state, pid_roundtrip_without_state, from_to_span_context_roundtrip, pid_decode_rejects_invalid_traceparent_format, pid_decode_rejects_short_payload, pid_decode_rejects_zero_trace_id.

Status: done

§5 Span schema

Spec: §5.1–§5.2 — span types + hierarchy; GUID-bearing attributes (dds.writer_guid etc.) are subject to GuidLabelPolicy (§9).

Repo: crates/monitor/src/span_names.rs (span constants + GUID attr keys).

Tests: crates/monitor/src/trace_context.rs::tests::from_to_span_context_roundtrip.

Status: done

§6 Lifecycle and configuration

Spec: §6.1–§6.3 — default registry, MonitorConfig (incl. the 1.1 policy fields), optional Prometheus server.

Repo: crates/monitor/src/config.rs (MonitorConfig, set_config, active_config), crates/monitor/src/server.rs, crates/monitor/src/registry.rs.

Tests: crates/monitor/src/config.rs::tests::defaults_match_spec, crates/monitor/src/registry.rs::tests::default_registry_is_singleton, crates/monitor/src/server.rs::tests::server_404s_unknown_path, server_serves_metrics_on_request.

Status: done

§7 Hook-point table (normative, cross-layer wire-up)

Spec: §7 — normative table of metric/span emission per layer crate.

Repo: crates/rtps/src/metrics.rs, crates/dcps/src/metrics.rs + crates/dcps/src/runtime.rs, crates/discovery/src/, crates/transport-udp//-tcp/, crates/security/src/token.rs.

Tests: crates/monitor/src/metric_names.rs::tests::all_count_matches_spec plus the §10 cross-layer test crates/dcps/src/metrics.rs::tests::write_increments_samples_written_and_renders.

Status: done

§8 Stability

Spec: §8 — stability policy; the 1.1 policy fields are additive.

Repo:

Tests:

Status: n/a (informative)

§9 Security (declarative policies)

Spec: §9 — (a) payload redaction; (b) GuidLabelPolicy for GUID span attrs; (c) TopicLabelPolicy for topic-label cardinality. Both dyn-free.

Repo: crates/monitor/src/config.rs (TopicLabelPolicy {Full,Truncate, Hashed,Drop}, GuidLabelPolicy {Full,Hashed,Omit}, MonitorConfig fields, helpers topic_label()/guid_label()), applied in crates/dcps/src/metrics.rs (topic_labels() on all topic hook points). (a) satisfied by the numbers-only data model.

Tests: crates/monitor/src/config.rs::tests::topic_policy_full_is_identity, topic_policy_truncate_caps_length, topic_policy_hashed_is_stable_and_hex, topic_policy_drop_omits_label, guid_policy_variants, active_config_defaults_when_unset_helpers_apply, defaults_match_spec.

Status: done

§10 Test obligation

Spec: §10 — counter/gauge consistency, histogram re-export, Prometheus text, label escaping, PID roundtrip, cross-layer (dcps-write → render), policy.

Repo: crates/monitor/src/ (§1–§4 + §9 policy tests), crates/dcps/src/metrics.rs (cross-layer test).

Tests: the §1–§4 obligations + crates/dcps/src/metrics.rs::tests::write_increments_samples_written_and_renders (cross-layer) + the §9 policy tests.

Status: done

§11 Coverage doc

Spec: §11 — this document; acceptance “all §-sections done”.

Repo: docs/spec-coverage/zerodds-monitor-1.1.md.

Tests:

Status: n/a (informative)


Audit status

10 done / 0 partial / 0 open / 2 n/a (informative) / 0 n/a (rejected).

Test run: cargo test -p zerodds-monitor — 46 tests green, 0 failed; plus cargo test -p zerodds-dcps (§10 cross-layer test green, metrics feature default).

Open items: none. Decision records: none.

zerodds-monitor v1.1 — Observability-Substrate — Spec-Coverage

Quelle: docs/specs/zerodds-monitor-1.1.md (ZeroDDS-Vendor-Spec).

Kontext: crates/monitor ist das Metric-/Trace-Substrat von ZeroDDS — Counter/Gauge/Histogram + Registry, Prometheus-Text-Rendering, W3C-Trace-Context (PID 0x0D00), Span-Schema und deklarative Topic-/GUID-Policies; 46 Tests grün. Hook-Points (§7) liegen in den Layer-Crates (transport/rtps/discovery/dcps/security).

Implementation:

  • crates/monitor/ · docs.rscounter.rs, gauge.rs, histogram.rs, labels.rs, registry.rs, metric_names.rs, prometheus.rs, trace_context.rs, span_names.rs, config.rs, server.rs; 46 Tests grün.

§1.1 Datenmodell — Schichten

Spec: §1.1 — drei Metric-Schichten (Counter/Gauge/Histogram) über einer Registry; no_std-fähiger Kern.

Repo: crates/monitor/src/lib.rs.

Tests: crates/monitor/src/registry.rs::tests::snapshot_captures_all_three_kinds.

Status: done

§1.2 Counter

Spec: §1.2 — monotoner, atomarer, thread-safer Counter.

Repo: crates/monitor/src/counter.rs (Counter).

Tests: crates/monitor/src/counter.rs::tests::counter_starts_zero, counter_inc_and_add, counter_concurrent_increments_are_consistent.

Status: done

§1.3 Gauge

Spec: §1.3 — auf-/absteigender Gauge.

Repo: crates/monitor/src/gauge.rs (Gauge).

Tests: crates/monitor/src/gauge.rs::tests::gauge_set_and_get, gauge_inc_dec, gauge_add_negative.

Status: done

§1.4 Histogram

Spec: §1.4 — log10-Buckets (11 endlich + +Inf); ns/s.

Repo: crates/monitor/src/histogram.rs (Histogram, LabeledHistogram).

Tests: crates/monitor/src/histogram.rs::tests::histogram_records_ns, histogram_records_seconds_converts.

Status: done

§1.5 Labels

Spec: §1.5 — Label-Set, key-sortiert/dedupliziert; Metric-Key aus Name+Labels.

Repo: crates/monitor/src/labels.rs (Labels, MetricKey).

Tests: crates/monitor/src/labels.rs::tests::empty_labels, labels_dedup_replaces_value, labels_sorted_by_key, metric_key_eq_uses_name_and_labels, metric_key_hashable.

Status: done

§1.6 Registry

Spec: §1.6 — Registry mit idempotentem Lookup, snapshot(), Default-Singleton.

Repo: crates/monitor/src/registry.rs (Registry, default_registry).

Tests: crates/monitor/src/registry.rs::tests::default_registry_is_singleton, registry_returns_same_counter_for_same_key, registry_distinct_labels_distinct_counters, snapshot_captures_all_three_kinds.

Status: done

§2 Standard-Metric-Naming (31 Metriken: 25 Counter / 3 Gauge / 3 Histogram)

Spec: §2.1–§2.5 — 31 Metriken über 5 Domains (Transport 6, RTPS 6, DCPS 10, Discovery 5, Security 4), dds_-Prefix, eindeutig.

Repo: crates/monitor/src/metric_names.rs (31 Konstanten).

Tests: crates/monitor/src/metric_names.rs::tests::all_count_matches_spec, all_have_dds_prefix, all_unique.

Status: done

§3 Prometheus-Text-Format-Encoding

Spec: §3.1–§3.3 — Bucket-Konvention (11 endlich + +Inf, _sum/_count), Label-Escaping (\\, ", \n), sortierter Render; leere Registry → leerer String.

Repo: crates/monitor/src/prometheus.rs.

Tests: crates/monitor/src/prometheus.rs::tests::render_counter_with_labels, render_gauge, render_histogram_has_buckets_sum_count, render_label_escaping, render_sorted_by_metric_name, render_empty_registry_is_empty_string.

Status: done

§4 W3C-Trace-Context als RTPS-Vendor-PID (0x0D00)

Spec: §4.1–§4.4 — PID 0x0D00, traceparent-Wire-Format, Encode/Decode- Roundtrip, Reject von ungültigem/kurzem/Zero-Trace-ID-Payload.

Repo: crates/monitor/src/trace_context.rs.

Tests: crates/monitor/src/trace_context.rs::tests::pid_constant_is_0x0d00, traceparent_format_matches_w3c, traceparent_sampled_bit, pid_roundtrip_with_state, pid_roundtrip_without_state, from_to_span_context_roundtrip, pid_decode_rejects_invalid_traceparent_format, pid_decode_rejects_short_payload, pid_decode_rejects_zero_trace_id.

Status: done

§5 Span-Schema

Spec: §5.1–§5.2 — Span-Typen + Hierarchie; GUID-tragende Attribute (dds.writer_guid etc.) unterliegen GuidLabelPolicy (§9).

Repo: crates/monitor/src/span_names.rs (Span-Konstanten + GUID-Attr-Keys).

Tests: crates/monitor/src/trace_context.rs::tests::from_to_span_context_roundtrip.

Status: done

§6 Lifecycle und Konfiguration

Spec: §6.1–§6.3 — Default-Registry, MonitorConfig (inkl. der 1.1-Policy- Felder), optionaler Prometheus-Server.

Repo: crates/monitor/src/config.rs (MonitorConfig, set_config, active_config), crates/monitor/src/server.rs, crates/monitor/src/registry.rs.

Tests: crates/monitor/src/config.rs::tests::defaults_match_spec, crates/monitor/src/registry.rs::tests::default_registry_is_singleton, crates/monitor/src/server.rs::tests::server_404s_unknown_path, server_serves_metrics_on_request.

Status: done

§7 Hook-Point-Tabelle (normativ, Cross-Layer-Wireup)

Spec: §7 — normative Tabelle der Metric-/Span-Emission pro Layer-Crate.

Repo: crates/rtps/src/metrics.rs, crates/dcps/src/metrics.rs + crates/dcps/src/runtime.rs, crates/discovery/src/, crates/transport-udp//-tcp/, crates/security/src/token.rs.

Tests: crates/monitor/src/metric_names.rs::tests::all_count_matches_spec + der §10-Cross-Layer-Test crates/dcps/src/metrics.rs::tests::write_increments_samples_written_and_renders.

Status: done

§8 Stabilität

Spec: §8 — Stabilitäts-Policy; die 1.1-Policy-Felder sind additiv.

Repo:

Tests:

Status: n/a (informative)

§9 Sicherheit (deklarative Policies)

Spec: §9 — (a) Payload-Redaction; (b) GuidLabelPolicy für GUID-Span-Attrs; (c) TopicLabelPolicy für Topic-Label-Kardinalität. Beide dyn-frei.

Repo: crates/monitor/src/config.rs (TopicLabelPolicy {Full,Truncate, Hashed,Drop}, GuidLabelPolicy {Full,Hashed,Omit}, MonitorConfig-Felder, Helper topic_label()/guid_label()), angewandt in crates/dcps/src/metrics.rs (topic_labels() auf alle Topic-Hook-Points). (a) erfüllt durch das zahlen-only Datenmodell.

Tests: crates/monitor/src/config.rs::tests::topic_policy_full_is_identity, topic_policy_truncate_caps_length, topic_policy_hashed_is_stable_and_hex, topic_policy_drop_omits_label, guid_policy_variants, active_config_defaults_when_unset_helpers_apply, defaults_match_spec.

Status: done

§10 Test-Pflicht

Spec: §10 — Counter/Gauge-Konsistenz, Histogram-Re-Export, Prometheus-Text, Label-Escaping, PID-Roundtrip, Cross-Layer (dcps-write → render), Policy.

Repo: crates/monitor/src/ (§1–§4 + §9-Policy-Tests), crates/dcps/src/metrics.rs (Cross-Layer-Test).

Tests: die §1–§4-Pflichttests + crates/dcps/src/metrics.rs::tests::write_increments_samples_written_and_renders (Cross-Layer) + die §9-Policy-Tests.

Status: done

§11 Coverage-Doc

Spec: §11 — dieses Dokument; Akzeptanz „alle §-Sektionen done”.

Repo: docs/spec-coverage/zerodds-monitor-1.1.md.

Tests:

Status: n/a (informative)


Audit-Status

10 done / 0 partial / 0 open / 2 n/a (informative) / 0 n/a (rejected).

Test-Lauf: cargo test -p zerodds-monitor — 46 Tests grün, 0 failed; plus cargo test -p zerodds-dcps (§10-Cross-Layer-Test grün, metrics-Feature default).

Offene Punkte: keine. Decision-Records: keine.