天翼云应用性能监控组件(APM) 应用接入方式主要飞Java类应用的接入方式和非Java类的接入方式,Java类应用提供无侵入的接入方式,非Java类应用提供基于OpenTelemetry标准,全面兼容Jaeger、SkyWalking等多种开源接入协议。下面分析 OpenTelemetry、Jaeger、SkyWalking等接入方式给应用接入方案提供参考。
一、 OpenTelemetry(OTel)方式
1、数据采集原理
-
标准化采集:OpenTelemetry 是一个开放标准,提供了一套统一的 API、SDK 和工具。OTel 不仅仅是“标准化采集”,它正在成为可观测性数据的统一事实标准。它合并了OpenTracing和OpenCensus,旨在提供从数据采集、处理到导出的全链路标准化。其“自动插桩”的能力和社区支持正在飞速增强。
-
自动/手动插桩:
-
自动插桩:通过 OTel 提供的语言特定代理(如 Java Agent、Python 等)自动注入探针,无需修改代码即可采集 HTTP、数据库、RPC 等调用链路。
-
手动插桩:开发者通过 OTel SDK 在关键代码位置手动添加追踪点,更灵活但需要代码改动。
-
-
数据导出:采集的数据通过 OTLP(OpenTelemetry Protocol)协议导出到后端系统(如 Jaeger、Prometheus、Elasticsearch 等)。
2、对应用接入影响
-
低侵入性(自动插桩):适合无代码改动场景,仅需部署时加载代理。
-
灵活性强(手动插桩):支持自定义采集逻辑,但需开发配合。
-
跨平台支持:支持多种语言和框架,生态兼容性好。
-
性能开销:自动插桩有一定性能损耗,但通常可控。其开销通常低于许多私有代理。通过设置合理的采样率(如1%的尾部采样),可以将生产环境开销降至极低
3、未来趋势和发展
- 强调 OTel 是云原生可观测性的未来方向。越来越多的商业和开源后端(如 Jaeger、Prometheus、Elastic APM、Datadog、Grafana Tempo)都原生支持 OTLP 协议,选择 OTel 意味着不会被某个特定后端锁定
二、SkyWalking 方式
1、数据采集原理
-
探针采集:通过 Java Agent(或语言特定的探针)在应用启动时动态注入字节码,拦截关键方法调用(如 HTTP、DB、RPC)。
-
服务网格集成:支持从 Istio、Envoy 等服务网格组件收集链路数据。
-
数据上报:采集的链路和指标数据通过 gRPC/HTTP 上报到 SkyWalking OAP 服务进行存储和分析。
- 高级特性:SkyWalking Agent 提供了丰富的插件化采集能力(如对 MySQL、Redis、Kafka、Dubbo、RocketMQ 等中间件的支持),开箱即用。
2、对应用接入影响
-
无侵入/低侵入:主流方式是通过 Agent 实现无代码修改接入,只需在启动命令中添加
-javaagent参数。 -
语言支持:对 Java 支持最好,其他语言(如 Go、Python)也有探针,但可能功能或成熟度有差异。
-
部署依赖:需部署 SkyWalking OAP 和 UI 服务,有一定运维成本。
-
性能损耗:Agent 注入会带来一定性能开销,通常较小(<5%)。
四. Jaeger 方式
1、数据采集原理
-
客户端 SDK 插桩:通过 Jaeger 客户端库(如
jaeger-client)在代码中手动或通过框架(如 OpenTracing)注入追踪逻辑。 -
上下文传播:通过 HTTP Headers(如
uber-trace-id)在服务间传递链路上下文。 -
数据上报:采集的链路数据通过 UDP/HTTP 发送到 Jaeger Agent,再由 Agent 转发到 Jaeger Collector。
2、对应用接入影响
-
代码侵入性较强:通常需要手动添加追踪代码或依赖框架支持(如 Spring Cloud Sleuth)。
-
部署复杂:需部署 Jaeger Agent、Collector、Query 等组件。
-
灵活性高:支持自定义采样策略和标签注入。
-
性能开销:取决于采样率和追踪粒度,全采样时开销较大。
| 特性 | OpenTelemetry (OTel) | SkyWalking | Jaeger |
|---|---|---|---|
| 核心定位 | 可观测性领域的统一标准与数据采集层 | 功能丰富的 APM(应用性能监控)系统 | 专注于分布式追踪的后端与可视化系统 |
| 采集原理 | 标准化 API/SDK,支持自动/手动插桩,数据格式为 OTLP | 智能探针(Agent),侧重字节码注入与自动指标采集 | 传统为私有 SDK,现代实践是作为 OTLP 数据的后端 |
| 侵入性 | 低(自动插桩)/ 中(手动插桩,但一劳永逸) | 极低(Java等语言),无需修改代码 | 取决于采集层:若用OTel则同OTel;若用旧SDK则需代码改动 |
| 数据维度 | 链路(Trace)、指标(Metric)、日志(Log) 三位一体 | 链路、指标、拓扑、性能剖析,APM功能集成度高 | 专注于链路(Trace),指标和日志需与其他系统集成 |