Adds a one-command local E2E that proves both observability export
surfaces introduced in PR #1398:
(a) Prometheus /metrics: buzz_ws_connections_total,
buzz_events_received_total, buzz_auth_attempts_total present with
non-zero values; target_info absent (suppressed via PR #1398).
(b) OTLP traces: ws.auth and ws.event spans arrive at the collector
carrying conn_id attribute and service.name=buzz-relay resource.
(c) OTLP metrics: collector receives data tagged service.name=buzz-relay.
(d) OTLP-disabled control: with OTEL_EXPORTER_OTLP_ENDPOINT unset
/metrics still serves correctly; collector receives nothing.
Architecture: relay runs on the host (matching the existing
host.docker.internal Prometheus pattern); an otel-collector container
added via compose overlay receives OTLP on :4317. The collector image is
distroless so the output dir is bind-mounted to the host rather than read
via docker exec. The Rust assertions in buzz-test-client read the host
path directly.
New files:
- test/otel-e2e/run.sh — main driver script
- test/otel-e2e/compose.otel-e2e.yml — compose overlay
- test/otel-e2e/otelcol-config.yml — collector config
- test/otel-e2e/README.md — prerequisites and usage
- crates/buzz-test-client/tests/e2e_otel.rs — Rust assertions (all #[ignore])
- Justfile: just otel-e2e target
No changes to crates/buzz-relay/src/**.
Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>