feat(otel #876): 双 Claw 强制标签 + 入口接线 + Grafana 双 Claw 对比看板
#876 OpenTelemetry 可观测(双 Claw 标签): - app/core/otel.py: 新增 set_otel_ctx/get_otel_ctx(ContextVar 三元组 tenant_id+claw_type+ trace_id);current_span_cm 自动注入双 Claw 强制标签,全部 13 个 span 调用点零签名侵入带维度; record_span_metrics 指标维度补 tenant_id+claw_type(trace_id 因高基数不计入指标标签)。 - app/core/llm_router.py: set_route_ctx 桥接转调 set_otel_ctx(单次入口注入双端共享: 路由上下文 + OTel 标签),失败安全。 - app/api/chat.py: send_message 与 send_message_stream 入口注入 set_route_ctx(web), stream 经 asyncio.create_task 子协程自动传播 contextvars,使 _send_message_core 内 所有 span 均带 tenant_id+claw_type。 - app/api/im_llm.py: _call_real_llm 入口最早注入 set_route_ctx(im_wechat),并显式开启 im.send_message span(此前 IM Claw 完全无 span,Grafana 无 IM 数据点),finally 关闭。 - tests/test_dual_claw.py: R-DUAL-6 由 skip 转为确定性断言(Web/IM 双 Claw span 必带 tenant_id+claw_type),作为持续哨兵。 - 交付 Grafana 双 Claw 对比看板 JSON(aiflow_span_* / aiflow_llm_route_total 按 claw_type 分组:P50/P95 延迟、成功率、QPS、租户健康 Top10)。Alloy OTLP 仅桥接 metrics→Prometheus, trace 无 pipeline(#800 已压制 UNIMPLEMENTED 噪声),看板基于 metrics 出图。 safe-align: 仅复制 5 个 git-tracked 文件,未触碰 secrets/venv/node_modules/caches。本地提交不 push。
This commit is contained in:
1 parent
180409d317
commit
04a0641202
5 files changed
+153
-13
No files matched your search
@@ -51,10 +51,20 @@ _route_claw_var: ContextVar[str] = ContextVar("aiflow_route_claw", default="web"
|
||||
|
||||
|
||||
def set_route_ctx(*, tenant_id: str = "", claw_type: str = "web") -> None:
|
||||
"""在请求入口注入路由上下文。tenant_id/claw_type 为空时保留默认值。"""
|
||||
"""在请求入口注入路由上下文(#875)。tenant_id/claw_type 为空时保留默认值。
|
||||
|
||||
#876 桥接:同时注入 OTel 双 Claw 强制标签(set_otel_ctx),使单次入口调用
|
||||
即可让后续所有 span / metric 自动带上 tenant_id + claw_type + trace_id。
|
||||
失败安全:otel 不可用时静默跳过。
|
||||
"""
|
||||
if tenant_id:
|
||||
_route_tenant_var.set(tenant_id)
|
||||
_route_claw_var.set(claw_type or "web")
|
||||
try:
|
||||
from app.core.otel import set_otel_ctx
|
||||
set_otel_ctx(tenant_id=tenant_id, claw_type=claw_type or "web")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def get_route_ctx() -> dict:
|
||||
|
||||
Reference in new issue
Block a user