Coverage for src/lumen/observability/log_context.py: 100%
11 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-08-31 18:46 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-08-31 18:46 +0000
1"""structlog processor that injects the active OTel trace context (Phase 13b, Stage 4).
3Adds ``trace_id`` / ``span_id`` (W3C hex form) to every log line while a span is
4active, enabling the log-line ↔ trace jump in Grafana. When no span is active
5(telemetry disabled or outside a request) the log line is returned unchanged.
6"""
8from __future__ import annotations
10import logging
12from opentelemetry import trace
13from structlog.typing import EventDict
16def add_otel_trace_context(
17 _logger: logging.Logger, _method_name: str, event_dict: EventDict
18) -> EventDict:
19 span = trace.get_current_span()
20 ctx = span.get_span_context()
21 if ctx.is_valid:
22 event_dict["trace_id"] = format(ctx.trace_id, "032x")
23 event_dict["span_id"] = format(ctx.span_id, "016x")
24 return event_dict