云计算百科
云计算领域专业知识百科平台

应用性能监测(APM)之 前世今生(一)

目录

一、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 能力对比表

    表格

    项目JaegerSkyWalking
    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 对比表

    项目VictoriaMetricsGrafana 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统一采集、组件解耦、存储隔离是未来可观测体系的绝对趋势。

  • 未完待续,后文讨论相关的协议与存储架构。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 应用性能监测(APM)之 前世今生(一)
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!