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