使用 OpenTelemetry Java 代理或
opentelemetry-spring-starter
时,它可以自动检测 Spring MVC 和 Spring Data。这为控制器方法和存储库操作提供了跨度,然后您可以在 Grafana Tempo 或 Jaeger 等工具中对其进行可视化。但是,当我尝试使用 Spring 推荐的方法(具体而言,以 micrometer-tracing
和 opentelemetry-exporter-otlp
作为桥梁时),我只能获得 HTTP 请求检测。我还没有找到使用此设置为 Spring MVC 或数据库层添加跨度的方法。
我发现的存储库检测的唯一解决方案是包含以下依赖项,它将数据库层详细信息添加到跨度中,但该库看起来还不成熟:
<dependency>
<groupId>net.ttddyy.observation</groupId>
<artifactId>datasource-micrometer-spring-boot</artifactId>
</dependency>
即便如此,我仍然没有看到任何与Spring MVC相关的信息。
用
micrometer-tracing
可以达到这种水平的仪器吗?
目前,直接 OpenTelemetry 方法似乎提供了更丰富的开箱即用跨度。
如果您想使用 OpenTelemetry 进行 Micrometer 跟踪,则需要手动配置。
1- 包括
Micrometer tracing
和 OpenTelemetry
的依赖项:
<dependencies>
<!-- Micrometer Tracing -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-otel</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>io.opentelemetry</groupId>
<artifactId>opentelemetry-exporter-otlp</artifactId>
<version>1.10.0</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing</artifactId>
<version>1.0.0</version>
</dependency>
<!-- Spring Boot Starter for Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot Starter for Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Optional: Additional library for database-layer instrumentation -->
<dependency>
<groupId>net.ttddyy.observation</groupId>
<artifactId>datasource-micrometer-spring-boot</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
2- 配置 Micrometer 跟踪并打开遥测导出器:
在您的 application.propeties 中添加此内容,但请填写正确的 otlp 端点:
management.tracing.enabled=true
management.tracing.sampling.probability=1.0
management.tracing.exporter.otlp.endpoint=http://localhost:4317
3- 添加必要的 Spring 配置:
import io.micrometer.tracing.Tracer;
import io.micrometer.tracing.exporter.SpanExporter;
import io.micrometer.tracing.exporter.otlp.OtlpSpanExporter;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TracingConfiguration {
@Bean
public SpanExporter spanExporter() {
return new OtlpSpanExporter(OtlpGrpcSpanExporter.builder().setEndpoint("http://localhost:4317").build());
}
@Bean
public TracerProvider tracerProvider(SpanExporter spanExporter) {
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
.addSpanProcessor(BatchSpanProcessor.builder(spanExporter).build())
.build();
return sdkTracerProvider;
}
@Bean
public OpenTelemetry openTelemetry(TracerProvider tracerProvider) {
return OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build();
}
@Bean
public Tracer tracer(OpenTelemetry openTelemetry) {
return openTelemetry.getTracer("io.micrometer.tracing");
}
}