跟踪

概述

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 追踪支持 BraveOpenTelemetry 作为跟踪器,如下所示


<!-- 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(客户端)版本,并在 ApplicationModelBeanFactory 中注册它们。要重用现有的版本,请检查 DefaultDubboServerObservationConvention(服务器端)和 DefaultDubboClientObservationConvention(客户端)。

6. 示例设置

由于 Micrometer 观测是 Micrometer 1.10 中的新功能,因此 Spring Boot 2 并没有开箱即用地配置它(SB2 使用 Micrometer 1.9)。在这个 演示示例中,您可以看到如何手动设置 Micrometer 观测以及 OpenTelemetry 桥。


上次修改时间:2023 年 1 月 31 日:更新 tracing.md (#1954) (902bc7e73be)