Skip to content

日志、指标、Trace 与身份关联 ​

日志解释一件事发生了什么,指标描述一批事件的分布,trace把一次请求跨模型、检索、工具和队列的因果链连接起来。三者不能互相替代:最终回答无法解释哪次工具重试导致延迟,平均延迟无法定位具体请求。

从span构造一条因果链 ​

标准库完整实验,时间为人工输入的毫秒,检验关联规则,不声称测量真实性能。

python
spans=[{"id":"run","parent":None,"start":0,"end":100},
       {"id":"retrieve","parent":"run","start":5,"end":25},
       {"id":"model","parent":"run","start":25,"end":90},
       {"id":"tool","parent":"model","start":40,"end":60}]
by_id={s["id"]:s for s in spans}
assert len(by_id) == len(spans)
for s in spans:
    assert s["end"] >= s["start"]
    if s["parent"]:
        p=by_id[s["parent"]]
        assert p["start"]<=s["start"]<=s["end"]<=p["end"]
assert by_id["run"]["end"]-by_id["run"]["start"] == 100
print([(s["id"],s["end"]-s["start"]) for s in spans])

子span时间包含在父span内,所以把100+20+65+20相加不是请求总耗时。真实跨进程时钟可能偏移,用平台trace语义与本地单调时钟测duration,不简单依靠墙钟相减。并行分支的用户等待接近关键路径,不是所有分支时长之和。

ID与版本分别指向什么 ​

request ID定位一次传输,conversation ID定位会话,run/task ID定位任务,tool_call ID关联一次模型工具请求,trace/span ID表达观测因果。一次任务可能跨多个HTTP请求与worker,不能每次重连就失去原task ID。模型、prompt、工具、schema与索引版本用于重放与归因。

日志保存event、状态、错误码与关联ID;指标采用有限标签,如模型族、操作和错误类别,不能把用户ID或完整prompt作为指标标签造成高基数。队列长度、连接池、CPU与内存解释系统瓶颈,token、首token、停止原因解释模型行为,审批、checkpoint与效果状态解释应用行为。

采样全量最易排障但昂贵且扩大数据暴露;头部采样在开始决定,尾部采样可优先保留错误/慢请求但需要缓冲。采样trace不能直接当总请求数,核心计数器独立统计。旧式纯文本日志维护时先加入稳定task ID与event字段,再接观测平台,避免只有供应商内部ID无法关联业务。

练习 ​

向spans加入父ID不存在的孤儿节点,校验应报告ValueError("orphan");重复span ID也应拒绝,不能被字典覆盖。

核对本章答案

下一章

用心记录每一步成长