使用 Azure Monitor OpenTelemetry Exporter 客户端库自动导出 Spring Cloud Sleuth 跨度 Java

Exporting Spring Cloud Sleuth spans automatically using Azure Monitor OpenTelemetry Exporter client library for Java

我正在尝试使用 Azure Monitor OpenTelemetry Exporter client library for Java 将所有 traces/spans 从 Spring Cloud Sleuth 导出到 Azure Monitor。在最近的依赖版本更新后,此集成似乎只适用于最新版本的 Spring Cloud Sleuth。

但是,我不想手动使用 azureMonitorExporter.export(spanData),而是希望通过为 Azure 导出器添加一个配置来为整个应用程序自动导出所有 traces/spans。然后可以轻松地将其添加到新项目中。

我没有太多使用 Spring/Sleuth/OpenTelemetry 的经验,但是 AzureMonitorExporter 实现了 SpanExporter,所以我认为一种选择是创建一个包含以下内容的配置 class。

@Bean
public SpanExporter exporter() {
    return new AzureMonitorExporterBuilder()
        .instrumentationKey("{KEY}")
        .buildExporter();
};

然后它可以在主要 class 中使用:

@Autowired
SpanExporter exporter;

但是我不确定这是否是正确的方法或如何从这里继续真正让导出器开始自动导出 traces/spans 到 Azure 监视器。

我的 pom.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.2-SNAPSHOT</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>trace-demo-5-updated</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>trace-demo-5-updated</name>
<description>Demo project for Spring Boot</description>

<properties>
    <java.version>11</java.version>
    <spring-cloud.version>2020.0.0-SNAPSHOT</spring-cloud.version>
</properties>

<dependencies>
    <!-- Sleuth with Brave tracer implementation -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-sleuth</artifactId>

    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    
    <dependency>
      <groupId>com.azure</groupId>
      <artifactId>opentelemetry-exporters-azuremonitor</artifactId>
      <version>1.0.0-beta.1</version>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web-services</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-sleuth-otel</artifactId>
        <version>3.0.0-M6</version>
    </dependency>
</dependencies>

<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>
    </dependencies>
</dependencyManagement>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

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

更新(2020-01-26):

今天在 Azure SDK 中 release of Spring Cloud Sleuth OTel (spring-cloud-sleuth-otel:1.0.0-M3) and The OTel upgrade,您原来的问题应该消失了。

原答案

(TL;DR:最后一段)

Sleuth 3.0 Migration Guide 在这里可以为您提供很多帮助。 Sleuth 支持两个跟踪系统 Brave(默认)和 OpenTelemetry(孵化器)。

为了使用 OpenTelemetry,您需要删除 Brave(仅排除 spring-cloud-sleuth-brave)并添加 OpenTelemetry(spring-cloud-sleuth-otel-autoconfigurespring-cloud-sleuth-otel-dependencies)。请参阅我链接的文档。

执行此操作后,应该使用您的 SpanExporter,这是我根据您的创建的 pom.xml。顺便说一句,添加一个示例项目(例如:在 GitHub 回购中)可以为每个试图提供帮助的人提供很多帮助,这样他们就不需要自己创建一个。

不幸的是,这仍然行不通,你在启动时仍然会遇到这个异常:
Caused by: java.lang.ClassNotFoundException: io.opentelemetry.common.AttributeValue

这是因为opentelemetry-exporters-azuremonitor:1.0.0-beta.1 depends on OpenTelemetry 0.8.0 while the latest spring-cloud-sleuth-otel (1.0.0-M2, we released it today) is using the latest OpenTelemetry (0.13.1). Also, OpenTelemetry introduced breaking changes between minor versions, e.g.: the AttributeValue class was removed in OpenTelemetry 0.9.1.

Sleuth 从 Sleuth 3.0.0-M5 开始支持 OpenTelemetry,当时 OpenTelemetry 版本是 0.10,因此没有可用的 Sleuth 版本支持 opentelemetry-exporters-azuremonitor:1.0.0-beta.1 需要的 OpenTelemetry 版本。

因此解决方案是修复您的 pom.xmlopentelemetry-exporters-azuremonitor 以支持最新的 OpenTelemetry。