4. OpenTelemetry(OTel)基础:OTel架构、Trace/Metric/Log信号模型与采集原理

在云原生网关回滚护栏中,可观测性是决策的“眼睛”。OpenTelemetry(OTel)作为CNCF的标准化可观测性框架,统一了Trace、Metric、Log三大信号的采集与导出。本节将深入OTel的架构分层、信号模型定义以及采集器的工作原理,为后续WAF策略与OTel协同提供数据基础。

4.1 OTel整体架构分层

OTel架构采用“API → SDK → Exporter → Collector”的四层模型,每一层职责清晰,解耦了数据产生、处理与导出。

架构核心原则: 应用只需通过OTel API埋点,SDK负责采样与上下文传播,Exporter将数据推送给Collector或后端;Collector作为独立组件,提供数据过滤、聚合、重试与多后端分发能力。
OpenTelemetry 四层架构 API 层 Trace API / Metric API / Log API / Context Propagation API SDK 层 Sampling / SpanProcessor / MetricReader / LogRecordProcessor Exporter 层 OTLP Exporter / Prometheus Exporter / Console Exporter Collector 层(独立部署) Receiver → Processor → Exporter(过滤/聚合/重试/多后端)

4.2 三大信号模型与数据模型

OTel将可观测性数据抽象为三种信号(Signal),每种信号有独立的数据模型和采集路径。

信号类型 核心数据模型 主要字段 典型用途
Trace Span TraceId, SpanId, ParentSpanId, StartTime, EndTime, SpanKind, Attributes, Events, Status 请求链路追踪、依赖分析、延迟瓶颈定位
Metric DataPoint (Gauge/Sum/Histogram) Name, Value, Timestamp, Attributes, AggregationTemporality 系统负载、请求速率、错误率、P99延迟
Log LogRecord Timestamp, SeverityText, SeverityNumber, Body, Attributes, TraceId, SpanId 事件记录、错误详情、审计日志
关键关联: TraceId和SpanId可以嵌入LogRecord中,实现“日志→链路”的关联查询。在回滚护栏场景中,WAF阻断事件可以通过LogRecord携带TraceId,快速关联到被阻断的完整请求链路。

4.3 Trace信号模型详解

Trace由一组Span构成有向无环图(DAG),每个Span代表一个操作单元。Span之间通过ParentSpanId建立父子关系,形成调用链。

  • SpanKind:标识Span的角色——INTERNAL(内部方法)、SERVER(服务端接收)、CLIENT(客户端发起)、PRODUCER/CONSUMER(消息生产/消费)。
  • Attributes:键值对元数据,用于附加业务上下文,如 http.method、http.url、waf.rule_id。
  • Events:Span内的时间戳事件,适合记录异常或关键日志点。
  • Status:Unset / Ok / Error,标识操作结果。
// Span 数据模型示例(Protobuf 简化)
message Span {
  bytes trace_id = 1;
  bytes span_id = 2;
  bytes parent_span_id = 3;
  string name = 4;
  SpanKind kind = 5;
  fixed64 start_time_unix_nano = 6;
  fixed64 end_time_unix_nano = 7;
  repeated KeyValue attributes = 8;
  repeated Event events = 9;
  Status status = 10;
}

4.4 Metric信号模型详解

Metric用于聚合型数值观测,OTel定义了三种基本Instrument类型:

Instrument 语义 示例
Counter 单调递增计数(只增不减) 请求总数、错误总数
UpDownCounter 可增可减的计数 活跃连接数、队列深度
Histogram 数值分布统计 请求延迟分布、响应大小分布
Gauge 瞬时值快照 CPU使用率、内存用量
采集原理注意: Metric的聚合时间窗口(AggregationTemporality)分为 Delta(仅上报周期内增量)和 Cumulative(从进程启动开始的累计值)。在网关回滚场景中,Delta模式更适合实时检测流量突增或错误率飙升。

4.5 Log信号模型与关联

OTel Log模型兼容现有日志标准(如syslog、JSON日志),并增加了与Trace的关联字段。LogRecord不要求必须与Trace绑定,但推荐在可能的情况下填充TraceId和SpanId。

// LogRecord 数据模型示例
message LogRecord {
  fixed64 time_unix_nano = 1;
  SeverityNumber severity_number = 2;
  string severity_text = 3;
  any Value body = 4;
  repeated KeyValue attributes = 5;
  bytes trace_id = 6;   // 关联Trace
  bytes span_id = 7;    // 关联Span
}

4.6 采集原理:从应用到Collector的管道

OTel数据采集分为“应用内采集”和“Collector采集”两个阶段。

  1. 应用内采集:通过OTel SDK在进程中创建Span/Metric/LogRecord,经过Sampler(采样器)和Processor(处理器)后,由Exporter发送给Collector或后端。
  2. Collector采集:Collector通过Receiver接收数据,经过Processor链(过滤、批处理、属性修改、重试),最后由Exporter分发到多个后端(如Jaeger、Prometheus、Elasticsearch)。
OTel 数据采集管道 应用进程 OTel SDK Span / Metric / Log Sampler → Processor OTLP/gRPC OTel Collector Receiver Processor(过滤/批处理/重试) Exporter OTLP/HTTP 后端存储 Jaeger / Tempo Prometheus / Mimir Loki / Elasticsearch

4.7 采样策略与数据质量

在高并发网关场景下,全量采集Trace会产生巨大开销。OTel支持多种采样策略:

  • Head-based Sampling:在Span创建时决定是否采样,简单但无法基于完整链路信息决策。
  • Tail-based Sampling:在Collector端根据完整链路特征(如包含错误、延迟超过阈值)决定保留哪些Trace,适合回滚护栏场景中保留异常请求的完整链路。
  • Probabilistic Sampling:按固定比例随机采样,适用于低优先级指标。
回滚护栏建议: 对WAF阻断的请求使用“强制采样”(Sampling Priority = 1),确保所有安全事件链路完整保留;对正常流量使用概率采样(如1%),控制存储成本。

4.8 与WAF策略协同的OTel关键点

协同维度 OTel信号 WAF策略集成方式
请求追踪 Trace (Span) WAF中间件创建Span,记录 waf.rule_id、waf.action(block/allow)等属性
实时指标 Metric (Counter/Histogram) WAF上报 waf.requests.total、waf.blocked.total、waf.latency 指标
事件日志 Log (LogRecord) WAF阻断时输出结构化日志,携带TraceId,便于后续审计
回滚触发 Metric + Trace Collector中配置Processor,当错误率或阻断率超过阈值时,生成告警事件触发回滚