Span Kind 是什么
Span Kind 标注 span 在调用链中的角色:server 表示接收并处理请求,client 表示发起对外调用,producer 表示发送消息,consumer 表示消费消息,internal 表示进程内逻辑。server 与 client 成对接起一次跨进程调用,producer 与 consumer 描述异步消息流。Kind 与语义化命名配合,能让链路图直接看出「谁调谁」,排障时按 Kind 过滤客户端 span 就能看被调服务的真实耗时。
基本信息
| 取值 | server、client、producer、consumer、internal |
|---|---|
| 规范来源 | OpenTelemetry Trace 规范 |
| 默认值 | 未设置时通常按 internal 处理或由 SDK 推断 |
| 配合属性 | http.request.method、rpc.method、messaging.system 等 |
| 权限要求 | 应用埋点配置,无额外系统权限 |
典型使用场景
- 服务端耗时:过滤 server span 看接口自身处理时间,排除下游影响
- 下游定位:按 client span 的属性排序,找到耗时最高的依赖
- 异步链路:用 producer 与 consumer 描述生产与消费,识别积压环节
- 内部细分:用 internal span 标记缓存、序列化等关键内部步骤
- 采样控制:对不同 Kind 配置不同采样率,保留有诊断价值的调用
使用要点
- 一次跨进程调用会同时产生 client 与 server 两个 span,两者互为对照
- 消息场景下 producer 与 consumer 不在同一 trace 树内,需用链接或关联字段串起
- 全用 internal 会让链路图失去调用边界,Kind 要按真实语义设置
- 命名与 Kind 一起规范,例如 HTTP 服务端使用「方法加路由」的形式
- 采样策略按 Kind 区分,避免把进程内噪声全量保留到后端
消息链路要点
消息链路要点
producer span 在发送消息时结束记录;
consumer span 在消费时新建,二者通过 span link 关联。
# 服务端与客户端成对出现,排障时先对齐这两个 span 的时间。
# 若只看到一个方向,通常是其中一侧没埋点或采样策略覆盖不到。五类 Kind
| Kind | 含义 | 典型场景 |
|---|---|---|
| server | 接收并处理请求 | HTTP 或 RPC 服务端处理 |
| client | 发起对外调用 | 调用下游服务、访问数据库 |
| producer | 发送消息 | 向消息队列生产消息 |
| consumer | 消费消息 | 从消息队列消费并处理 |
| internal | 进程内操作 | 本地计算、缓存读写、序列化 |
Kind 只有配合语义化命名才有价值:只有 Kind 而没有规范命名时,链路图仍然要靠猜来判断哪一段对应哪个业务动作。