完整文档页面(中文翻译)。文末附有来源说明。

阅读英文版

appdevdeep-divesopen-tracing

Ledger API 客户端 OpenTracing

为与 Ledger API 交互的 Daml 应用添加基于 OpenTelemetry 的分布式追踪

简介

分布式追踪用于排查微服务(如 Daml Enterprise)中的性能问题。Canton 监控文档介绍节点侧追踪。本指南说明如何编写 Ledger API 客户端,使 trace 与 span 在客户端与 Canton 间无缝延续。

示例见 GitHub:ex-java-bindings-with-opentelemetry。更广主题见 OpenTelemetryJava instrumentation

搭建 OpenTelemetry 环境

先启动后端(Jaeger/Zipkin/OTLP)。Jaeger 示例:

docker run --rm -it --name jaeger\
-p 16686:16686 \
-p 14250:14250 \
jaegertracing/all-in-one:1.22.0

jaeger.conf

canton.monitoring.tracing.tracer.exporter {
  type = jaeger
  address = "localhost"
  port = 14250
}

启动:bin/canton -c examples/01-simple-topology/simple-topology.conf -c jaeger.conf

添加项目依赖

pom.xml 加入 OpenTelemetry 与 gRPC instrumentation 依赖(版本见 Maven Central)。

初始化

初始化 OpenTelemetry 与 GRPCTelemetry(在 gRPC 头中传播 trace)。参考 OpenTelemetryUtil

OpenTelemetryUtil openTelemetry = new OpenTelemetryUtil(APP_ID);

通过 withClientInterceptor 挂载到 Netty channel:

ManagedChannel channel = openTelemetry.withClientInterceptor(
    ManagedChannelBuilder.forAddress(host, port).usePlaintext()
).build();

创建新 Span

调用 gRPC 前用 runInNewSpan 包裹:

openTelemetry.runInNewSpan("createInitialContracts", () -> submissionService.submit(request));

拦截器会将 span 传播到 Canton。

跨应用延续 Span

可从 UpdateServiceCompletionStream 等返回的 Transaction/Completion 提取 traceContext,再用 runInOpenTelemetryScoperunInNewSpan 延续同一 trace。

串联全流程

规则传递 trace 上下文时,Jaeger UI 可显示完整 span 链:

jaegerPingSpans

本文由 CC Privacy Club 根据 Canton Network 官方文档(CC-BY-4.0)整理翻译,仅供学习;实现细节以官方最新版本为准。