我有一个想要监控的 Spring Boot 3 应用程序。我想将其跟踪发布到 OpenTelemetry 收集器,以便稍后可以在 Grafana 实例上存储和显示它们。
由于此应用程序目前正在测试中,因此要求之一是将 100% 的跟踪发布到收集器,以收集尽可能多的有关其处理的请求的信息。
我从头开始创建了一个全新的 Spring Boot 项目,该项目依赖于
spring-boot-starter-web
和 opentelemetry-spring-boot-starter
。
<?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>3.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>io.github.tiagoanleite</groupId>
<artifactId>spring-boot-opentelemetry</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>spring-boot-opentelemetry</name>
<description>Demo project for Spring Boot + OpenTelemetry</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-instrumentation-bom</artifactId>
<version>2.11.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- tag::actuator[] -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- end::actuator[] -->
<!-- tag::persistence[] -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<!-- end::persistence[] -->
<!-- tag::opentelemetry[] -->
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>io.opentelemetry.contrib</groupId>
<artifactId>opentelemetry-samplers</artifactId>
<version>1.42.0-alpha</version>
</dependency>
<!-- end::opentelemetry[] -->
<!-- tag::tests[] -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- end::tests[] -->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
基于 Spring 的跟踪文档,我还通过将
management.tracing.sampling.probability
属性添加到我的 application.yml 中,将跟踪概率更改为 100%:
spring:
datasource:
url: "jdbc:h2:mem:db"
management:
endpoints:
web:
exposure:
include: "*"
tracing:
sampling:
probability: 1.0
为了检查应用程序是否正在发布请求跟踪,我创建了一个简单的 REST 控制器,它公开了
/hello
端点:
package io.github.tiagoanleite;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String index() {
return "Greetings from Spring Boot!";
}
}
但是,并非我对应用程序执行的所有请求都会产生跟踪。根据我的经验,每 10 个
GET /hello
请求,我都会发布 3 或 4 个跟踪,而不是我预期的 10 个。
我错过了什么?这是我第一次使用 OpenTelemetry,我不确定这是否是预期的行为,或者是否需要添加任何其他配置来实现我的目标。
您的 Spring Boot 可观察性支持配置是正确的,但您的应用程序未使用它。您的应用程序正在使用
opentelemetry-spring-boot-starter
,它不是由 Spring 团队维护的。这意味着不能保证与可观察性相关的 Spring Boot 文档适用于您的案例,您应该参考此入门文档。
我相信你可以使用这个资源属性来配置它。
请注意,Spring Boot 文档中指出了这种行为差异。如果您打算使用 Spring Boot 支持,则可以删除
io.opentelemetry
依赖项,使用执行器启动器并参考 Spring Boot 文档。