"""telemetry 模块测试 验证两件事: 1. 默认配置(otel_enabled=False)下 setup 是 noop,不初始化任何 provider。 2. enabled=true + endpoint 时 setup 注册真实 TracerProvider;shutdown 复位。 不打真实网络:OTLPSpanExporter 创建时不发请求,BatchSpanProcessor 异步批量 上报在没有 span 产生时也不会触发。 """ from __future__ import annotations from opentelemetry import trace from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor from opentelemetry.sdk.trace import TracerProvider from app.shared.config import Settings from app.shared.telemetry import is_initialized, setup_telemetry, shutdown_telemetry def test_disabled_is_noop(): """otel_enabled=False 时 setup/instrument/shutdown 都不初始化 provider""" settings = Settings(_env_file=None) # 默认 otel_enabled=False setup_telemetry(settings, service_name="test-disabled") assert not is_initialized() def test_enabled_initializes_and_shutdown_releases(): """enabled=true 时 setup 注册 TracerProvider,shutdown 后 _provider 复位""" settings = Settings( _env_file=None, otel_enabled=True, otel_endpoint="http://localhost:4318/v1/traces", ) try: setup_telemetry(settings, service_name="test-enabled") assert is_initialized() provider = trace.get_tracer_provider() # 初始化后是真实 SDK provider(class 名是 TracerProvider); # SDK 启动前的占位 provider 不属于这个类型 assert isinstance(provider, TracerProvider) finally: shutdown_telemetry() # 解除 httpx 全局 monkey-patch,避免污染其它测试 try: HTTPXClientInstrumentor().uninstrument() except Exception: pass assert not is_initialized()