跟踪
概述
Apache Dubbo 通过 Micrometer 观测 和 Micrometer 追踪 内置了追踪功能。
1. 将 Micrometer 观测添加到您的项目
为了将 Micrometer 添加到类路径并为 Dubbo 添加指标,您需要添加 dubbo-metrics-api
依赖项,如下所示
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-metrics-api</artifactId>
</dependency>
由于使用了 Micrometer 观测,Dubbo 只被检测了一次,但根据设置,将允许通过自定义 ObservationHandlers
发射指标、跟踪器或其他信号。有关更多信息,请阅读 docs/observation 下的文档。
2. 将 Micrometer 追踪桥添加到您的项目
为了开始为基于 Dubbo 的项目创建跨度,需要在 Micrometer 追踪和实际跟踪器之间建立一个“桥梁”。
注意:跟踪器是一个处理跨度生命周期的库(例如,它可以创建、启动、停止、采样、报告跨度)。
Micrometer 追踪支持 Brave 和 OpenTelemetry 作为跟踪器,如下所示
<!-- Brave Tracer -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
<!-- OpenTelemetry Tracer -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-otel</artifactId>
</dependency>
3. 将 Micrometer 追踪导出器添加到您的项目
添加了跟踪器后,需要一个导出器(也称为报告器)。它是一个组件,将导出完成的跨度并将其发送到报告系统。Micrometer 跟踪器原生支持 Tanzu Observability by Wavefront 和 Zipkin,如下所示
Tanzu Observability by Wavefront
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-reporter-wavefront</artifactId>
</dependency>
OpenZipkin Zipkin with Brave
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-reporter-brave</artifactId>
</dependency>
OpenZipkin Zipkin with OpenTelemetry
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-zipkin</artifactId>
</dependency>
一个 OpenZipkin URL 发送器依赖项,用于通过 URLConnectionSender 将跨度发送到 Zipkin
<dependency>
<groupId>io.zipkin.reporter2</groupId>
<artifactId>zipkin-sender-urlconnection</artifactId>
</dependency>
您可以在 此文档的 docs/tracing 下 阅读有关追踪设置的更多信息。
4. 设置观测注册表
要使用 Micrometer 观测,需要设置一个 ObservationRegistry
。本质上,ObservationRegistry
需要传递 ObservationHandler
,这些 ObservationHandler
将对观测的生命周期事件(如启动、停止等)做出反应。主要有 3 种类型的处理程序
MeterObservationHandler
- 与指标相关的处理程序(来自micrometer-core
)TracingObservationHandler
- 与追踪相关的处理程序(来自micrometer-tracing
)ObservationHandler
- 任何其他处理程序
ObservationRegistry
将遍历所有处理程序,并选择所有匹配的处理程序。最佳实践是将所有 MeterObservationHandler
放入一个 FirstMatchingCompositeObservationHandler
中,并将所有 TracingObservationHandler
放入另一个复合处理程序中,以便分别只执行一个。此类设置的示例可以在下面找到(最新的副本维护在 docs/tracing 下)。
// ----- MICROMETER TRACING + BRAVE -----
// [Brave component] Example of using a SpanHandler. SpanHandler is a component
// that gets called when a span is finished. Here we have an example of setting it
// up with sending spans
// in a Zipkin format to the provided location via the UrlConnectionSender
// (through the <io.zipkin.reporter2:zipkin-sender-urlconnection> dependency)
// Another option could be to use a TestSpanHandler for testing purposes.
SpanHandler spanHandler = ZipkinSpanHandler
.create(AsyncReporter.create(URLConnectionSender.create("http://localhost:9411/api/v2/spans")));
// [Brave component] CurrentTraceContext is a Brave component that allows you to
// retrieve the current TraceContext.
StrictCurrentTraceContext braveCurrentTraceContext = StrictCurrentTraceContext.create();
// [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave's
// CurrentTraceContext
CurrentTraceContext bridgeContext = new BraveCurrentTraceContext(this.braveCurrentTraceContext);
// [Brave component] Tracing is the root component that allows to configure the
// tracer, handlers, context propagation etc.
Tracing tracing = Tracing.newBuilder().currentTraceContext(this.braveCurrentTraceContext).supportsJoin(false)
.traceId128Bit(true)
// For Baggage to work you need to provide a list of fields to propagate
.propagationFactory(BaggagePropagation.newFactoryBuilder(B3Propagation.FACTORY)
.add(BaggagePropagationConfig.SingleBaggageField
.remote(BaggageField.create("from_span_in_scope 1")))
.add(BaggagePropagationConfig.SingleBaggageField
.remote(BaggageField.create("from_span_in_scope 2")))
.add(BaggagePropagationConfig.SingleBaggageField.remote(BaggageField.create("from_span")))
.build())
.sampler(Sampler.ALWAYS_SAMPLE).addSpanHandler(this.spanHandler).build();
// [Brave component] Tracer is a component that handles the life-cycle of a span
brave.Tracer braveTracer = tracing.tracer();
// [Micrometer Tracing component] A wrapper for Brave's Propagator
Propagator propagator = new BravePropagator(tracing);
// [Micrometer Tracing component] A Micrometer Tracing wrapper for Brave's Tracer
Tracer tracer = new BraveTracer(braveTracer, bridgeContext, new BraveBaggageManager());
// ----- MICROMETER CORE -----
MeterRegistry meterRegistry = new SimpleMeterRegistry();
// ----- MICROMETER OBSERVATION -----
ObservationRegistry observationRegistry = ObservationRegistry.create();
// Adding metrics handler
observationRegistry.observationConfig().observationHandler(new TracingAwareMeterObservationHandler<>(new DefaultMeterObservationHandler(meterRegistry), tracer));
// Adding tracing handlers
observationRegistry.observationConfig()
.observationHandler(new ObservationHandler.FirstMatchingCompositeObservationHandler(new PropagatingReceiverTracingObservationHandler<>(tracer, propagator), new PropagatingSenderTracingObservationHandler<>(tracer, propagator), new DefaultTracingObservationHandler(tracer)));
// ----- DUBBO -----
ApplicationModel applicationModel = ApplicationModel.defaultModel();
applicationModel.getBeanFactory().registerBean(observationRegistry);
// reuse the applicationModel in your system
通过使用新的消费者和提供者 Dubbo 过滤器,这些过滤器使用 Micrometer 观测,在设置了注册表后,将创建指标和跟踪,并且跨度将在关闭时发送到 Zipkin。
重要!从 Spring Boot 3 开始,整个 Micrometer 跟踪器、Micrometer Core 和 Micrometer 观测设置开箱即用。您无需手动设置它。
5. 自定义观测过滤器
要自定义指标中存在的标签(低基数标签)和跨度中存在的标签(低基数和高基数标签),您应该创建自己的 DubboServerObservationConvention
(服务器端)和 DubboClientObservationConvention
(客户端)版本,并在 ApplicationModel
的 BeanFactory
中注册它们。要重用现有的版本,请检查 DefaultDubboServerObservationConvention
(服务器端)和 DefaultDubboClientObservationConvention
(客户端)。
6. 示例设置
由于 Micrometer 观测是 Micrometer 1.10 中的新功能,因此 Spring Boot 2 并没有开箱即用地配置它(SB2 使用 Micrometer 1.9)。在这个 演示示例中,您可以看到如何手动设置 Micrometer 观测以及 OpenTelemetry 桥。