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

1"""structlog processor that injects the active OTel trace context (Phase 13b, Stage 4). 

2 

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""" 

7 

8from __future__ import annotations 

9 

10import logging 

11 

12from opentelemetry import trace 

13from structlog.typing import EventDict 

14 

15 

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