模块化代理绑定需固化“谁报错、在哪报、因何报、传给谁”四要素:统一注入异常上下文、错误分类映射、链路断点自动补全、前端可追溯代理快照。

模块化代理绑定不是加个中间件就完事,关键在于让每个代理单元在异常发生时,既不掩盖原始上下文,也不丢失传播路径。核心是把“谁报错、在哪报、因何报、传给谁”这四个信息固化进统一监控体系的结构里。
代理层统一注入异常上下文
每个代理模块(如HTTP客户端、数据库驱动、AI工具调用器)启动时,必须从父级上下文继承trace_id、span_id和当前执行节点标识。不能靠日志打点拼凑,而要通过显式上下文传递:
- Go中用
context.WithValue(ctx, key, value)注入agent_id和step_name - Python中用
contextvars存储当前代理类型与版本号,避免线程污染 - 所有代理的错误构造函数强制接收原始error,并通过
raise ... from e或errors.WithStack()保留底层堆栈
异常分类映射表驱动归因
不同代理模块产生的错误语义不同,但监控系统需要统一识别。需建立轻量级映射表,将各模块原生错误转为标准异常类型:
- 数据库代理抛出
pq.Error→ 映射为DB_CONNECTION_FAILURE+ 补充sql_state字段 - LLM工具调用返回
429→ 归类为TOOL_RATE_LIMITED,并携带retry_after值 - 缓存代理超时 → 标记为
CACHE_UNAVAILABLE,同时记录cache_key_prefix用于聚类分析
链路断点自动补全机制
当某代理未按约定上报异常(如第三方SDK静默失败),监控系统需主动补全断点:
- 基于OpenTelemetry Span的
parent_span_id缺失检测,触发“隐式断点”标记 - 对超时未结束的Span,自动注入
span.SetStatus(codes.Error, "no error reported") - 结合指标(如gRPC
grpc_client_handled_total)与日志缺失比,判定是否需回溯上游代理行为
前端可追溯的代理快照
监控平台展示异常链时,不应只呈现堆栈文本,而要还原每个代理模块当时的决策快照:
- 显示该代理启用的重试策略(如“指数退避,最大3次,base=1s”)
- 列出其实际使用的配置项(如“fallback_model: claude-haiku-2024”)
- 标注代理间数据流转状态(如“输入JSON schema校验通过,输出字段
items[].price为空”)











