OpenTelemetry Collector 生产架构与容量治理

OpenTelemetry Collector 的价值不是“把数据转发到后端”,而是在应用与可观测性平台之间建立统一的接入、处理、采样、脱敏、路由和限流层。生产环境中,如果 Collector 的拓扑、队列和容量设计不当,它也会成为新的单点或数据丢失源。

本文作为 OpenTelemetry 入门之后的进阶篇,重点讨论 Agent、Gateway、尾部采样、高可用、容量估算、背压和故障处理。

一、Collector流水线

Collector 配置由四类组件组成:

Receiver → Processor → Exporter
              ↑
          Extensions
  • Receiver:接收 OTLP、Prometheus、Jaeger、Zipkin、日志等;
  • Processor:批处理、内存保护、采样、过滤、属性变换;
  • Exporter:发送到后端;
  • Extension:健康检查、认证、持久化队列等辅助能力。

只有在 service.pipelines 中引用的组件才会真正启用。

二、Agent、Gateway与组合模式

Agent模式

每台主机或每个 Kubernetes 节点部署一个 Collector,常用 DaemonSet。

优点:

  • 靠近数据源;
  • 可采集主机和容器日志;
  • 减少应用直接管理后端地址;
  • 节点故障影响范围有限。

缺点:

  • 配置实例多;
  • 不适合需要全局视角的尾部采样;
  • 每个节点都有资源开销。

Gateway模式

应用或 Agent 把数据发送到集中 Collector 服务。

优点:

  • 集中管理凭据和策略;
  • 便于跨环境路由;
  • 可集中采样和脱敏;
  • 后端连接数量更少。

缺点:

  • 需要高可用和容量治理;
  • 增加一跳延迟;
  • 故障可能影响较大范围。

Agent + Gateway

常见生产架构:

应用SDK
  → 节点Agent
      → 一级Gateway负载均衡
          → 二级Gateway采样/处理
              → 指标、日志、追踪后端

节点 Agent 做资源补充、轻量过滤和本地采集;Gateway 做路由、采样、凭据和集中治理。

三、一份基础配置

receivers:
  otlp:
    protocols:
      grpc:
      http:

processors:
  memory_limiter:
    check_interval: 1s
    limit_mib: 1024
    spike_limit_mib: 256
  batch:
    timeout: 5s
    send_batch_size: 8192

exporters:
  otlp/backend:
    endpoint: telemetry.example.com:4317
    sending_queue:
      enabled: true
      queue_size: 10000
    retry_on_failure:
      enabled: true

extensions:
  health_check:

service:
  extensions: [health_check]
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, batch]
      exporters: [otlp/backend]

配置顺序很重要。通常应让 memory_limiter 靠前,避免后续处理器把进程推入 OOM。

四、内存保护

Collector 在流量尖峰、后端变慢、尾部采样和大批次场景下容易积累内存。

memory_limiter 的作用是根据内存使用情况施加可重试错误和拒绝新数据,让上游发生背压,而不是让进程被 OOMKill。

配置时注意:

  • limit 必须低于容器 memory limit;
  • 为 Go Runtime、队列和瞬时峰值留出空间;
  • spike limit 不能过大;
  • 上游 SDK 或 Agent 必须有重试和退避;
  • 持续超限说明容量或后端存在问题,不能只提高阈值。

五、批处理

batch processor 可减少网络请求和后端写入开销,但会增加短暂延迟和内存占用。

需要平衡:

  • send_batch_size;
  • send_batch_max_size;
  • timeout;
  • 单条遥测大小;
  • 后端最大请求大小;
  • 可接受延迟。

批次过大可能造成单次导出超时,批次过小会增加 CPU 和连接压力。

六、队列、重试与背压

Exporter 发送队列用于吸收短暂后端故障。队列不是无限缓存。

容量估算:

可缓冲时间 ≈ 队列可容纳数据量 ÷ 每秒输入数据量

需要明确:

  • 队列单位是批次还是请求;
  • 单批平均大小;
  • 后端最长可接受故障时间;
  • 内存队列还是持久化队列;
  • 队列满后的丢弃行为;
  • 重试上限和退避。

如果希望跨进程重启保留数据,可评估 file storage 扩展,但要治理磁盘容量、I/O 和损坏恢复。

七、尾部采样

头部采样在请求开始时决定是否采集,简单且成本低;尾部采样需要等待完整 Trace,能够保留错误、慢请求和特定业务,但资源成本更高。

常见策略:

  • 保留所有错误 Trace;
  • 保留超过阈值的慢请求;
  • 保留特定租户或接口;
  • 对普通成功请求概率采样;
  • 始终保留少量基线样本。

尾部采样必须确保同一 Trace 的所有 Span 到达同一个采样 Collector。可使用按 Trace ID 路由的 load-balancing exporter 构建两级 Gateway。

需要监控:

  • 等待中的 Trace 数;
  • 决策超时;
  • 被采样和丢弃数量;
  • 内存;
  • 缺失 Span;
  • 路由不一致。

八、指标的单写者原则

多个 Gateway 同时处理并输出相同指标流,可能产生乱序、重置和重复。

常见解决方式:

  • 为资源和实例提供全局唯一标识;
  • 使用一致路由;
  • 避免多个 Agent 重复抓取同一 Prometheus target;
  • 明确 cumulative 与 delta 的转换位置;
  • 验证后端的乱序策略;
  • 对 Collector 副本扩缩容做指标连续性测试。

出现 unexplained gaps、jumps 或 out-of-order samples 时,要检查是否存在多个写者。

九、资源属性治理

资源属性决定可观测数据能否关联和检索。

建议统一:

  • service.name;
  • service.namespace;
  • service.instance.id;
  • deployment.environment.name;
  • 集群、区域、可用区;
  • Kubernetes namespace、pod、node;
  • 版本和发布批次。

不要把用户ID、订单号等高基数字段无差别放入指标标签。属性规范应由平台统一管理。

十、Kubernetes部署

Agent DaemonSet

适合主机指标、容器日志和节点级接收。需要限制 hostPath、权限和 ServiceAccount。

Gateway Deployment

适合水平扩展和统一入口。配置:

  • 多副本;
  • PodAntiAffinity 或 topology spread;
  • PDB;
  • requests/limits;
  • HPA;
  • 就绪和存活探针;
  • 内部负载均衡;
  • 优雅终止。

StatefulSet

当使用本地持久化队列或需要稳定身份时可评估,但要明确卷恢复和扩缩容行为。

十一、容量估算

先采集真实数据:

  • 每秒 Span、Metric Point、Log Record;
  • 单条平均与 P95 大小;
  • 批次大小;
  • Processor CPU 成本;
  • Exporter 延迟;
  • 峰值倍数;
  • 尾部采样等待量。

简化估算:

入口带宽 = 每秒记录数 × 平均记录大小
处理能力余量 = 峰值入口 ÷ 单副本稳定处理能力
所需副本 = 向上取整(峰值入口 ÷ 单副本安全能力)

单副本安全能力应来自压测并保留 30%~50% 余量,而不是使用实验室极限值。

十二、HPA指标选择

只按 CPU 扩缩容可能来不及应对突发流量。可考虑:

  • CPU;
  • 内存;
  • receiver 接收速率;
  • exporter 队列占用;
  • 导出失败率;
  • 处理延迟。

扩容也不是无限的。后端已经过载时继续增加 Gateway,可能放大后端压力。需要联合限流、采样和降级。

十三、过载保护与降级

定义分级策略:

  1. 正常:完整采集;
  2. 高负载:提高普通成功 Trace 的采样率;
  3. 后端变慢:保留错误和慢请求,减少低价值数据;
  4. 严重过载:限制入口、保护 Collector 和核心后端;
  5. 恢复:逐步恢复策略,避免瞬时补发洪峰。

日志、指标和追踪的优先级不同。一般不应为了保留低价值调试日志而丢失核心告警指标。

十四、安全与隐私

  • OTLP 入口启用 TLS 和认证;
  • Collector 到后端使用短期凭据;
  • 不在配置文件明文保存长期密钥;
  • 限制 Collector ServiceAccount;
  • 过滤密码、Token、Cookie 和个人信息;
  • 对跨租户数据增加隔离和路由;
  • 记录配置变更审计;
  • 对外暴露的 receiver 设置网络策略。

脱敏要在数据离开受控边界前完成,并对规则误删和漏删进行测试。

十五、Collector自身可观测性

至少监控:

  • receiver accepted/refused;
  • processor dropped;
  • exporter sent/failed;
  • queue size/capacity;
  • retry;
  • process CPU、内存和 GC;
  • 配置加载失败;
  • 健康检查;
  • 每条 pipeline 的吞吐和延迟。

Collector 自身指标应进入独立、可靠的监控路径,避免主遥测链路故障时连运行状态也看不到。

十六、常见故障

内存持续上升

检查尾部采样等待量、发送队列、后端延迟、batch、异常大日志和高基数属性。不要直接无限提高 memory limit。

Trace不完整

检查采样位置、传播头、Trace ID 路由、Collector负载均衡、超时和 SDK flush。

指标乱序

检查重复抓取、多 Gateway 写入同一指标流、累计值转换和实例标识。

后端恢复后Collector仍丢数据

检查队列是否已满、重试是否超过时间、持久化存储是否可写,以及恢复时后端是否承受补发流量。

配置更新导致全部副本重启

对配置进行静态校验,采用滚动更新和金丝雀 Gateway,确保至少有一组旧配置实例可继续接收。

十七、变更发布流程

  1. 配置进入版本库;
  2. 执行 Collector 配置校验;
  3. 在回放流量或压测环境测试;
  4. 部署金丝雀实例;
  5. 对比数据量、丢弃率、资源和后端成本;
  6. 小批量滚动;
  7. 保留旧版本快速回退;
  8. 观察一个业务高峰;
  9. 更新容量模型和Runbook。

十八、生产检查清单

架构

  • [ ] Agent、Gateway职责明确;
  • [ ] 尾部采样使用Trace ID一致路由;
  • [ ] 指标满足单写者原则;
  • [ ] Gateway跨节点或跨区部署;
  • [ ] 后端故障有队列、重试和降级策略。

容量

  • [ ] 有真实吞吐、记录大小和峰值数据;
  • [ ] memory_limiter低于容器限制;
  • [ ] 队列可缓冲时间已计算;
  • [ ] HPA不只依赖CPU;
  • [ ] 后端过载时不会无限放大流量。

安全

  • [ ] OTLP使用TLS与认证;
  • [ ] 敏感字段在受控边界内脱敏;
  • [ ] 凭据支持轮换;
  • [ ] Collector权限最小化;
  • [ ] 配置变更可审计和回滚。

参考资料

Copyright © yan-jian.com 2023 - 2026 · Powered by GitBook更新时间: 2026-10-25 22:24:34

results matching ""

    No results matching ""