open-webui\backend\open_webui\utils\telemetry
是 Open WebUI 项目中用于实现 分布式追踪(Distributed Tracing) 的模块目录,基于 OpenTelemetry 构建。它提供了对系统运行状态的可观测性支持,包括:
telemetry/
├── __init__.py → 空文件,标识该目录为 Python 包
├── constants.py → 定义通用 Span 属性与标签常量
├── exporters.py → 实现自定义 span 导出逻辑
├── instrumentors.py → 对各类组件进行插桩(instrumentation)
└── setup.py → 初始化整个 telemetry 系统
下面详细介绍每个文件的功能。
constants.py
定义统一的 Span 属性名和标签常量,确保不同组件间数据格式一致。
opentelemetry.semconv.trace.SpanAttributes
。DB_INSTANCE
: 数据库实例地址(host/db_name)DB_TYPE
: 数据库类型(如 redis)ERROR_MESSAGE
: 错误信息字段RESULT_CODE
: 操作结果码RESULT_MESSAGE
: 操作结果描述class SpanAttributes(_SpanAttributes):
DB_INSTANCE = "db.instance"
DB_TYPE = "db.type"
DB_IP = "db.ip"
DB_PORT = "db.port"
ERROR_KIND = "error.kind"
ERROR_OBJECT = "error.object"
ERROR_MESSAGE = "error.message"
RESULT_CODE = "result.code"
RESULT_MESSAGE = "result.message"
RESULT_ERRORS = "result.errors"
这些属性将被注入到 trace span 中,便于后端分析平台识别并展示。
exporters.py
封装 OpenTelemetry 的 span 导出逻辑,提供延迟处理机制。
LazyBatchSpanProcessor
opentelemetry.sdk.trace.export.BatchSpanProcessor
方法 | 功能 |
---|---|
on_end(...) |
在 span 结束时触发,启动 worker 线程进行导出 |
shutdown(...) |
优雅关闭处理器,确保所有未导出 span 都被处理 |
instrumentors.py
实现各类服务的自动插桩(Instrumentation),即通过 OpenTelemetry 对系统内各种操作进行埋点追踪。
类型 | 描述 |
---|---|
FastAPI 请求 | 记录 HTTP 请求路径、方法、响应码等 |
SQLAlchemy | 跟踪数据库 SQL 查询语句、耗时、连接信息等 |
Redis | 记录 Redis 命令执行详情 |
Requests / aiohttp / httpx | 追踪对外部 API 的调用 |
Logging | 将日志信息关联到当前 span |
钩子函数 | 描述 |
---|---|
requests_hook(...) |
设置 HTTP span 名称和 URL |
response_hook(...) |
设置响应码和状态 |
redis_request_hook(...) |
设置 Redis 实例信息和命令 |
httpx_request_hook(...) , aiohttp_request_hook(...) |
对外调用的异步请求跟踪 |
aiohttp_response_hook(...) |
异步请求响应处理 |
class Instrumentor(BaseInstrumentor)
_instrument()
方法启动所有插桩。def _instrument(self, **kwargs):
instrument_fastapi(app=self.app) # FastAPI 请求追踪
SQLAlchemyInstrumentor().instrument(engine=self.db_engine) # 数据库查询追踪
RedisInstrumentor().instrument(request_hook=redis_request_hook) # Redis 操作追踪
RequestsInstrumentor().instrument(...) # 同步 HTTP 调用追踪
LoggingInstrumentor().instrument() # 日志上下文注入
HTTPXClientInstrumentor().instrument(...) # 异步 HTTP 调用追踪
AioHttpClientInstrumentor().instrument(...) # aiohttp 客户端追踪
setup.py
初始化整个 Telemetry 系统,绑定 tracer provider 并启用 instrumentation。
设置全局 tracer provider
trace.set_tracer_provider(
TracerProvider(resource=Resource.create(attributes={SERVICE_NAME: OTEL_SERVICE_NAME}))
注册 OTLP exporter
exporter = OTLPSpanExporter(endpoint=OTEL_EXPORTER_OTLP_ENDPOINT)
trace.get_tracer_provider().add_span_processor(LazyBatchSpanProcessor(exporter))
启用 instrumentation
Instrumentor(app=app, db_engine=db_engine).instrument()
from open_webui.utils.telemetry.setup import setup
setup(app, db_engine)
在应用启动时调用此函数,即可开启完整的分布式追踪能力。
文件 | 功能 |
---|---|
constants.py |
定义通用 span 属性,确保字段一致性 |
exporters.py |
实现 span 异步导出,避免阻塞主流程 |
instrumentors.py |
对数据库、HTTP、Redis、第三方库进行插桩埋点 |
setup.py |
初始化整个 tracing 系统,是接入 OTEL 的入口 |
模块 | 技术亮点 |
---|---|
constants.py |
统一 span 字段命名规范,提升可读性和兼容性 |
exporters.py |
自定义 BatchSpanProcessor,支持异步高效导出 |
instrumentors.py |
支持多种协议插桩(FastAPI, Redis, DB, HTTPX)、具备完善的 hook 机制 |
setup.py |
一键初始化,集成 OTEL 到 FastAPI 生态 |
如果你需要:
instrumentors.py
中添加新的插桩器(如 Kafka、Celery、LLM 调用)。setup.py
中修改 exporter 配置,支持其他后端(如 Jaeger、Prometheus、Zipkin)。constants.py
中定义新指标字段,用于上报额外信息(如模型 ID、用户角色等)。你可以在如下平台查看 trace 数据(取决于你的 OTEL_EXPORTER_OTLP_ENDPOINT
配置):
平台 | 地址示例 |
---|---|
Jaeger UI | http://localhost:16686 |
Tempo (Grafana) | http://grafana:3000/explore |
Zipkin | http://localhost:9411/zipkin/ |
场景 | 用途 |
---|---|
微服务链路追踪 | 统一追踪所有服务调用链路 |
数据库慢查询分析 | 分析 SQL 查询性能瓶颈 |
Redis 缓存命中率 | 监控 Redis 命令执行效率 |
用户行为埋点 | 分析 API 调用模式与使用频率 |
日志上下文追踪 | 快速定位异常请求与对应日志 |
telemetry
目录是 Open WebUI 的 全栈观测体系核心组件,它不仅实现了完整的分布式追踪能力,还提供了灵活的扩展接口,便于后续接入更多监控组件。
它是构建高可用、高性能 AI 应用的关键基础设施之一,特别适用于以下场景:
“你想知道一个用户请求从进入系统到完成,中间经历了哪些数据库查询、Redis 缓存访问、外部 API 调用,并希望记录这些过程以优化性能或排查问题。”
你可以根据实际需求继续增强其能力,比如:
这个目录的存在使得整个系统具备了强大的可观测性基础,是现代云原生 AI 应用不可或缺的一部分。