Tests for the log's fields and the metrics Grafana reads (#403)

Three tests for what the dashboard and the alert rules read and nothing
checked: every ipx_ metric named in grafana/dashboard.py and alerts.py
(read out of them at compile time) is served by render, with the ones
written only once known (counts, the last scan, a job under way) set
first; ipx's JSON log lines for a scan's events carry ev, feed, new,
bytes, msg and error.type, and inside a span trace_id and span_id; the
directory's snapshot line carries instance, accepted and the refused_
counts.

The JSON layer was built the same way in both services' setup; it is
otel::json_layer now, so the tests run the layer production does.

The log tests set the global subscriber, as production does: under a
scoped one WithTrace finds no current span (#408).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-07 04:02:15 +00:00
parent a92e81aba2
commit b62182e38e
5 changed files with 185 additions and 30 deletions

View File

@@ -85,21 +85,9 @@ async fn serve(path: &Path) -> Result<()> {
let otel = ipx_directory::otel::provider("ipx-directory")?;
tracing_subscriber::registry()
.with((!json).then(|| tracing_subscriber::fmt::layer().with_writer(std::io::stderr).with_filter(filter())))
.with(json.then(|| {
tracing_subscriber::fmt::layer()
.fmt_fields(tracing_subscriber::fmt::format::JsonFields::new())
// Each line's own fields say all its span did, and the list said it again (#363);
// the trace and span ids lead to the trace instead, as ipx's do (#375).
.event_format(ipx_directory::otel::WithTrace(
tracing_subscriber::fmt::format()
.json()
.flatten_event(true)
.with_current_span(false)
.with_span_list(false),
))
.with_writer(std::io::stderr)
.with_filter(filter())
}))
// Each line's own fields say all its span did, and the span said it again (#363); the trace
// and span ids lead to the trace instead, as ipx's do (#375).
.with(json.then(|| ipx_directory::otel::json_layer(std::io::stderr, false).with_filter(filter())))
.with(otel.as_ref().map(|p| {
use opentelemetry::trace::TracerProvider;
tracing_opentelemetry::layer()