使用Spring Cloud Sleuth和OpenTelemetry實現分散式跟蹤

banq發表於2021-11-09

Spring Cloud Sleuth 和 OpenTelemetry 是一個強大的組合,可以利用您現有的 Spring Boot 應用程式併為您提供超越日誌和指標的洞察力。
此處顯示的所有示例均可在https://github.com/xsreality/spring-boot-tracing-demo 
在即將推出的 Spring Cloud 2021.0 中支援 Spring Cloud Sleuth 的整合
OpenTelemetry 提供了一個代理 (JAR) 來附加 Java 應用程式以生成跟蹤。但誰真的想和代理商打交道呢?感謝 Spring Cloud Sleuth 抽象,它將檢測委託給 OpenTelemetry 並允許我們快速啟動和執行。
啟用它的方法:

<properties>
    <spring-cloud.version>2021.0.0-M2</spring-cloud.version>
    <spring-cloud-sleuth-otel.version>1.1.0-M3</spring-cloud-sleuth-otel.version>
    <opentelemetry-exporter-otlp>1.7.0</opentelemetry-exporter-otlp>
    <grpc-netty-shaded>1.41.0</grpc-netty-shaded>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

        <!-- Spring Cloud Sleuth OTel requires a Spring Cloud Sleuth OTel BOM -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-otel-dependencies</artifactId>
            <version>${spring-cloud-sleuth-otel.version}</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
    </dependencies>
</dependencyManagement>

<!-- Sleuth with Brave tracer implementation -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    <exclusions>
        <!-- Exclude Brave (the default) -->
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-sleuth-brave</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- Add OpenTelemetry tracer -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-sleuth-otel-autoconfigure</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-exporter-otlp -->
<dependency>
    <groupId>io.opentelemetry</groupId>
    <artifactId>opentelemetry-exporter-otlp</artifactId>
    <version>${opentelemetry-exporter-otlp}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.grpc/grpc-netty -->
<dependency>
    <groupId>io.grpc</groupId>
    <artifactId>grpc-netty-shaded</artifactId>
    <version>${grpc-netty-shaded}</version>
</dependency>

<repositories>
    <repository>
        <id>spring-snapshots</id>
        <url>https://repo.spring.io/snapshot</url>
        <snapshots>
            <enabled>true</enabled>
        </snapshots>
    </repository>
    <repository>
        <id>spring-milestones</id>
        <url>https://repo.spring.io/milestone</url>
    </repository>
</repositories>
<pluginRepositories>
    <pluginRepository>
        <id>spring-snapshots</id>
        <url>https://repo.spring.io/snapshot</url>
    </pluginRepository>
    <pluginRepository>
        <id>spring-milestones</id>
        <url>https://repo.spring.io/milestone</url>
    </pluginRepository>
</pluginRepositories>
 

原始碼可在https://github.com/xsreality/spring-boot-tracing-demo 獲得
執行應用程式會建立透過Logback MDC包含在日誌行中的 Trace 和 Span ID 。這些將如下所示:

2021-11-06 00:10:02.278  INFO [http-service2,8a45749d445c4e5c4846c931d7f488c5,36a8075ff900ddd4] 9068 --- [nio-8081-exec-1] com.example.HomeController : Another bug bites the dust

如果您的應用程式使用自定義日誌模式並且您沒有在日誌中看到跟蹤 ID,請切換到 Spring 使用的預設模式或至少使用該LOG_LEVEL_PATTERN變數:

<property name="CONSOLE_LOG_PATTERN"
          value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>




任何支援 OTEL 協議 (OTLP) 的系統均可用於匯出跟蹤。越來越多的系統正在新增對 OTEL 的支援, 3 個工具——Honeycomb、Grafana Tempo 和 Elastic APM。
匯出跨度跟蹤很容易。只需在 application.yaml 中新增以下屬性

spring.sleuth.otel.exporter.otlp.endpoint: https://api.honeycomb.io
spring.sleuth.otel.exporter.otlp.headers.x-honeycomb-team: xxx
spring.sleuth.otel.exporter.otlp.headers.x-honeycomb-dataset: dataset



 

相關文章