← 中文资源

简体中文版本

抓取 gRPC DEADLINE_EXCEEDED 调用链

为 gRPC 客户端注入 OpenTelemetry 跨度与 deadline 预算,把超时错误定位到真正拖慢调用的下游依赖。

阅读英文原文

目标

移动端后端偶发 DEADLINE_EXCEEDED,但日志里只有客户端的错误码,看不出是哪一次下游调用吃掉了预算。本配方给每次 gRPC 调用设置 deadline 并写入跨度属性,在超时触发时记录事件,从而在调用链上定位慢依赖。

步骤要点

  1. 为每次调用设置显式 deadline,并作为跨度属性记录毫秒值。
  2. 在 deadline 触发时追加事件,标记相对于下游跨度的时间点。
  3. 检查重试逻辑是否为每次尝试单独建跨度,避免预算被合并。
  4. 用尾部采样保留罕见的超时调用链用于分析。
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,会返回取消而不是超时。
  • 均匀采样会漏掉稀有的超时调用。

适用边界

  • 依赖追踪基础设施,否则只能看到客户端状态码。
  • 只负责定位慢依赖,不负责修复它。