Spring Boot集成Micrometer与OpenTelemetry后追踪数据间歇性缺失
Spring Boot 对接OpenObserve时追踪记录间歇性缺失
我在Spring Boot应用中使用Micrometer Tracing + OpenTelemetry搭建分布式追踪,将数据发送至OpenObserve实例,但遇到了追踪记录仅间歇性生成的问题。
现有配置
pom.xml 依赖
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-otlp</artifactId> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-otlp</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-tracing-bridge-otel</artifactId> </dependency> <dependency> <groupId>com.squareup.okio</groupId> <artifactId>okio</artifactId> <version>3.9.1</version> </dependency> <dependency> <groupId>io.opentelemetry.instrumentation</groupId> <artifactId>opentelemetry-logback-appender-1.0</artifactId> <version>2.11.0-alpha</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-otlp-logs</artifactId> <version>1.26.0-alpha</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk-logs</artifactId> </dependency>
application.yml 配置
management: otlp: metrics: export: url: ${OPEN_OBSERVE_URL}/api/${OPEN_OBSERVE_ORG_NAME}/v1/metrics enabled: true step: 1m headers: enabled: true Authorization: Basic ${OPEN_OBSERVE_PASSWORD} organization: default service: name: default tracing: export: enabled: true sampling: probability: 1.0 endpoint: ${OPEN_OBSERVE_URL}/api/${OPEN_OBSERVE_ORG_NAME}/v1/traces headers: active : true enabled: true Authorization: Basic ${TECHBD_OPEN_OBSERVE_PASSWORD} organization: default stream-name: ${OPEN_OBSERVE_STREAM_NAME}-traces service: name: default
已知信息
- OPEN_OBSERVE_* 环境变量已正确配置,启动日志确认已解析到最终配置中
- 使用logback-appender-1.0将追踪与跨度集成到现有日志,logback配置模式
%-X{traceId}已验证可用
排查与修复建议
修正配置层级错误
原配置中tracing节点下的endpoint和headers层级不符合规范,且service.name不应放在headers中,修正后的配置:management: otlp: tracing: export: enabled: true sampling: probability: 1.0 endpoint: ${OPEN_OBSERVE_URL}/api/${OPEN_OBSERVE_ORG_NAME}/v1/traces headers: Authorization: Basic ${TECHBD_OPEN_OBSERVE_PASSWORD} organization: default stream-name: ${OPEN_OBSERVE_STREAM_NAME}-traces batch: schedule-delay: 1000 # 1秒触发一次批量发送 tracing: sampling: probability: 1.0 service: name: default # 服务名称配置到此处调整OTLP批处理参数
OpenTelemetry默认批量发送数据,若未达到阈值会延迟推送,添加批处理配置确保数据及时发送:management: otlp: tracing: export: batch: max-queue-size: 1000 schedule-delay: 1000 export-timeout: 5000 max-exporter-batch-size: 512替换不稳定依赖
当前使用的OpenTelemetry日志相关依赖为alpha版本,稳定性不足易导致数据丢失,建议替换为对应稳定版(对齐OpenTelemetry核心版本)。开启DEBUG日志排查发送问题
开启OTLP导出和追踪模块的DEBUG日志,查看是否存在请求失败、超时等情况:logging: level: io.opentelemetry.exporter.otlp: DEBUG io.micrometer.tracing: DEBUG验证异步上下文传递
若应用存在异步操作(线程池、@Async方法),需确保追踪上下文正确传递,例如为线程池添加上下文装饰器:@Bean public Executor asyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); executor.setQueueCapacity(25); executor.setThreadNamePrefix("Async-"); executor.setTaskDecorator(new ObservationTaskDecorator()); executor.initialize(); return executor; }
内容的提问来源于stack exchange,提问作者Sabith Citrus
相关产品推荐
相关产品推荐

