ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Micrometer 系列【39】链路追踪:入门案例 | 环境准备

Micrometer 系列【39】链路追踪:入门案例 | 环境准备 文章目录1. Jaeger1.1 项目简介1.2 v2 版本1.3 与 OpenTelemetry 的关系1.4 Docker 部署1.5 vs Zipkin1.6 vs Apache SkyWalking2. OpenTelemetry2.1 OTLP 协议2.2 OTel 框架2.3 vs Brave2.4 vs Micrometer3. 依赖配置3.1 Micrometer Tracing 门面3.2 追踪器3.3 导出器1. Jaeger美/ˈjeɪɡɚ/1.1 项目简介官网地址Jaeger是一套分布式追踪平台由优步Uber Technologies于2016年开源随后捐赠给云原生计算基金会CNCF现已成为毕业级项目。借助Jaeger可以实现监控、排查分布式业务流程定位性能瓶颈追溯故障根因分析服务依赖关系1.2 v2 版本发布时间2024-11-12Jaeger作为主流开源分布式追踪平台已经稳定运行9年深度参与OpenTracing、OpenTelemetry等行业标准化工作也是CNCF最早一批毕业项目。历经60多个版本迭代Jaegerv2迎来重大架构升级。新版本以OpenTelemetry Collector作为底层基座并在此基础上扩展实现Jaeger独有特性。整体带来大量改进与调整架构更灵活、扩展性更强与OpenTelemetry生态深度对齐。完整介绍可阅读官方博文。核心特性数据模型源自OpenTracing规范原生兼容OpenTelemetry内置多种存储后端Elasticsearch、OpenSearch、Cassandra、Badger单机本地文件存储、Kafka中间缓冲、内存存储支持通过远程存储API对接自定义存储实现具备良好扩展性服务拓扑 / 依赖关系图谱自适应采样服务性能监控SPM采集后数据处理流水线1.3 与 OpenTelemetry 的关系两个项目定位不同OpenTelemetry目标是提供多语言统一API和SDK让应用可以向外输出各类遥测数据对接任意指标、链路后端。Jaeger定位主要是链路追踪后端接收追踪遥测数据负责数据处理、聚合、分析与可视化展示。Jaeger最初基于OpenTracing标准设计UI界面中仍保留OpenTracing术语但所有概念均可直接映射到OpenTelemetry追踪数据模型。能力说明OpenTracing 概念OpenTelemetry 概念将追踪表达为有向无环图不限于树形结构span references跨度引用span links跨度链接强类型跨度属性span tags标签span attributes属性强类型事件 / 日志span logs跨度日志span events跨度事件1.4 Docker 部署docker-compose.yml直接部署version:3.8services:# Jaeger v2 jaeger:image:cr.jaegertracing.io/jaegertracing/jaeger:2.20.0container_name:jaegeruser:rootports:-16686:16686# Jaeger Web UI-4317:4317# OTLP gRPC receiver-4318:4318# OTLP HTTP receiver-5778:5778# Config service / sampling strategies-9411:9411# Zipkin HTTP endpoint (兼容Zipkin客户端)environment:-COLLECTOR_OTLP_ENABLEDtrue-SPAN_STORAGE_TYPEbadger-BADGER_EPHEMERALfalse-BADGER_DIRECTORY_VALUE/badger/data-BADGER_DIRECTORY_KEY/badger/keyvolumes:-jaeger_data:/badgervolumes:jaeger_data:启动docker-composeup-d访问地址http://127.0.0.1:166861.5 vs Zipkin二者都是链路后端存储可视化服务Zipkin轻量老牌Jaeger v2云原生新标准CNCF毕业项目。核心对比表对比维度ZipkinJaeger(v2)项目归属OpenZipkin 社区CNCF 毕业项目底层架构极简单体架构读写不分离模块化架构Collector / Query / Ingester可独立扩缩容All-in-One 模式用于测试标准协议原生 Zipkin 协议JSON/Thrift不原生支持 OTLP新版本虽支持但非主流原生优先 OTLPOpenTelemetry 标准同时兼容 Zipkin 格式平滑迁移老系统数据模型简洁面向 Dapper 经典模型兼容 OpenTracing OpenTelemetry支持span links、事件、丰富属性采样能力仅基础概率采样无远程动态自适应采样头部采样 尾部采样 自适应采样支持远程下发采样策略端口5778拓扑依赖图仅一跳直连依赖图两种拓扑系统架构图 深度传递依赖图支持区分服务/接口粒度特有功能追求极简功能克制SPM服务性能监控、采集后数据处理流水线、丰富查询过滤存储支持Cassandra、Elasticsearch、MySQL、内存Cassandra、Elasticsearch、OpenSearch、Badger本地存储、Kafka缓冲、自定义存储扩展UI能力简洁够用适合小规模缺少高级分析功能更强支持超大链路数万条Span、时序指标面板生态趋势存量主流新项目逐步边缘化OpenTelemetry 官方已标记 Zipkin Exporter 为废弃云原生事实首选深度绑定 OpenTelemetry1.6 vs Apache SkyWalking本质差异Jaeger v2专注分布式链路追踪后端遵循OpenTelemetry云原生标准SkyWalkingApache顶级一体化APM平台原生支持Trace/Metrics/Logs三合一。核心对比表对比维度Jaeger(v2)Apache SkyWalking项目归属CNCF 毕业项目Uber开源Apache 顶级开源项目国内生态成熟设计定位专业链路追踪系统重心聚焦Trace查询、分析指标、日志需要外部组件补齐一站式完整APM平台链路、时序指标、日志、性能剖析、告警全部内置底层架构Collector / Query / Storage 模块化All-in-One 用于测试基于 OpenTelemetry CollectorOAP 后端 Agent UI轻Agent、重后端聚合、计算、告警下沉到OAP数据协议原生优先 OTLP兼容旧 Jaeger Thrift、Zipkin主推 OpenTelemetry SDK原生 SW 自定义协议兼容 OTLP/Zipkin v2支持 OpenTelemetry 接入但非原生首选埋点方式依赖 OpenTelemetry SDK无内置字节码Agent代码无侵入内置强大 Java Agent字节码增强零代码埋点同时支持OpenTelemetry手动埋点数据模型完全遵循 OpenTelemetry 规范span links、事件、属性完善自有Segment模型兼容OTel数据模型上下文传递默认sw8协议头采样策略头部采样、尾部采样、自适应采样支持远程动态采样配置5778端口固定比例采样、速率限制、慢请求/异常条件采样双层采样AgentOAP拓扑依赖图自动推导服务依赖基础架构拓扑 深度链路依赖图拓扑能力更强区分服务/实例/接口粒度支持数据库、消息中间件完整依赖展示指标能力内置SPM生成RED指标无法独立替代Prometheus指标体系薄弱原生内置完整服务指标RED、JVM、中间件开箱即用不依赖外部监控组件告警体系无原生告警告警规则依赖 Prometheus Alertmanager内置告警引擎支持多维度告警规则原生对接Webhook无需额外组件日志联动仅标准兼容需要 Loki 等外部系统打通TraceID原生日志-Trace关联Agent自动携带Trace上下文一站式检索性能剖析无内置Profiling支持Java代码剖析、eBPF无侵入剖析存储支持Badger、Elasticsearch、Cassandra、Kafka缓冲Elasticsearch、BanyanDB、MySQL、TiDBUI能力链路查询、Trace对比、瀑布图、SPM面板UI专注链路排障完整大盘、服务监控、拓扑、链路、日志、告警统一控制台开箱即用生态趋势云原生、OpenTelemetry标准路线首选多语言混合栈、Service Mesh友好国内微服务Java为主大规模落地极广适合希望一套组件搞定监控的团队运维成本单纯链路组件完整可观测体系需要搭配 Prometheus Loki Grafana单体一体化起步运维简单大规模集群OAP需要横向扩容调优2. OpenTelemetry官网主页GitHub 组织主地址2.1 OTLP 协议OpenTelemetry官方定义的遥测数据传输协议是云原生可观测领域事实标准。作用应用程序把Traces链路、Metrics指标、Logs日志三类遥测数据通过统一协议发送到采集后端。支持两种通信模式OTLP/gRPC默认端口4317二进制传输性能更高生产首选OTLP/HTTP默认端口4318 Protobuf编码通过HTTP承载防火墙友好部分环境备选。核心优势统一标准一套协议承载Trace/Metric/Log三类遥测不再每种数据单独一套协议。跨语言通用Java/Go/Python/JS/Rust所有OpenTelemetry SDK统一输出OTLP。生态广泛兼容OTel Collector、Jaegerv2、Tempo、SigNoz、Loki、各类商业APM原生支持OTLP。可扩展支持携带Baggage、Exemplars指标样例Metrics关联Trace完全对齐W3C追踪规范。2.2 OTel 框架OpenTelemetryOTel是CNCF毕业级开源项目一套厂商无关、标准化的可观测埋点框架。一次埋点可以把数据发送到任意后端Jaeger、Tempo、Prometheus、Loki、SkyWalking、商用APM等。核心组成多语言SDKJava/Go/Python/JS等提供统一API用来手动埋点、自动采集HTTP、RPC、数据库、MQ。输出标准格式OTLP。OpenTelemetry CollectorOTel Collector独立中间代理进程。接收应用上报的遥测数据 → 处理过滤、采样、转换协议→ 转发到存储后端。支持同时接收OTLP、Zipkin、Jaeger格式数据起到过渡和解耦作用。发展历史2.3 vs BraveBraveOpenZipkin是Java链路客户端SDK负责创建Span、管理生命周期、B3追踪上下文传播输出格式Zipkin协议Thrift/JSON。Brave没有被淘汰但属于「存量稳健方案不再是新项目首选」生态天花板明显长期趋势边缘化。2.4 vs MicrometerMicrometer是Java 生态专属的遥测门面层OpenTelemetry是跨语言、覆盖三类遥测信号的完整标准规范 与 SDK 体系。Micrometer最初聚焦指标Metrics拥有独立指标模型作为统一门面可以向Prometheus、InfluxDB、Graphite、OTLP等多种监控后端输出指标数据。链路追踪micrometer-tracing提供追踪统一抽象API内置NOOP空实现本身不具备完整追踪能力可以二选一桥接底层实现BraveZipkin生态OpenTelemetry Java SDK依赖micrometer-tracing-bridge-otel最终输出标准OTLP追踪数据日志Micrometer项目没有定义日志仪器化 API 不负责应用日志采集。业务日志一般依托Logback/Log4j2结合OpenTelemetry日志桥接或OTel Collector完成采集。对比维度MicrometerOpenTelemetry定位Java生态专属遥测门面(Facade)跨语言完整遥测标准规范 SDK实现支持语言仅Java/JVMJava、Go、Python、JS、.NET、Rust等全主流语言遥测信号覆盖Metrics Tracing❌无日志仪器化APITraces / Metrics / Logs 三位一体完整标准指标模型自有独立指标模型输出OTLP时需要模型转换原生OTel Metric规范OTLP原生语义指标能力依赖OTel❌ 完全独立otlp-registry只是协议导出器原生内置Metrics SDK链路追踪实现micrometer-tracing提供抽象API底层二选一Brave / OpenTelemetry桥接模式SDK原生实现Span、上下文传播日志处理不负责日志采集、日志埋点API提供日志仪器规范、日志桥接方案典型使用场景Spring Boot 默认监控兼容Prometheus等传统监控云原生跨服务、多语言系统统一OTLP采集链路业务代码耦合面向 Micrometer API切换底层实现无需改业务代码面向 OpenTelemetry 官方API3. 依赖配置完整POM示例dependencyManagementdependenciesdependencygroupIdio.micrometer/groupIdartifactIdmicrometer-bom/artifactIdversion1.17.0/versiontypepom/typescopeimport/scope/dependencydependencygroupIdio.micrometer/groupIdartifactIdmicrometer-tracing-bom/artifactIdversion1.7.0/versiontypepom/typescopeimport/scope/dependency!-- 引入 OTel Instrumentation BOM 避免版本冲突 --dependencygroupIdio.opentelemetry.instrumentation/groupIdartifactIdopentelemetry-instrumentation-bom/artifactIdversion2.30.0/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdio.micrometer/groupIdartifactIdmicrometer-core/artifactId/dependency!-- Micrometer Tracing 抽象 --dependencygroupIdio.micrometer/groupIdartifactIdmicrometer-tracing/artifactId/dependency!-- OTel桥接用于生成 Span --dependencygroupIdio.micrometer/groupIdartifactIdmicrometer-tracing-bridge-otel/artifactId/dependency!-- OTel OTLP ExporterTracing 通过 OTLP 协议导出到 Jeager--dependencygroupIdio.opentelemetry/groupIdartifactIdopentelemetry-exporter-otlp/artifactId/dependency/dependencies3.1 Micrometer Tracing 门面Micrometer Tracing提供物料清单BOM统一管理所有子模块版本。Maven依赖示例dependencyManagementdependenciesdependencygroupIdio.micrometer/groupIdartifactIdmicrometer-tracing-bom/artifactIdversion${micrometer-tracing.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdio.micrometer/groupIdartifactIdmicrometer-tracing/artifactId/dependency/dependencies3.2 追踪器核心模块 (micrometer-tracing)只定义接口不引入任何具体追踪库需要引入对应的追踪桥接实现模块micrometer-tracing-bridge-bravemicrometer-tracing-bridge-otel核心模块micrometer-tracing的追踪器Tracer只提供了NOOP的空壳// 来自 Tracer.java — 核心模块只定义接口 NOOP 实现TracerNOOPnewTracer(){OverridepublicSpannextSpan(){returnSpan.NOOP;// 返回空 Span不做任何事}// ...};如果没有桥接实现你拿到的永远是这个NOOP所有Span都不会被记录所有追踪数据都石沉大海。这就像你有了SLF4J的Logger接口但没有Logback或Log4j2的实现一样。桥接实现做了真正的委托工作// 来自 BraveTracer.java — 桥接实现真正干活publicclassBraveTracerimplementsTracer{privatefinalbrave.Tracertracer;// ← 真实的 Brave TracerOverridepublicSpannextSpan(){returnnewBraveSpan(this.tracer.nextSpan());// ← 委托给 Brave}}Micrometer Tracing支持以下追踪实现OpenZipkin BraveOpenTelemetry下述Maven依赖示例前提已引入Micrometer Tracing BOMBrave追踪器dependencygroupIdio.micrometer/groupIdartifactIdmicrometer-tracing-bridge-brave/artifactId/dependencyOpenTelemetry追踪器本次引入dependencygroupIdio.micrometer/groupIdartifactIdmicrometer-tracing-bridge-otel/artifactId/dependency⚠️ 注意类路径中只能选择一种桥接实现不要同时引入两个桥接包。3.3 导出器桥接实现解决了怎么创建Span链路再往前一步但Span创建出来后往哪发这就轮到导出器/上报器了。Micrometer Tracing不重复造轮子真正的导出能力来自Brave和OpenTelemetry的原生生态。Wavefront上报器已标记废弃Wavefront官方已发布生命周期终止公告。Brave自带对Zipkin的一等支持支持多种传输方式导出方式Brave 依赖Zipkin (HTTP)io.zipkin.reporter2:zipkin-sender-urlconnectionZipkin (Kafka)io.zipkin.reporter2:zipkin-sender-kafkaZipkin (RabbitMQ)io.zipkin.reporter2:zipkin-sender-amqp-clientZipkin (ActiveMQ)io.zipkin.reporter2:zipkin-sender-activemqOpenTelemetry的生态更加丰富导出方式OTel 依赖OTLP (gRPC/HTTP)io.opentelemetry:opentelemetry-exporter-otlpZipkinio.opentelemetry:opentelemetry-exporter-zipkinJaeger (gRPC/Thrift)io.opentelemetry:opentelemetry-exporter-jaegerLoggingio.opentelemetry:opentelemetry-exporter-loggingPrometheus通过OTel Collector间接支持这里使用的opentelemetry-exporter-otlp是OpenTelemetry官方提供的标准化导出器通过OTLP协议gRPC或HTTP将Span数据发送到任意兼容的后端如Jaeger、Grafana Tempo、OTel Collector、Datadog等。通过OpenTelemetryBOM来统一管理版本!-- 引入 OTel Instrumentation BOM 避免版本冲突 --dependencygroupIdio.opentelemetry.instrumentation/groupIdartifactIdopentelemetry-instrumentation-bom/artifactIdversion2.30.0/versiontypepom/typescopeimport/scope/dependency引入opentelemetry-exporter-otlp!-- OTel OTLP ExporterTracing 通过 OTLP 导出--dependencygroupIdio.opentelemetry/groupIdartifactIdopentelemetry-exporter-otlp/artifactId/dependency
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进