追蹤
概覽
Apache Dubbo 透過 Micrometer Observations 和 Micrometer 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 支援 Brave 和 OpenTelemetry 作為 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
(客戶端)版本,並將它們註冊到 ApplicationModel
的 BeanFactory
中。要重複使用現有的,請檢查 DefaultDubboServerObservationConvention
(伺服器端)和 DefaultDubboClientObservationConvention
(客戶端)。
6. 範例設定
由於 Micrometer Observation 是 Micrometer 1.10 中的新功能,因此 Spring Boot 2 沒有開箱即用的配置(SB2 使用 Micrometer 1.9)。在此範例中,您可以看到 Micrometer Observation 如何與 OpenTelemetry Bridge 一起手動設定。