可观测性数据采集原理:Agent、采样、Sidecar 模式归纳总结

聊到数据采集,很多人第一反应是“装个 Agent 不就完事了?”其实没那么简单。尤其是在加密链路里,流量被层层封装,签名、密钥交换、加密隧道……你要是不把采集点放对位置,收上来的全是噪声。我自己这几年踩过的坑,几乎都出在“采集”这一步。所以这一章,我把 Agent、采样、Sidecar 这三种模式拆开揉碎讲清楚。你想想看,弄懂了它们各自的脾气,才能搭出真正可靠的观测管道。

1. Agent 模式 – 轻量级数据采集

Agent 模式是最常见的做法,说白了就是在每台机器或每个容器里跑一个常驻进程,负责读日志、抓指标、收链路。我习惯把它叫做“搬运工”——不管你上面跑的是什么业务,Agent 只管从本地的文件、socket、proc 里拿数据,然后发给后端。

适用场景: 传统的服务器监控、日志采集,比如 Filebeat、Telegraf 这类。部署简单,改配置文件就行。

优点: 对业务代码零侵入,运维也可以完全控制采集节奏。我在项目中遇到过最极端的例子:生产环境不允许改容器镜像,但又要快速加监控。Agent 外挂模式两天就上线了。

缺点: 数据先落盘再采集,延迟高;采集点在应用外部,拿不到进程内部的上下文细节(比如内存里的 trace ID)。加密链路里,Agent 能看到报文大小、频率,但解密后的 payload 内容它碰不到。

所以我的建议是:Agent 模式适合做“粗粒度”的指标和日志,不适合做全链路的分布式追踪。除非你在 Agent 里嵌入了 eBPF,那又是另一套玩法了。

2. 采样 – 用精度换开销

全量采集在加密链路里基本行不通。数据量太大,网络、存储、计算都会爆炸。采样的核心思想很简单:只保留一部分可代表全貌的数据。

常见的采样策略有四种:

策略 工作原理 典型场景
固定率采样 每 N 条取 1 条,比如 10% 对延迟不敏感,成本优先
自适应采样 根据吞吐量动态调整比率 流量波动大的系统
头采样 请求入口处就决定是否跟踪 需要保证低概率错误能捕获
尾采样 请求结束后根据结果(如错误、慢)决定是否保留 高价值链路分析

我曾经犯过一个错误:在加密网关里用固定率采样,结果所有出错的请求都集中在低风险用户上,运维团队复盘时完全找不到规律。后来改了尾采样 + 错误率触发条件,才真正把问题暴露出来。

避坑指南: 链路上有多个采集点,采样策略必须一致。否则一个请求到了网关被采样,到了微服务又被丢弃,trace 就断了。我在一个跨集群加密通信项目里遇到过这种“半截链路”,排查了整整两天才发现是采样策略没对齐。

3. Sidecar 模式 – 与业务解耦

Sidecar 模式在云原生里已经是标配。它不是独立进程,而是作为一个独立的容器和业务容器共享一个 Pod。换句话说,业务的网络流量先经过 Sidecar,Sidecar 再转发到业务进程。这样一来,采集、限流、TLS 卸载都可以在 Sidecar 里完成。

我最早接触 Sidecar 是在 Istio 的 Envoy 里,后来自己用 Go 写了一个轻量的加密流量观测 Sidecar。体会最深的是:解耦得彻底,但复杂度也高。

优点:

  • 采集逻辑和业务代码完全分离,更新 Sidecar 不用改业务镜像。
  • 可以拿到网络层的原始流量(包括加密握手阶段的数据包),适合做 SSL/TLS 指标分析。
  • Sidecar 能注入自定义的 trace header,实现全链路透传。

缺点:

  • 每次请求多经过一层代理,延迟增加 1-5ms(加密链路里更明显)。
  • 管理 Sidecar 的版本、配置、资源消耗本身就是运维痛点。
  • Sidecar 本身也可能出错,需要单独的可观测性——哦,这就套娃了。
经验点: 如果只是做可观测性采集,没必要用完整的 Istio Sidecar。我通常会选 Envoy 的直接模式(只做流量复制),或者干脆自己写一个小型的 flow mirror proxy,这样资源开销能降低 70%。

4. 模式对比与选型建议

三种模式并不是互斥的。实际项目中,我经常混合使用:Agent 收基础指标,尾采样收高价值 trace,Sidecar 做加密流量中继和额外标注入。你把它们放在一起对比,选型思路就清晰了。

数据采集模式架构对比 应用进程 Agent 进程 业务容器 Sidecar 容器 采样决策点 后端存储 Agent 模式:独立进程采集 对业务零侵入,但延迟高 Sidecar 模式:同 Pod 网络代理 解耦彻底,增加 1-5ms 延迟 采样:精度与开销的平衡 尾采样适合高价值链路

上面这张图从左到右展示了三种模式的典型拓扑。你可以看到:Agent 和应用是平级关系,Sidecar 在流量路径中间,采样则是一个独立决策节点。我在项目里会用类似的分层设计——底层 Agent 收基础指标,中间 Sidecar 做加密流量上下文注入,最后采样按需裁切数据量。

5. 选型核心原则

  • 加密链路优先考虑 Sidecar:因为解密、签名验证等操作需要与请求同步,Sidecar 能拿到完整报文。
  • 采样策略必须端到端一致:否则 trace 分裂,根本汇聚不起来。
  • Agent 适合批量日志和指标:别用它做链路追踪,尤其是跨服务场景。
  • 不要迷信全量:加密链路的数据量放大倍数很高,采样不是选项,是必选项。
一个小技巧: 如果你用 OpenTelemetry Collector,可以同时启动两个 pipeline——一个从 Agent 收基础数据,另一个从 Sidecar 收链路数据,然后在 Collector 里做采样合并。我自己的生产环境就是这么搭的,跑了一年多还算稳。

嗯,关于数据采集这部分,核心就这些。Agent、采样、Sidecar 三者的组合,占了我过去三年 80% 的可观测性架构设计。每次做新链路加密项目,我都是先从这三点画草图,然后再往里填细节。希望对你也一样管用。