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,可能放大后端压力。需要联合限流、采样和降级。
十三、过载保护与降级
定义分级策略:
- 正常:完整采集;
- 高负载:提高普通成功 Trace 的采样率;
- 后端变慢:保留错误和慢请求,减少低价值数据;
- 严重过载:限制入口、保护 Collector 和核心后端;
- 恢复:逐步恢复策略,避免瞬时补发洪峰。
日志、指标和追踪的优先级不同。一般不应为了保留低价值调试日志而丢失核心告警指标。
十四、安全与隐私
- 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,确保至少有一组旧配置实例可继续接收。
十七、变更发布流程
- 配置进入版本库;
- 执行 Collector 配置校验;
- 在回放流量或压测环境测试;
- 部署金丝雀实例;
- 对比数据量、丢弃率、资源和后端成本;
- 小批量滚动;
- 保留旧版本快速回退;
- 观察一个业务高峰;
- 更新容量模型和Runbook。
十八、生产检查清单
架构
- [ ] Agent、Gateway职责明确;
- [ ] 尾部采样使用Trace ID一致路由;
- [ ] 指标满足单写者原则;
- [ ] Gateway跨节点或跨区部署;
- [ ] 后端故障有队列、重试和降级策略。
容量
- [ ] 有真实吞吐、记录大小和峰值数据;
- [ ] memory_limiter低于容器限制;
- [ ] 队列可缓冲时间已计算;
- [ ] HPA不只依赖CPU;
- [ ] 后端过载时不会无限放大流量。
安全
- [ ] OTLP使用TLS与认证;
- [ ] 敏感字段在受控边界内脱敏;
- [ ] 凭据支持轮换;
- [ ] Collector权限最小化;
- [ ] 配置变更可审计和回滚。
参考资料
- OpenTelemetry:Collector Deployment Patterns
https://opentelemetry.io/docs/collector/deploy/ - OpenTelemetry:Gateway Deployment Pattern
https://opentelemetry.io/docs/collector/deploy/gateway/ - OpenTelemetry:Collector Configuration
https://opentelemetry.io/docs/collector/configuration/ - OpenTelemetry Collector Contrib
https://github.com/open-telemetry/opentelemetry-collector-contrib