目标
移动端后端偶发 DEADLINE_EXCEEDED,但日志里只有客户端的错误码,看不出是哪一次下游调用吃掉了预算。本配方给每次 gRPC 调用设置 deadline 并写入跨度属性,在超时触发时记录事件,从而在调用链上定位慢依赖。
步骤要点
- 为每次调用设置显式 deadline,并作为跨度属性记录毫秒值。
- 在 deadline 触发时追加事件,标记相对于下游跨度的时间点。
- 检查重试逻辑是否为每次尝试单独建跨度,避免预算被合并。
- 用尾部采样保留罕见的超时调用链用于分析。
ctx, cancel := context.WithTimeout(ctx, 300*time.Millisecond)
defer cancel()
span.SetAttributes(attribute.Int64("rpc.deadline_ms", 300))
resp, err := client.GetFeed(ctx, req)
排错提示
- 重试会折叠进同一预算,必须为每次尝试建独立跨度。
- 服务端若不尊重传入的 deadline,会返回取消而不是超时。
- 均匀采样会漏掉稀有的超时调用。
适用边界
- 依赖追踪基础设施,否则只能看到客户端状态码。
- 只负责定位慢依赖,不负责修复它。