What's new in v0.9.3
v0.9.3 adds a Datadog ingestion path and broadens database-system recognition at ingestion. A team running dd-trace with no OpenTelemetry SDK can now feed perf-sentinel by bridging dd-trace through an OpenTelemetry Collector running the datadogreceiver, which the binary reads natively. The binary also recognizes the stable OpenTelemetry 1.27 db.system.name attribute, not just the older experimental db.system, and applies the same database-system handling consistently across the OTLP, Jaeger, and Zipkin paths. The pipeline stages, the daemon HTTP routes, the OTLP wire protocol, and the configuration format are unchanged. The surface that moves is the ingestion attribute mapping and the database-system classification. The minimum supported Rust version stays 1.96.0.
Ingestion: Datadog and dd-trace
When a span carries no db.statement or db.query.text, the binary now reads the SQL from the Datadog resource (dd.span.Resource), where dd-trace leaves the obfuscated query. This is what lets dd-trace traffic reach perf-sentinel through an OpenTelemetry Collector running the datadogreceiver, with no application change. The fallback is fail-closed: the resource is read as SQL only when the engine is a recognized SQL system, the resource is non-blank, and the span carries no HTTP signal. A cache or document key, or an HTTP route held in the same field, is never tokenized as SQL.
Ingestion: stable db.system.name and namespaced engines
The binary now reads the stable OpenTelemetry 1.27 db.system.name attribute in addition to the older experimental db.system and the dd-trace db.type. Current datadogreceiver builds emit the database engine under db.system.name, so without this the Datadog bridge would produce no SQL findings at all. Namespaced stable spellings such as aws.dynamodb and microsoft.sql_server are canonicalized to one token per engine, so the same engine carries the same operation label and the same SQL-versus-non-SQL classification regardless of which vocabulary the upstream used. The recognition, the canonicalization, the non-SQL datastore drop, and the engine-label canonicalization now apply on the OTLP, Jaeger, and Zipkin paths alike. A non-SQL store reported under a namespaced stable key, for example aws.dynamodb, is dropped rather than tokenized, closing a path that could embed a key or document value in a finding.
Operator-visible behavior change
A modern OpenTelemetry SDK that sets only the stable db.system.name is now classified: its SQL is recognized and its non-SQL stores are dropped, where before the attribute was ignored. The SQL operation label is canonicalized, so a span whose engine was reported as postgres now carries postgresql, and the same canonical value appears across the OTLP, Jaeger, and Zipkin paths. A consumer that pins the operation string for SQL events against an exact value must accept the canonical spelling. No daemon HTTP route, OTLP wire shape, configuration key, or Prometheus metric is added, removed, or changed.
Why this is a patch and not a minor
The release is additive and backward compatible. The Datadog ingestion path and the stable db.system.name recognition are new inputs, not changes to existing ones, and a service already emitting db.statement over OTLP behaves exactly as before. The one behavior change for downstream consumers is the canonical operation label for SQL events. There is no new CLI flag, no configuration change, and no change to any output format, daemon HTTP route, or OTLP wire protocol. The minimum supported Rust version stays 1.96.0.
Validation
The simulation-lab release-gate passed for v0.9.3 (lab commit ee59473, 2026-06-29), exercising the Datadog bridge with a real dd-trace payload routed through the OpenTelemetry Collector datadogreceiver into the daemon end to end. CI covers the build, the full test suite (cargo test --workspace), clippy at -D warnings, cargo fmt, and both the default and --no-default-features builds.
Verifying this release
# Binary integrity via SLSA Build L3 attestation
gh attestation verify perf-sentinel-linux-amd64 \
--owner robintra --repo perf-sentinel
# A periodic disclosure produced by this binary
perf-sentinel verify-hash --report perf-sentinel-report.json \
--expected-identity "https://github.com/robintra/perf-sentinel/.github/workflows/release.yml@refs/tags/v0.9.3" \
--expected-issuer "https://token.actions.githubusercontent.com"gh CLI 2.49 or newer required for gh attestation verify.
Full Changelog: v0.9.2...v0.9.3