3. OpenTelemetry 协议:OTel 数据模型与采集架构

分布式追踪值班台的数据源头是 OpenTelemetry(OTel)。作为 CNCF 的观测性标准,OTel 统一了指标、日志、链路(Traces)的采集与传输协议。本章聚焦 OTel 的 数据模型 与 采集架构,这是构建值班台看板的数据基础。

3.1 OTel 数据模型核心概念

OTel 将观测数据抽象为三种信号(Signal):Traces、Metrics、Logs。值班台最关注 Traces,但 Metrics 和 Logs 的关联分析同样关键。

信号类型 核心数据结构 值班台用途
Traces Span(跨度) 请求链路追踪、延迟分析、错误定位
Metrics DataPoint(数据点) 服务吞吐、延迟分布、错误率聚合
Logs LogRecord(日志记录) 异常上下文、事件关联、审计

3.2 Span 数据模型详解

Span 是 Traces 的最小单元,每个 Span 代表一个操作片段。一个完整的 Trace 由多个 Span 通过 TraceId 和 ParentSpanId 构成有向无环图(DAG)。

字段 说明 值班台看板字段映射
TraceId 全局唯一追踪 ID,16 字节 看板过滤、链路关联
SpanId 当前 Span 唯一 ID,8 字节 看板节点标识
ParentSpanId 父 Span ID,根 Span 为空 构建调用树
Name 操作名称,如 HTTP GET /api/order 看板服务/端点标签
Kind Span 角色:CLIENT、SERVER、INTERNAL、PRODUCER、CONSUMER 区分调用方向
StartTime / EndTime 开始与结束时间戳 延迟计算、火焰图
Status OK / ERROR / UNSET 错误率、错误链路高亮
Attributes 键值对元数据(K/V) 自定义维度过滤
Events 带时间戳的注解事件 异常堆栈、关键日志
值班台关键字段: 在 Grafana 看板中,TraceId 用于跳转到 Tempo 链路详情页;Status 用于着色(红/绿);Duration(EndTime - StartTime)用于延迟分布直方图。

3.3 OTel 采集架构:从 SDK 到后端

OTel 的采集架构分为三层:应用内 SDK → OTel Collector → 后端存储/分析。值班台的数据流必须经过 Collector 进行采样、过滤和路由。

OTel 采集架构:从 SDK 到值班台 应用服务 A OTel SDK (Java/Go/Python) 应用服务 B OTel SDK (Node.js/Rust) 应用服务 C OTel SDK (C++/.NET) OTel Collector Receivers → Processors → Exporters 采样 / 过滤 / 批处理 / 重试 Grafana Tempo Prometheus / Mimir Loki / Elasticsearch
架构要点: Collector 是值班台数据管道的核心枢纽。建议在生产环境部署 Collector 集群(Deployment 模式),并配置 Tail-Based Sampling 以保留高价值错误链路,同时降低存储成本。

3.4 OTLP 协议:gRPC 与 HTTP 传输

OTel 使用 OTLP(OpenTelemetry Protocol) 作为默认传输协议,支持 gRPC 和 HTTP/JSON 两种方式。值班台场景下,gRPC 是首选,因为其二进制编码效率高、流式传输延迟低。

传输方式 端口 编码 适用场景
gRPC 4317 Protobuf(二进制) 生产环境、高吞吐、低延迟
HTTP/JSON 4318 JSON(文本) 调试、浏览器端、受限网络
# OTLP gRPC 配置示例(Collector 端)
receivers:
  otlp:
    protocols:
      grpc:
        endpoint: 0.0.0.0:4317
      http:
        endpoint: 0.0.0.0:4318

exporters:
  otlp:
    endpoint: tempo.example.com:4317
    tls:
      insecure: false
    compression: gzip

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch, memory_limiter]
      exporters: [otlp]

3.5 资源与属性:看板维度注入

OTel 通过 Resource 和 Attributes 携带上下文信息。Resource 描述产生数据的实体(如 Pod、Node、Cluster),Attributes 描述 Span 的细节(如 HTTP 方法、状态码)。

维度类型 示例 值班台看板用途
Resource service.name, k8s.pod.name, host.name 服务级过滤、Pod 级下钻
Span Attributes http.method, http.status_code, db.system 端点延迟、错误码分布
Semantic Conventions OTel 定义的标准化属性名 跨语言统一查询
避坑提示: 不要在 Attributes 中注入高基数(High Cardinality)字段,如 user_id、request_id。这会导致 Tempo 索引膨胀、查询性能下降。高基数信息应放在 Span Events 或关联日志中。

3.6 采样策略:值班台数据质量控制

全量采集所有 Trace 在规模化场景下不可行。OTel Collector 支持多种采样策略,值班台看板的数据质量取决于采样策略的合理性。

OTel 采样策略对比 Head-Based Sampling 在 SDK 端决策 固定比例(如 10%) 低开销,但可能丢失错误链路 Tail-Based Sampling 在 Collector 端决策 保留错误 + 慢链路 高价值,但内存开销大 Probabilistic Sampling 基于 TraceId 哈希 一致性采样 适合跨服务关联 值班台推荐:Tail-Based 建议:错误链路 100% 采样 + 正常链路 5% 采样,平衡成本与可观测性
值班台最佳实践: 在 Collector 中配置 tail_sampling 策略,对 status.code = ERROR 的 Span 设置 sampling_percentage = 100,对正常 Span 设置 sampling_percentage = 5。这样看板中的错误链路始终完整,而正常链路仅保留代表性样本。

3.7 数据模型与看板字段映射

理解 OTel 数据模型后,需要将其映射到 Grafana 看板的查询字段。以下为 Tempo 数据源中的典型映射关系:

OTel 字段 Tempo 查询语法 看板面板示例
service.name {resource.service.name="order-service"} 服务下拉过滤器
http.method {span.http.method="POST"} 端点延迟表格
status.code {span.status.code="ERROR"} 错误率时间序列
duration {span.duration > 1000000}(单位:μs) 慢链路告警
// Grafana Tempo 查询示例:过去 1 小时错误链路 Top 10
{
  "query": "{resource.service.name=\"payment-service\" && span.status.code=\"ERROR\"}",
  "limit": 10,
  "start": "now-1h",
  "end": "now"
}