追蹤

概覽

Apache Dubbo 透過 Micrometer ObservationsMicrometer Tracing 內建追蹤功能。

1. 將 Micrometer Observation 加入您的專案

為了將 Micrometer 加入 classpath 並新增 Dubbo 的指標,您需要加入 dubbo-metrics-api 依賴項,如下所示

 <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-metrics-api</artifactId>
        </dependency>

由於使用了 Micrometer Observations,Dubbo 只需設定一次即可獲得監控,但根據設定的不同,可以透過自訂的 ObservationHandlers 發送指標、追蹤或其他訊號。更多資訊請閱讀 docs/observation 底下的文件

2. 將 Micrometer Tracing Bridge 加入您的專案

為了開始為基於 Dubbo 的專案建立 span,需要在 Micrometer Tracing 和實際的 Tracer 之間建立一個 橋接器

注意:Tracer 是一個處理 span 生命週期的程式庫(例如,它可以建立、啟動、停止、取樣、回報 span)。

Micrometer Tracing 支援 BraveOpenTelemetry 作為 Tracer,如下所示


<!-- 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 Tracing Exporter 加入您的專案

新增 Tracer 後,需要一個匯出器(也稱為報告器)。它是一個匯出已完成 span 並將其發送到報告系統的組件。如下所示,Micrometer Tracer 原生支援 Tanzu Observability by Wavefront 和 Zipkin

Tanzu Observability by Wavefront

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-tracing-reporter-wavefront</artifactId>
</dependency>

使用 Brave 的 OpenZipkin Zipkin

<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-reporter-brave</artifactId>
</dependency>

使用 OpenTelemetry 的 OpenZipkin Zipkin

<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-exporter-zipkin</artifactId>
</dependency>

一個 OpenZipkin URL 發送器依賴項,用於通過 URLConnectionSender 將 span 發送到 Zipkin

<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-sender-urlconnection</artifactId>
</dependency>

您可以在此文件中的 docs/tracing 下方閱讀更多關於追蹤設定的資訊。

4. 設定觀察註冊表

要使用 Micrometer Observation,需要設定 ObservationRegistry。本質上,ObservationRegistry 需要傳遞 ObservationHandler,這些處理器將對觀察的生命週期事件(例如啟動、停止等)做出反應。主要有三種類型的處理器

  • 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("https://#: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

透過使用新的使用 Micrometer Observation 的消費者和提供者 Dubbo 過濾器,在設定註冊表後,將建立指標和追蹤,並在 span 關閉時將其發送到 Zipkin。

重要!從 Spring Boot 3 開始,整個 Micrometer Tracer、Micrometer Core 和 Micrometer Observation 設定都是開箱即用的。您不需要手動設定。

5. 自訂觀察過濾器

要自訂指標(低基數標籤)和 span(低基數和高基數標籤)中存在的標籤,您應該建立自己的 DubboServerObservationConvention(伺服器端)和 DubboClientObservationConvention(客戶端)版本,並將它們註冊到 ApplicationModelBeanFactory 中。要重複使用現有的,請檢查 DefaultDubboServerObservationConvention(伺服器端)和 DefaultDubboClientObservationConvention(客戶端)。

6. 範例設定

由於 Micrometer Observation 是 Micrometer 1.10 中的新功能,因此 Spring Boot 2 沒有開箱即用的配置(SB2 使用 Micrometer 1.9)。在此範例中,您可以看到 Micrometer Observation 如何與 OpenTelemetry Bridge 一起手動設定。


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