目录
一、APM核心定义与两大核心数据体系
1.1 APM基础概念
1.2 Metrics(指标数据)核心定义与分类
1.3 Trace & Span(链路追踪)核心定义
二、APM全链路架构
2.1 组件讲解
2.1.1. 探针(Agent / SDK)
1)SDK(代码埋点)
2)Agent(无侵入探针)
3)eBPF(Extended Berkeley Packet Filter,扩展伯克利包过滤器)
eBPF 探针采集原理
eBPF 探针能采集什么
eBPF 探针短板(非常关键,不能神话 “零侵入万能”)
eBPF 可观测主流开源组件
2.1.2.Collector(采集器)
2.1.3.APM 后端(存储 + 计算层)
2.1.3.1 Metrics 指标后端(时序存储)
2.1.3.2 Trace 链路后端
2.1.3.4. 展示器(UI 可视化层)
2.1.4 概念速查表
2.1.5 常见误区澄清
2.2 Collector核心能力(核心五大功能)
2.3 三大主流开发语言采集方案适配对比
2.3.1 Java语言
2.3.2 Go语言
2.3.3 C++语言
三、APM行业厂商演进:闭源传统厂商到开源云原生体系
3.1 传统闭源商业APM(初代行业方案)
核心架构
核心特点
现状与市场萎缩原因
3.2 国产开源一体化APM:Apache SkyWalking
核心架构
核心核心组件OAP释义
优缺点总结
3.3 国际开源标准体系:OTel + Prometheus + Grafana 生态
组件分工
四、现代两大主流APM架构体系深度对比
4.1 架构一:SkyWalking一体化架构
完整链路
适用场景
核心优势
核心短板
4.2 架构二:CNCF标准LGTM架构(OTel+Mimir+Tempo+Grafana)
完整链路
适用场景
核心优势
核心短板
4.3 架构三:单机简易原型架构(小集群、测试环境)
五、主流存储方案选型:彻底告别ClickHouse+ES传统架构
5.1 传统架构:ClickHouse + ES
5.2 现代替代方案对比
六、行业大厂选型现状与底层逻辑
6.1 海外大厂
6.2 国内大厂选型两极分化
6.3 招聘技术栈底层逻辑
七、全文总结与选型终极建议
一、APM核心定义与两大核心数据体系
1.1 APM基础概念
如果我们写了一简单小程序,那么自己单元测试,压力测试,日志记录一下异常和耗时可能就够用了,但是当系统足够复杂的时候,就需要有一整套系统来监测整体运行情况。这包括服务器本身,也包括了各种应用以及业务运行状态等。
APM(Application Performance Monitoring,应用性能监控)是云原生、微服务架构下的核心可观测基础设施,核心目标是实现分布式应用的性能追踪、故障定位、指标告警与服务治理。微服务架构下,一次用户请求会跨数十个服务、中间件、数据库、网关,传统监控完全无法追踪调用链路。
APM的核心价值,就是打通应用层、服务层、基础设施层的全维度观测数据,实现从“大盘发现异常”到“精准定位代码级瓶颈”的全流程闭环,是互联网企业、云服务商、政企系统稳定性保障的核心底座。
完整的现代可观测体系包含Metrics(指标)、Trace(链路追踪)、Logs(日志)三大支柱,其中Metrics与Trace是APM的核心骨架,日志作为辅助排查手段,三者互补构成完整观测能力。
1.2 Metrics(指标数据)核心定义与分类
Metrics是结构化、可聚合、时序化的数值数据,用于统计系统、服务、业务的长期运行趋势,是告警、大盘观测、容量评估的核心依据,具备写入轻、存储量小、可预聚合、适合统计分析的特点。
Metrics的本质是对系统状态的量化快照,不记录单次请求细节,只输出聚合统计结果,生产中分为四大标准数据模型:
Counter计数器:只递增不递减,用于统计总请求数、错误数、丢包数、接口调用总次数;

Gauge仪表盘:实时瞬时值,可升可降,用于监控CPU使用率、内存占用、goroutine数量、在线用户数;

Histogram直方图:统计数据分布,核心用于计算接口延迟P50/P95/P99、IO耗时分布,是性能优化的核心指标;

Summary摘要:直接输出分位数结果,多用于轻量化场景,生产使用率低于Histogram。
从业务维度划分,Metrics可分为三层:
-
基础设施指标:服务器CPU、内存、磁盘IO、网络流量、TCP连接数、负载、文件句柄数;比如Prometheus + Grafana,面板包含 Gauge 类型的 CPU、内存使用率;Counter 衍生的网络收发速率;Histogram 磁盘 IO 延迟:

-
中间件指标:比如向量数据库(Qdrant)、检索引擎(Meilisearch)、大模型服务(Ollama)的QPS、延迟、错误率、并发数;
-
业务自定义指标:比如,RAG检索成功率、Embedding调用耗时、LLM Token吞吐、工具调用次数、业务报错计数器。
1.3 Trace & Span(链路追踪)核心定义
Trace是单次用户请求在分布式系统中的完整调用轨迹,由全局唯一TraceID串联所有调用节点,记录请求从入口到结束的全流程路径、耗时、报错信息、调用参数。
Span是Trace的最小执行单元,代表一次具体的操作,比如HTTP请求、数据库查询、缓存读取、内部函数调用、RPC调用。一条完整的Trace由多个父子嵌套的Span组成,形成有向无环的调用树,精准记录每一步操作的耗时与异常。
Trace 标准可视化形式为瀑布图(Waterfall):横轴代表时间,横向条块代表 Span,条块长度代表耗时;缩进代表父子调用层级;不同颜色区分不同服务;红色标记异常报错 Span。下面分别展示 Jaeger 与 SkyWalking 的典型界面。
Jaeger 链路示例界面(开源经典 Trace 实现,Tempo 也兼容 Jaeger UI)

Jaeger Trace 详情瀑布图说明:
顶部:Trace 总耗时、TraceID、这条链路一共包含多少个 Span;
左侧列表:服务、操作名称,层级缩进表达父子调用关系;
中间主区域:时间轴瀑布条,横向长度 = Span 耗时;不同颜色代表不同服务;
点击任意 Span 条,可以展开查看 tags 标签、http 状态码、异常堆栈、事件日志;
报错的 Span 会高亮红色。
Jaeger 搜索列表页:可以按服务名、耗时区间、错误 tag 筛选 Trace 列表,再点进去查看完整瀑布。

Jaeger 的特点:UI 完全围绕 Trace 模型设计,不内置指标大盘;可以对接 Mimir/Prometheus 提供 Metrics 告警;存储后端可以用 ES、Cassandra,现在更多搭配 Tempo 做存储。
Apache SkyWalking Trace 示例界面(国内主流 APM)

同样是瀑布图,横轴时间轴,缩进代表调用父子层级;异常 Span 标红;
SkyWalking 独有概念 Segment:同一个进程 / 服务内的一组 Span 集合;一条 Trace 会由多个 Segment 拼接而成(跨多服务);
支持三种视图切换:
-
Default:瀑布时序视图(最常用);
-
Tree:调用树拓扑图,弱化时间,突出调用关系;
-
Statistics:对该 Trace 内所有 Span 做聚合统计,统计各操作最大、平均耗时;
点击 Span 可以看到组件类型(MySQL、Redis、Dubbo、HTTP)、参数、异常堆栈信息。

SkyWalking 与 Jaeger UI 关键差异:
SkyWalking 是一体化 APM,Trace、Metrics 大盘、服务拓扑、告警全部内置一套 UI;Jaeger 只专注 Trace 展示;
SkyWalking 原生区分 EntrySpan(服务入口)、ExitSpan(调用外部)、LocalSpan(本地方法)三类 Span;Jaeger/OTel 没有做这三类强区分;
SkyWalking 既可以接收私有 Agent 协议,也兼容 OTLP 输入;内部会把 OTLP 数据转换为自有模型;Jaeger 原生兼容 OpenTracing,也兼容 OTLP。
Jaeger vs SkyWalking Trace 能力对比表
表格
| UI 定位 | 只做链路查询,无内置指标大盘 | 一体化 APM,Trace、指标、拓扑、告警一体 |
| 数据来源 | Jaeger‑Agent、OTLP | SkyWalking Agent、OTLP |
| 核心视图 | 瀑布图;Trace 列表筛选 | 瀑布图、调用树视图、统计聚合视图 |
| 特殊概念 | TraceID、SpanID、ParentSpanID | 增加 Segment(进程内 Span 组);Entry/Exit/Local Span |
| 存储 | ES、Cassandra、Tempo | ES、BanyanDB、ClickHouse |
| 全文检索 | 依赖底层存储能力 | 原生支持按异常信息、标签检索链路 |
工程落地要点
瀑布图阅读技巧:横向条越长代表越耗时;优先看最长的 Span 定位性能瓶颈;红色条代表异常点;
生产不要把 Trace 和 Metrics 放同一个数据库;Trace 海量写入压力不能冲击指标查询;
OTel‑Collector 可以做桥接:业务输出 OTLP,既可以输出 Trace 到 Tempo(用 Grafana/Jaeger UI 查看),也可以输出到 SkyWalking OAP,一套埋点可以对接两套后端。
Trace的核心价值与Metrics完全互补:
-
Metrics看趋势:发现“服务P95延迟飙升、错误率上涨”的宏观异常;
-
Trace看细节:定位“具体哪一次请求、哪一个服务、哪一段代码导致延迟过高”的微观根因。
Trace数据具备写入量大、高基数、存储成本高、写多读少的特点,绝大多数链路数据不会被二次查询,仅故障排查时按需检索,这也是Trace与Metrics必须物理分库存储的核心原因。
这里解释一个细节:每个trace都有traceId,一般是uuid或者算法生成的唯一编号,带着这个编号去记录的各个 span 就能在后端组织起来,一般在http业务中,可以在header中传递相关信息;
二、APM全链路架构
2.1 组件讲解
一套完整 APM 系统,逻辑上分为 4 层,从上到下:探针 (Agent/SDK) → Collector 采集网关 → APM 后端存储 & 计算层 → 展示器 (UI 可视化)。 很多人会把探针、Collector、后端、UI 混为一谈,这里把每一层职责、边界、开源组件讲清楚。
【业务应用进程】
↓
探针(Agent / SDK):埋点采集,生成Metrics / Trace / Logs
↓网络(OTLP / 私有协议)
Collector(采集网关):协议转换、批处理、过滤、缓冲、扇出转发
↓
APM后端(存储+计算):接收数据、持久化、聚合计算、告警规则执行
↓
展示器(UI):大盘图表、Trace瀑布图、服务拓扑、告警展示
2.1.1. 探针(Agent / SDK)
运行在业务服务所在机器 / 进程内部,负责生成观测数据,是数据来源。 两种形态:SDK 代码埋点、Agent 无侵入探针。业务探针优先全部采用 OpenTelemetry SDK / OTel‑Java Agent,尽量统一数据协议为 OTLP,不必混用 Jaeger、SkyWalking 私有协议。探针统一使用 OpenTelemetry(OTel)就可以,他们的协议已经成为标准被各个厂商兼容。
OTLP 协议(OpenTelemetry Protocol)
OTLP 是 OpenTelemetry 定义的标准可观测数据协议,传输 Metrics、Trace、Logs 三类信号。
-
序列化:Protobuf;
-
传输:gRPC(推荐) / HTTP‑protobuf;
-
流向:探针主动上报(Push 推送模式),探针把数据发给 OpenTelemetry‑Collector。
1)SDK(代码埋点)
把库编译链接进业务程序,业务代码显式调用 API 埋点。
-
Go:go.opentelemetry.io OTel‑Go SDK
-
C++:opentelemetry‑cpp
-
Java:OpenTelemetry Java SDK 特点:侵入业务代码;可控性强;Go/C++ 没有无侵入方案,只能 SDK 埋点。
2)Agent(无侵入探针)
不修改业务代码,附加到业务进程,拦截框架、RPC、数据库调用自动生成 Span、指标。
-
Java:SkyWalking‑Agent、OpenTelemetry‑Java Agent(‑javaagent参数加载)
Java 靠 JVM 字节码增强,就是在类加载器中搞一些小动作,做到无侵入;Go/C++ 编译型语言没有这个能力。
探针只做采集,不做存储、不做复杂聚合、不做告警,尽量轻,不能把业务搞慢。 输出协议:标准 OTLP;或者 SkyWalking、Jaeger 私有协议。
3)eBPF(Extended Berkeley Packet Filter,扩展伯克利包过滤器)
eBPF是 Linux 内核提供的沙箱虚拟机技术,可以在内核中安全执行自定义字节码程序,不需要修改内核源码、不需要加载内核模块,通过 kprobe、uprobe、tracepoint、XDP 等钩子点捕获系统调用、函数执行、网络报文事件博客园。
eBPF 探针不属于业务进程内部,它运行在内核,一般以 Node‑Agent(DaemonSet)形式部署在宿主机 / 节点上,不需要修改、重启业务应用,实现语言无关的数据采集。
eBPF 探针采集原理
将 eBPF 字节码加载进入内核,内核 Verifier 做安全校验,防止死循环、非法内存访问;
挂载钩子:
-
kprobe:挂钩内核函数,采集系统调用、网络、IO、调度事件;
-
uprobe:挂钩用户态程序函数,捕获应用函数调用;
-
tracepoint:内核稳定埋点,稳定性高于 kprobe;
内核采集事件通过 ring‑buffer 环形缓冲区发送给用户态 eBPF‑Agent;
用户态 Agent 解析协议(HTTP/gRPC/MySQL/Redis),生成 Metrics、原始 Trace 事件,可输出 OTLP 协议交给 OpenTelemetry‑Collector 继续处理。
eBPF 探针能采集什么
-
全语言网络流量:HTTP、gRPC、SQL、Redis、MQ 请求延迟、错误、请求体;
-
系统层面指标:系统调用耗时、锁竞争、上下文切换、磁盘 IO、TCP 网络延迟;
-
持续性能剖析:CPU 火焰图、线程栈;
-
可以观测闭源程序、第三方中间件、遗留业务,这些业务无法接入 SDK/Agent。
eBPF 探针短板(非常关键,不能神话 “零侵入万能”)
无法自动传递 TraceID 上下文:eBPF 在内核抓包,看不到应用进程内部上下文;如果业务代码没有透传 TraceID,eBPF 只能看到独立请求,很难天然拼接完整分布式调用链;需要依靠报文 header 内的 trace‑id 做关联,异步、跨线程场景链路容易断裂。
拿不到业务自定义属性:用户 ID、业务场景标签、自定义业务 Span 拿不到,这部分仍然需要业务 SDK 埋点补充。
内核版本依赖:不同 Linux 内核版本钩子能力差异大;需要高权限(CAP_BPF 等);eBPF 程序 bug 风险影响整个节点,不是单个业务进程。
协议解析开销:需要在内核 / 用户态解析各类应用协议,新增协议需要升级 eBPF 组件。
✅工程最佳实践:eBPF 和传统 SDK/Agent 是互补,不是替代。 eBPF 拿到全栈基线观测、网络、内核性能;核心业务链路用 OTel‑SDK 注入业务标签、Trace 上下文,两者数据在 Collector / 后端关联起来,形成完整证据链。
eBPF 可观测主流开源组件
Pixie:完整 eBPF 可观测平台,自动采集 HTTP/gRPC/SQL/Redis,内置查询 UI,可以导出 OTLP 给外部后端;K8s 场景为主。
Cilium‑Hubble:侧重网络观测、服务拓扑;基于 eBPF CNI,看服务之间网络流量、网络延迟。
Beyla(Grafana):eBPF 采集器,输出 Prometheus 指标、OTLP Trace,可以直接对接 OTel‑Collector、Mimir、Tempo,轻量,适合嵌入现有 LGTM 栈。
Parca / Pyroscope:eBPF 持续剖析,采集 CPU、内存火焰图。
DeepFlow:国内开源 eBPF 零侵扰可观测,自动生成调用链,支持输出 OTLP。
SkyWalking eBPF‑Profiling:作为补充能力,做 CPU、线程栈剖析,不作为主链路采集。
2.1.2.Collector(采集器)
典型代表:OpenTelemetry‑Collector、Grafana Alloy。
不在业务进程内,独立部署的服务,是 APM 体系的中间转发管道。 也就是agent或者进行使用SDK发送采集的信息发送到Collector然后再发送到后端。这样多加一层是有原因的:
✅核心职责:
接收多种协议:接收探针上报 OTLP、Jaeger、Zipkin;也可以主动拉取 Prometheus /metrics。
协议标准化转换:把多种私有协议统一转为 OTLP;也可以转成后端需要的格式。
数据处理(Processor):批处理压缩、过滤无用 span、修剪高基数标签、脱敏敏感字段。
削峰缓冲:内存队列、磁盘队列;后端存储抖动时缓存数据,保护业务探针不被反压。
扇出(Fan‑out):一份数据,同时发给多个后端。例如 Trace 同时发给 Tempo 和 ES;指标同时发给 Mimir 和 VM。
数据衍生(Connector):spanmetrics,从 Trace 自动生成 Metrics,不用业务埋点。比如从span中知道某个数据库查询的时延情况;
❗重要:Collector 本身不持久保存历史数据,不做指标聚合,不做服务拓扑,不做告警,只是管道。
部署两种模式
Agent 模式:每台机器部署一个 Collector,本机探针上报本机 Collector;
Gateway 模式:集中式 Collector 集群,接收各个 Agent 上报的数据。生产一般 Agent+Gateway 两层。
❌不要把 SkyWalking OAP 当成 Collector。OAP 虽然能接收 OTLP,但收到之后转为私有模型,做聚合、存储、拓扑,属于APM 后端,不是转发管道。
2.1.3.APM 后端(存储 + 计算层)
接收 Collector 转发过来的数据,做持久化、时序聚合、Trace 组装、规则计算、告警判断。 Metrics 后端和 Trace 后端通常是两套独立组件。从前文可以得知Metrics展示的图最常用的都是按时间进度看仪表盘情况,而trace都是通过过滤查询比较慢的执行过程原因,一起配合故障处理问题的,所以trace和log在99.9%情况下是没有没查看过的,而且当多用户,多应用情况下,查看trace的span很费算力。所以Metrics 后端和 Trace 后端通常是分开的讨论的,而且一般使用不同的存储方式。
2.1.3.1 Metrics 指标后端(时序存储)
负责保存时序数值,执行 PromQL,做预聚合、告警规则计算。下面是几个常用的产品
-
Prometheus:Prometheus 是 CNCF 毕业项目,是云原生领域事实标准的指标采集与单机时序数据库,专注 Metrics 指标,不原生处理 Trace 链路数据。注意:Prometheus 是单机设计,不是分布式集群。数据存在本地磁盘,没有内置分片、多副本、多租户、对象存储能力。数据默认按保留时间自动删除,不适合 PB 级海量、多机房、多租户大厂场景。
-
Mimir:Grafana Mimir 是 Grafana Labs 开源、基于 Cortex 演进而来的水平可扩展、高可用、多租户 Prometheus 兼容时序后端存储Grafana。
定位:只做指标存储与查询,不做抓取(Scrape),不处理 Trace 链路。完全兼容 Prometheus 的数据模型、remote_write协议、PromQL 查询语法,用来解决原生 Prometheus 单机无法扩容、无副本、无多租户、数据不能长期保存的痛点。 许可证:AGPL‑v3,内部业务使用没问题;如果对外改造后作为云服务对外提供,存在合规约束,很多大厂合规会重点评估这一点。
-
VictoriaMetrics:VictoriaMetrics(简称 VM),Go 语言开发,Apache‑2.0 开源协议,没有 AGPL 协议约束,是业界主流的 Prometheus 兼容时序数据库,定位为高性能、低资源开销的 Metrics 存储后端,完全兼容 Prometheus 数据模型与 PromQL 语法,解决原生 Prometheus 单机容量、保存周期的痛点。
补充生态:配套 VictoriaTraces 专门用于存储 Trace 链路数据;VictoriaLogs 用于日志存储,整套栈可以一套生态覆盖 Metrics‑Trace‑Logs 三大可观测信号,对标 Grafana LGTM 栈(Mimir+Tempo+Loki)VictoriaMe…。
-
ClickHouse:OLAP 数据库;早期的各种产品比如One-Apm就是用这个数据库来存储数据。好处就是可以自动归并数据。缺点是不适合高并发的查询;用这个数据库需要做的开发还挺多的;
能力:保存 Counter/Gauge/Histogram;支持 PromQL/SQL 查询;内置告警规则执行。
VictoriaMetrics vs Mimir 对比表
| 开源协议 | Apache‑2.0,对外 SaaS 无约束 | AGPL‑v3,对外 SaaS 存在合规风险 |
| 部署形态 | 单节点(简单)/ 集群三组件 | 微服务众多:Distributor/Ingester/Compactor 等 |
| 存储介质 | 主要本地磁盘 / PVC;集群可选对象存储 | 强依赖 S3 兼容对象存储 |
| 多租户 | 仅集群版开源支持 | 原生多租户,能力完善,租户限流、配额齐全 |
| 资源消耗 | 低,同等负载硬件要求更小 | 资源开销更高 |
| Trace 配套 | VictoriaTraces(本地磁盘优先) | 搭配 Tempo(对象存储) |
| 适用规模 | 中小规模、中等规模;介意协议风险场景 | 大厂平台、多租户监控即服务、海量时序 |
2.1.3.2 Trace 链路后端
保存 Span/Trace 数据,按 TraceID 读取完整调用树。
-
Tempo:Grafana Tempo 是 Grafana Labs 开源分布式链路追踪后端,属于 LGTM 栈的 Trace 组件,只存储 Trace,不处理 MetricsGrafana。接收 OTLP、Jaeger、Zipkin 协议,一般由 OTel‑Collector 上报 Span 数据,数据以 Parquet 列存格式持久化到 S3 兼容对象存储,无需 ES/Cassandra 等重数据库,存储成本低Grafana。
支持按TraceID精准查询,内置 TraceQL 可按标签检索链路,Grafana 作为 UI 渲染瀑布图;可自动生成 RED 指标,和 Mimir 指标、Loki 日志互相关联跳转Grafana。支持单体 / 微服务部署,原生多租户。短板:属性全检索性能弱于 ES;强依赖对象存储;不自带服务拓扑,拓扑需要依靠 metrics‑generator 生成。常搭配 OTel‑Collector,与 Mimir 组成拆分式可观测后端。
-
Jaeger:CNCF 开源分布式链路追踪系统,Uber 开源捐赠,接收 OTLP、Jaeger‑Thrift、Zipkin 协议,由 Collector 接收 Span 存入外置存储(ES/OpenSearch、Cassandra),Query 服务提供 API 与内置 UI 渲染瀑布图、依赖拓扑图GitHub。支持多种采样策略,擅长按标签、错误、耗时做链路全文检索。现代部署一般用 OTel‑Collector 替代原生 Jaeger‑Agent 做采集转发。无内置 Metrics 与告警,需对接外部监控。缺点:强依赖重型数据库,资源开销高,无原生多租户;新项目常被 Tempo 替代,但 Jaeger‑UI 仍可作为 Tempo 的前端查看链路。
数据流:OTel‑Collector → Jaeger‑Collector → ES/Cassandra → Jaeger‑UI。
-
SkyWalking OAP Server:一体化后端;存储可选用 ES / BanyanDB / ClickHouse;做 Trace 存储 + 指标聚合 + 服务拓扑 + 告警
-
Elasticsearch:早期 APM 用来存 Trace,擅长全文检索,但资源开销大。而且ES用过的都知道,各个版本之间不兼容,这个太麻烦了。
区分:
-
SkyWalking OAP 是完整一体化 APM 后端:Trace 存储、指标聚合、服务拓扑、告警全部在 OAP 内部完成。
-
Mimir 只处理 Metrics;
-
Tempo 只处理 Trace,二者是拆分式后端。
2.1.3.4. 展示器(UI 可视化层)
只负责渲染图表,本身不存 Metrics、Trace 原始数据,查询时去拉 APM 后端的数据。
Grafana 通用可视化展示器。
-
对接 Mimir/VictoriaMetrics 拿 Metrics;对接 Tempo 拿 Trace;
-
输出大盘、线图、直方图、Trace 瀑布图;配置告警;
-
自身配置(仪表盘、账号)存在 PostgreSQL/MySQL;时序数据不在 Grafana。
SkyWalking UI 和 OAP 配套一体化 UI;服务拓扑图、Trace 瀑布图、服务指标大盘全部内置;不需要 Grafana。
Jaeger‑UI 专门的 Trace 展示器;只做链路查询,不做指标大盘;可以对接 Tempo、ES。
这里给出两套典型完整开源 APM 栈对照,探针用OTel不用犹豫了,核心就是用谁做后端和展示:
方案 A:LGTM(OTel‑Collector + Mimir + Tempo + Grafana)拆分式架构
业务:Go/C++ OTel‑SDK / Java OTel‑Agent 【探针】
↓OTLP
OpenTelemetry‑Collector 【采集网关】
├‑metrics → Mimir 【Metrics后端】
└‑traces → Tempo 【Trace后端】
Grafana 【展示器】查询Mimir和Tempo,画大盘、看Trace瀑布图
特点:各层组件解耦,可以单独替换某一层;没有一体化的服务拓扑;Tempo 全文检索弱。
方案 B:SkyWalking 一体化 APM 架构
业务:SkyWalking‑Agent(Java无侵入) / OTel‑SDK(Go/C++) 【探针】
↓私有协议 / OTLP
OpenTelemetry‑Collector(可选,做转发处理)
↓OTLP
SkyWalking OAP Server 【一体化APM后端:接收、聚合、拓扑计算、存储】
↓存储:ES/BanyanDB/ClickHouse
SkyWalking UI 【展示器】
特点:后端一体化,自带服务拓扑、告警;Java 无侵入 Agent 体验好;内部转为私有模型,生态绑定。
2.1.4 概念速查表
| 探针 Agent/SDK | 业务进程内采集埋点 | OTel SDK、SkyWalking Agent | ❌只生成,不存储 |
| Collector | 采集网关,管道转发 | OpenTelemetry‑Collector、Grafana Alloy | ❌临时队列,不存历史 |
| APM 后端(Metrics) | 指标存储、PromQL 计算 | Prometheus、Mimir、VictoriaMetrics | ✅持久化指标 |
| APM 后端(Trace) | 链路存储、Trace 组装 | Tempo、SkyWalking OAP、Jaeger+ES | ✅持久化 Span/Trace |
| 展示器 UI | 可视化查询渲染 | Grafana、SkyWalking‑UI、Jaeger‑UI | ❌只存仪表盘配置,不存时序 / 链路原始数据 |
2.1.5 常见误区澄清
❌Grafana 是存储:错,Grafana 只是 UI,数据全部在 Mimir/Tempo。
❌Collector 就是 APM 后端:错,Collector 只是管道,不做聚合和持久化。
❌SkyWalking Agent = SkyWalking 完整 APM:错,Agent 只是探针,必须搭配 OAP 后端。
❌Mimir/Tempo 自带 UI:错,Mimir/Tempo 只负责存储计算,可视化交给 Grafana。
在现代APM体系中,Collector是整个可观测链路的核心中转站,是打通多语言采集、多协议转换、数据过滤、削峰缓冲、多后端转发的核心组件,也是所有大厂标准化观测架构的统一入口。
2.2 Collector核心能力(核心五大功能)
很多开发者会混淆Collector与APM后端服务,核心区别:Collector只做数据处理转发,不持久化存储、不做聚合分析、不生成拓扑,纯管道型组件。
协议转换:统一接收OTLP、Prometheus、Jaeger、Zipkin等多协议数据,统一标准化处理后,转发至任意后端存储,彻底解耦业务与存储;
批处理压缩:合并业务产生的海量小包数据,压缩后统一传输,大幅降低公网、内网网络IO开销;
数据治理:过滤无效健康检查Span、修剪高基数标签、脱敏敏感数据,避免时序爆炸、存储资源浪费;
削峰缓冲:内置内存队列与磁盘持久队列,后端存储抖动、网络中断时临时缓存数据,避免反压业务服务,保障业务稳定性;
数据扇出与衍生:支持一份数据多后端转发,同时支持通过SpanMetrics连接器,从Trace链路自动提取延迟、QPS指标,无需业务手动埋点Metrics。
标准全链路采集流程图
# 多语言业务SDK层(C++/Java/Go)
业务服务埋点 → 输出标准OTLP协议数据
# 统一采集管道层
OpenTelemetry Collector,内置如下功能
├─ Receiver:接收OTLP业务数据、抓取中间件/机器Metrics
├─ Processor:批处理、过滤、标签修剪、队列缓冲
├─ Connector:SpanMetrics(链路转指标)
└─ Exporter:多后端分发
├─ Metrics数据 → Mimir/VictoriaMetrics
└─ Trace数据 → Tempo
# 可视化与告警层
Grafana(统一UI大盘、链路查询)+ 告警引擎
2.3 三大主流开发语言采集方案适配对比
不同语言的虚拟机、编译特性不同,APM采集方案差异极大,也是企业选型的核心依据:
2.3.1 Java语言
Java拥有无侵入Agent绝对优势,是国内微服务主流选型:
-
SkyWalking Java Agent:行业最优解,无需改业务代码,通过-javaagent启动参数即可自动采集SpringCloud、Dubbo、Redis、MySQL等所有中间件调用链路,自动生成服务拓扑、聚合指标,适配国内所有Java生态组件;
-
OpenTelemetry Java Agent:标准中立,输出OTLP协议,后端可任意切换,但对国产中间件适配弱于SkyWalking;
-
适用场景:国内Java微服务集群优先SkyWalking Agent,多语言统一标准化场景优先OTel Agent。
2.3.2 Go语言
Go为编译型静态语言,无虚拟机、不支持运行时无侵入埋点,所有采集方案均依赖编译期处理或代码埋点:
-
OpenTelemetry-Go SDK:CNCF标准,生态完善、组件齐全,基于Context上下文传递链路,完全解耦后端存储,是Go项目最优标准方案;
-
SkyWalking-Go:编译期AST插桩,少代码侵入,但输出私有协议,生态封闭,后端绑定SkyWalking OAP;
-
适用场景:所有Go云原生、RAG、微服务项目,优先OTel-Go SDK。
2.3.3 C++语言
C++一般都是使用SDK自己设计记录的内容,生态最薄弱:
-
OpenTelemetry-C++ SDK:唯一稳定标准方案,商用成熟、协议通用,支持全量遥测数据采集;
-
SkyWalking C++ SDK(cpp2sky):社区维护,官方支持弱、文档少、生产案例稀缺,不推荐商用;
-
适用场景:C++服务统一使用OTel-C++ SDK。
三、APM行业厂商演进:闭源传统厂商到开源云原生体系
国内APM行业经历了商业闭源垄断 → 开源方案崛起 → 云原生标准化统一三个阶段,新旧方案的迭代,直接决定了当前企业的技术选型与招聘技术栈。
3.1 传统闭源商业APM(初代行业方案)
代表产品:OneAPM(蓝海讯通)、听云、博睿数据 这是国内最早的商用APM体系,2015–2018年垄断企业市场,对标国外New Relic。
核心架构
自研私有SDK采集 + 私有协议传输 + 后端自研存储(早期MySQL/ES,后期升级ClickHouse)
核心特点
完全闭源:无开源代码,依赖License授权付费使用,私有化部署成本极高;
一体化厚重:采集、存储、分析、UI全部自研,无需运维开源组件;
生态封闭:私有协议,无法对接Prometheus、Grafana等开源组件,绑定厂商;
现状与市场萎缩原因
云原生开源生态普及,免费开源方案完全替代商业APM能力;
私有协议、无法扩展、二次开发成本极高,不适配K8s、微服务架构;
仅留存政企传统老旧项目续费维护,互联网新项目、云服务已彻底淘汰。
3.2 国产开源一体化APM:Apache SkyWalking
SkyWalking是国内最成功的开源APM项目,Apache顶级项目,免费商用、无License限制,是国内Java微服务集群的主流选型。
核心架构
多语言Agent/OTel采集 → OAP-Server(核心后端) → BanyanDB/ES存储 → 自研UI
核心核心组件OAP释义
OAP全称Observability Analysis Platform(可观测性分析平台),是SkyWalking的核心后端服务。
-
区别于Collector:OAP不仅接收数据,还承担聚合计算、拓扑生成、指标统计、告警分析、数据持久化全能力;
-
核心特性:兼容标准OTLP输入,但数据入库后转为私有内部模型,无法反向输出标准OTLP,存在生态绑定;
优缺点总结
优势:Java无侵入采集无敌、开箱即用拓扑/告警/服务治理、中文生态完善、适配国产中间件、运维简单; 劣势:内部数据模型私有、无法兼容PromQL、多语言标准化弱、不适合云原生统一标准架构。
3.3 国际开源标准体系:OTel + Prometheus + Grafana 生态
这是海外大厂、云原生项目、多语言集群的全球通用标准,完全基于CNCF开源规范,无厂商绑定。
组件分工
OpenTelemetry:统一采集标准,定义所有语言SDK、OTLP协议、数据规范,是现代观测的唯一采集标准;
Prometheus:时序指标采集标准,生态最全,所有中间件、组件原生暴露Metrics端点,PromQL为行业通用查询语言;
Grafana:统一可视化UI,无状态前端,不存储业务数据,仅负责大盘展示、链路查询、告警配置;
Mimir:Prometheus分布式集群升级版,原生多租户、线性扩容、对象存储持久化,替代单机Prometheus;
Tempo:轻量化分布式Trace存储,Grafana开源,Apache2.0宽松协议,专为海量链路数据设计。
四、现代两大主流APM架构体系深度对比
当前行业所有企业架构,最终都会归为一体化SkyWalking架构和CNCF标准LGTM架构两大流派,二者没有绝对优劣,适配场景完全不同。
4.1 架构一:SkyWalking一体化架构
完整链路
多语言采集(Java Agent+Go/C++ OTel SDK)→ OTel Collector → SkyWalking OAP → BanyanDB/ES → SkyWalking UI
适用场景
国内传统Java微服务集群、政企项目、追求低运维成本、快速落地的团队
核心优势
零代码接入Java服务,落地效率极高;
自带服务拓扑、异常分析、告警聚合,无需组装多组件;
中文社区成熟,踩坑案例丰富,运维门槛低。
核心短板
数据模型私有,生态绑定,无法无缝迁移至标准云原生体系;
不兼容PromQL,基础设施指标观测能力弱于Prometheus/Mimir;
Trace检索、自定义指标灵活性弱于标准开源栈。
4.2 架构二:CNCF标准LGTM架构(OTel+Mimir+Tempo+Grafana)
完整链路
多语言统一OTel SDK → OTel Collector → Metrics写入Mimir(分布式时序存储) → Trace写入Tempo(轻量化链路存储) → Grafana统一可视化、告警
适用场景
云原生多语言集群(Go/C++/Java混合)、互联网新项目、对外云服务、追求标准化无绑定的团队
核心优势
完全标准中立:OTLP统一采集、PromQL通用查询,所有组件可独立替换,无厂商绑定;
存储物理隔离:Metrics高并发聚合查询、Trace海量写入检索互相隔离,稳定性极高;
扩展性极强:支持多租户、配额限流、线性扩容,适配大厂云服务级别场景;
协议友好:Tempo为Apache2.0协议,商用无风险。
核心短板
组件拆分细,运维复杂度高于一体化SkyWalking;
Tempo无全量倒排索引,Trace全文检索能力弱于ES/SkyWalking;
Mimir为AGPL3.0协议,对外云售卖服务存在合规约束。
4.3 架构三:单机简易原型架构(小集群、测试环境)
OTel 探针 + Jaeger + Prometheus,不部署分布式 Mimir/Tempo,全部单机组件
探针:OTel‑SDK / OTel‑Agent
↓ OTLP
OpenTelemetry‑Collector
├‑Metrics → Prometheus remote_write(单机TSDB)
└‑Trace → Jaeger‑Collector,存储后端使用ES单机/Badger
↓
Grafana + Jaeger‑UI 分别展示指标、链路
特点:全部单机组件,部署简单,上手成本低; 局限:无高可用、无分片、无多租户;数据有保留时间限制;ES 资源消耗大;仅用于测试、小规模,不适合生产大规模。
简表对比
| 架构一 | SkyWalking Agent+OAP+UI | 一体化后端 | Java 为主,想要开箱即用拓扑告警 |
| 架构二 | OTel‑Collector+Mimir+Tempo+Grafana | 拆分分布式,CNCF 标准 | 多语言、平台多租户、生产大厂 |
| 架构三 | OTel‑Collector+Prometheus+Jaeger | 单机原型 | 测试、学习、小规模演示 |
五、主流存储方案选型:彻底告别ClickHouse+ES传统架构
早期OneAPM、自研APM普遍采用ClickHouse存Metrics、ES存Trace的重型架构,这套架构性能强但运维成本极高,现代开源方案已实现全面替代。
5.1 传统架构:ClickHouse + ES
-
ClickHouse:依靠物化视图实现5/15分钟指标预聚合,时序分析性能极强;
-
ES:依靠倒排索引实现Trace全文检索、异常日志检索;
-
致命缺点:两套重型集群、需要自研Schema/索引/UI/多租户,运维成本极高,仅大厂自研APM使用。
5.2 现代替代方案对比
Mimir(替代ClickHouse指标存储) 原生时序聚合、降采样、告警、多租户,兼容PromQL,无需自研物化视图,开箱即用;
Tempo(替代ES链路存储) 基于对象存储,写入吞吐极高、成本极低,Grafana原生UI支持,无需维护ES重型集群;
备选轻量化方案:VictoriaMetrics全家桶 Apache2.0完全开源无风险,VM存指标、VictoriaTraces存链路,资源占用低于Mimir+Tempo,适合介意协议风险的企业。
六、行业大厂选型现状与底层逻辑
6.1 海外大厂
全员普及LGTM标准架构,Adobe、Unity、Grafana Cloud全部采用OTel+Mimir+Tempo栈,核心原因:标准化、多语言适配、可无限扩容、无生态绑定,契合云原生全球统一规范。
6.2 国内大厂选型两极分化
传统Java业务集群:优先SkyWalking,利用无侵入Agent快速落地,降低运维成本;
云原生/Go微服务/新业务:优先LGTM标准架构,追求标准化、可扩展性;
自研云APM产品:部分大厂基于ClickHouse深度自研,兼顾性能与SQL分析能力,但需自研全套网关、权限、UI;
6.3 招聘技术栈底层逻辑
大厂高频考虑Prometheus/Grafana,极少考虑SkyWalking魔改,核心原因:
PromQL、OTel是通用技能,跳槽可复用;SkyWalking私有能力局限性强;
大厂基础设施监控、中间件监控全部依赖Prometheus生态,SkyWalking仅负责应用APM;
标准云原生栈可二次开发、可扩展,适配所有业务场景,天花板更高。
七、全文总结与选型终极建议
核心概念闭环:APM核心由Metrics(宏观趋势、告警统计)和Trace(微观链路、故障定位)组成,二者互补不可替代,且必须物理分库存储;
Collector是现代观测核心:统一多语言采集、协议转换、数据治理、削峰转发,是所有标准架构的必备中间层;
语言采集选型:Java优先SkyWalking Agent,Go/C++统一使用OpenTelemetry SDK;
架构选型边界:传统Java微服务、快速落地选SkyWalking一体化架构;云原生多语言、标准化、云服务场景选LGTM(Mimir+Tempo)标准架构;
技术迭代趋势:传统ClickHouse+ES重型自研架构逐步被开源标准化组件替代,OTel统一采集、组件解耦、存储隔离是未来可观测体系的绝对趋势。
未完待续,后文讨论相关的协议与存储架构。
网硕互联帮助中心







评论前必须登录!
注册