@@ -3,6 +3,7 @@ import logging
|
||||
from io import StringIO
|
||||
|
||||
import structlog
|
||||
from opentelemetry.trace import NonRecordingSpan, SpanContext, TraceFlags, use_span
|
||||
|
||||
from app.runtime.logging import configure_logging
|
||||
|
||||
@@ -51,6 +52,72 @@ def test_structured_context_is_preserved_and_rendered_in_event() -> None:
|
||||
_reset_logging()
|
||||
|
||||
|
||||
def test_active_open_telemetry_context_is_added_to_structured_log() -> None:
|
||||
stream = StringIO()
|
||||
span_context = SpanContext(
|
||||
trace_id=0x1234567890ABCDEF1234567890ABCDEF,
|
||||
span_id=0x1234567890ABCDEF,
|
||||
is_remote=False,
|
||||
trace_flags=TraceFlags(TraceFlags.SAMPLED),
|
||||
)
|
||||
|
||||
configure_logging(stream=stream)
|
||||
|
||||
with use_span(NonRecordingSpan(span_context)):
|
||||
structlog.get_logger("app.test").info("application_event")
|
||||
|
||||
payload = json.loads(stream.getvalue().splitlines()[0])
|
||||
|
||||
assert payload["trace_id"] == "1234567890abcdef1234567890abcdef"
|
||||
assert payload["span_id"] == "1234567890abcdef"
|
||||
assert payload["trace_flags"] == 1
|
||||
assert payload["event"] == (
|
||||
'application_event span_id="1234567890abcdef" trace_flags=1 '
|
||||
'trace_id="1234567890abcdef1234567890abcdef"'
|
||||
)
|
||||
|
||||
_reset_logging()
|
||||
|
||||
|
||||
def test_missing_open_telemetry_context_is_not_added_to_log() -> None:
|
||||
stream = StringIO()
|
||||
|
||||
configure_logging(stream=stream)
|
||||
|
||||
structlog.get_logger("app.test").info("application_event")
|
||||
|
||||
payload = json.loads(stream.getvalue().splitlines()[0])
|
||||
|
||||
assert "trace_id" not in payload
|
||||
assert "span_id" not in payload
|
||||
assert "trace_flags" not in payload
|
||||
|
||||
_reset_logging()
|
||||
|
||||
|
||||
def test_active_open_telemetry_context_is_added_to_stdlib_log() -> None:
|
||||
stream = StringIO()
|
||||
span_context = SpanContext(
|
||||
trace_id=0x1234567890ABCDEF1234567890ABCDEF,
|
||||
span_id=0x1234567890ABCDEF,
|
||||
is_remote=False,
|
||||
trace_flags=TraceFlags(TraceFlags.SAMPLED),
|
||||
)
|
||||
|
||||
configure_logging(stream=stream)
|
||||
|
||||
with use_span(NonRecordingSpan(span_context)):
|
||||
logging.getLogger("app.test").info("application_event")
|
||||
|
||||
payload = json.loads(stream.getvalue().splitlines()[0])
|
||||
|
||||
assert payload["trace_id"] == "1234567890abcdef1234567890abcdef"
|
||||
assert payload["span_id"] == "1234567890abcdef"
|
||||
assert payload["trace_flags"] == 1
|
||||
|
||||
_reset_logging()
|
||||
|
||||
|
||||
def test_uvicorn_loggers_use_shared_json_logging_setup() -> None:
|
||||
stream = StringIO()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user