Subsystem · Tools

Tools & tooling

Code generation, linting, observability, recording, conformance harness, build-time helpers — all in the same workspace as the core. Same versioning, same release cycle, no tool-vs-runtime drift.

Learn

Learn — what counts as tooling?

Two kinds of tools sit around a middleware codebase. Build-time tools turn source artefacts (IDL files, configs) into compiled outputs — that is idlc and the codegen back-ends. Runtime tools observe, debug or extend a running deployment — that is monitor, observability-otlp, recorder, inspect-endpoint.

A third category — conformance harnesses, fuzzers, lint passes — sits in CI: they protect the core against regressions and check that every change still implements the spec. dds-lint and the conformance crate live there.

ZeroDDS keeps all three in one Cargo workspace. The build pipeline, the runtime daemons and the CI harnesses share the same Rust edition, the same MSRV, the same dependency graph. When the core moves to a new XTypes annotation, every tool sees it immediately.

Why

Why — one workspace, one release cycle

Separating tools from the runtime is the default pattern in middleware. RTI's tools ship from a different team, Cyclone's debugger lives in a separate repo, Fast DDS' Discovery Server is its own release. The result is well-known: the tools always lag behind the runtime, version compatibility becomes a matrix, and bug fixes take three releases to propagate.

ZeroDDS treats every tool as a workspace crate. cargo test runs the full suite — runtime + tools + CI harnesses — in one go. A breaking change in the core is caught in the tool tests of the same PR. You never deploy a runtime that the lint or the monitor does not understand.

The trade-off: a single repo with 100+ crates is larger than a focused one. We accept that cost. Cargo's workspace model handles it without ceremony, and the win in correctness pays back every release.

What

What we built

Nine workspace crates plus the idlc CLI (delivered with the idl crate). Each has a README, examples, and where applicable a spec-coverage report.

Crate Role Spec / scope
idlc (via idl) Code generation Part of the idl crate. zerodds-idlc --<lang> emits Rust, C, C++, C#, Java, Python or TypeScript from a .idl file. Add --corba for Annex-A.1 stubs (C++/C#/Java only).
lint IDL lint dds-lint — static analysis for .idl files. Catches missing @key, accidental @mutable on hot-path topics, breaking type evolution. CI-ready.
monitor Monitoring 31 first-class Prometheus metrics + W3C-Trace-Context spans. Vendor spec: zerodds-monitor-1.1.
observability-otlp OTLP exporter OpenTelemetry exporter. Pushes the same metrics + spans to any OTLP collector.
recorder Record / replay .zddsrec format — deterministic record-and-replay with stable indexes. CI fixtures, regression captures, production post-mortems.
inspect-endpoint Inspect endpoint Feature-gated tap into a running participant. Pair with PDE Reality Inspector to see samples and discovery in flight.
flatdata · flatdata-deriveBuild helpers flatdata + flatdata-derive — zero-copy data layouts used by the recorder and the shared-memory transport.
foundation Core utilities Shared crate for low-level utilities used across the workspace. Not consumed directly by user code.
conformance Conformance harnessTest harness that exercises every OMG-spec requirement end-to-end. Drives the spec-coverage reports.
chaos-clock-skew Chaos testing chaos-clock-skew — injects clock-skew faults into participants for resilience testing in CI.

Spec coverage — per tool

Tools with a published spec sheet list their vendor spec and conformance report.

Tool Vendor spec Coverage report Implementation Status
monitor zerodds-monitor-1.1 → spec pending monitor ✓ RC3
observability-otlp zerodds-observability-otlp-1.0 → spec pending observability-otlp ✓ RC3
recorder zddsrec-1.0 → spec pending recorder ✓ RC3
inspect-endpoint part of dcps crate zerodds-listener-callbacks-1.1 → inspect-endpoint ✓ RC3
flatdata zerodds-flatdata-1.0 → zerodds-flatdata-1.0 → flatdata ✓ RC3
conformance n/a — exercises core OMG specs see /spec-coverage/* (10 reports) conformance ✓ RC3
deployment zerodds-deployment-1.0 → zerodds-deployment-1.0 → see packaging ✓ RC3
ffi-loader zerodds-ffi-loader-1.0 → zerodds-ffi-loader-1.0 → part of zerodds-c-api ✓ RC3
How

How — installing and running the tools

Most tools are single binaries delivered as part of the ZeroDDS install. CI helpers integrate via cargo features and standard Rust build hooks.

Per-tool pointers

idlc

Code generator CLI. Reads an OMG IDL 4.2 file, emits native types for the chosen target language.

cargo install zerodds-idlc
zerodds-idlc --rust -o gen/rust types.idl
dds-lint

IDL static analyser. Flags missing @key, breaking type evolution, accidental @mutable on hot-path topics.

cargo install dds-lint
dds-lint check types.idl
monitor

Prometheus + W3C-Trace-Context metrics. 31 first-class counters / gauges / histograms covering discovery, reliability, sample state and QoS.

curl http://localhost:9100/metrics
observability-otlp

OpenTelemetry OTLP exporter. Pushes the same metrics and spans to any OTLP-compatible collector (Tempo, Jaeger, Honeycomb, …).

ZERODDS_OTLP_ENDPOINT=https://otlp.example.org
recorder

Deterministic record and replay for DDS traffic. .zddsrec format with stable indexes. CI fixtures, regression captures, post-mortems.

zerodds record --topic Temperature --output run.zddsrec
zerodds replay run.zddsrec
inspect-endpoint

Feature-gated side channel into a running participant. Pair with the external PDE Reality Inspector for live sample visualisation.

cargo run --features inspect
flatdata

Zero-copy data layout library plus derive macros. Used by the recorder and the shared-memory transport.

cargo add flatdata flatdata-derive
conformance

Test harness that exercises every OMG-spec requirement end-to-end. Drives the per-spec coverage reports.

cargo test -p conformance
chaos-clock-skew

Chaos-engineering helper for clock-skew injection. Used in CI to verify reliable-protocol behaviour under skewed clocks.

cargo test --features chaos-clock-skew