抓取-解析链路原本只有日志,出现"抓回内容但解析不出预期字段"时定位慢。 接入 OpenTelemetry traces(FastAPI/httpx 自动 + 手写 fetch/parse span), 解析失败时把页面 HTML 作为 span event 上报,便于事后复现。 Dockerfile 默认开启,镜像一启动即导出到自建 OTLP endpoint。 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
49 lines
1.8 KiB
Python
49 lines
1.8 KiB
Python
"""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()
|