Spring Boot集成OpenTelemetry:指标导出失败及服务名称异常问题
Spring Boot + OpenTelemetry + VictoriaMetrics 集成问题排查与修复
我正在尝试将OpenTelemetry与Spring Boot应用集成,将指标导出至VictoriaMetrics,但遇到两个核心问题:指标未送达VictoriaMetrics,以及服务名称显示为unknown_service:java。以下是我的配置详情、日志信息,以及对应的解决方案:
一、配置详情
1. Java类实现
RestartMetrics.java
public class RestartMetrics { private static final String SERVICE_NAME = "springboot-service"; private final LongCounter restartCounter; public RestartMetrics(MeterProvider meterProvider) { Meter meter = meterProvider.get(SERVICE_NAME + ".restart.metrics"); this.restartCounter = meter.counterBuilder("service.restart.count") .setDescription("Tracks the number of service restarts") .build(); } @PostConstruct public void init() { restartCounter.add(1, Attributes.of(AttributeKey.stringKey("service.name"), SERVICE_NAME)); } }
OpenTelemetryConfig.java
public class OpenTelemetryConfig { @Bean public MeterProvider meterProvider() { OtlpGrpcMetricExporter metricExporter = OtlpGrpcMetricExporter.builder() .setEndpoint("http://localhost:4317") .build(); PeriodicMetricReader metricReader = PeriodicMetricReader.builder(metricExporter) .setInterval(Duration.ofMillis(5000)) .build(); return SdkMeterProvider.builder() .registerMetricReader(metricReader) .build(); } }
2. OpenTelemetry Collector配置(otel-collector-config.yaml)
receivers: otlp: protocols: grpc: endpoint: 0.0.0.0:4317 http: endpoint: 0.0.0.0:4318 exporters: prometheusremotewrite: endpoint: http://localhost:8428/api/v1/write resource_to_telemetry_conversion: enabled: true service: pipelines: metrics: receivers: [otlp] exporters: [prometheusremotewrite]
3. Spring Boot应用配置(application.properties)
otel.metrics.exporter=otlp otel.exporter.otlp.endpoint=http://localhost:4317 otel.service.name=springboot-app otel.exporter.otlp.protocol=http/protobuf
4. Maven依赖(pom.xml)
<dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> <version>1.37.0</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-sdk</artifactId> <version>1.37.0</version> </dependency> <dependency> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-exporter-otlp</artifactId> <version>1.36.0</version> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.11.0</version> </dependency>
5. 服务启动命令
VictoriaMetrics
docker run -d -p 8428:8428 --name victoriametrics victoriametrics/victoria-metrics
OpenTelemetry Collector
docker run -v /Users/smith/Documents/Workspace/otel-collector-config.yaml:/etc/otelcol/config.yml -p 4317:4317 otel/opentelemetry-collector
二、OpenTelemetry Collector日志
{"otelcol.component.id": "debug", "otelcol.component.kind": "Exporter", "otelcol.signal": "metrics"} 2025-03-17T07:22:47.997Z info Metrics {"otelcol.component.id": "debug", "otelcol.component.kind": "Exporter", "otelcol.signal": "metrics", "resource metrics": 1, "metrics": 1, "data points": 1} 2025-03-17T07:22:47.997Z info ResourceMetrics #0 Resource SchemaURL: Resource attributes: -> service.name: Str(unknown_service:java) -> telemetry.sdk.language: Str(java) -> telemetry.sdk.name: Str(opentelemetry) -> telemetry.sdk.version: Str(1.37.0) ScopeMetrics #0 ScopeMetrics SchemaURL: InstrumentationScope springboot-service.restart.metrics Metric #0 Descriptor: -> Name: service.restart.count -> Description: Tracks the number of service restarts -> Unit: -> DataType: Sum -> IsMonotonic: true -> AggregationTemporality: Cumulative NumberDataPoints #0 Data point attributes: -> service.name: Str(springboot-service) StartTimestamp: 2025-03-17 07:05:17.295034 +0000 UTC Timestamp: 2025-03-17 07:22:47.899379 +0000 UTC Value: 1
三、现存问题
- 指标未发送至VictoriaMetrics:无相关导出日志,已确认VictoriaMetrics在localhost:8428正常运行。
- 服务名称显示异常:application.properties中指定
otel.service.name=springboot-app,但Collector日志中显示为unknown_service:java。
四、解决方案
1. 修复指标无法送达VictoriaMetrics问题
问题原因
Collector容器内的localhost指向容器自身,而非宿主机的VictoriaMetrics服务,导致连接失败;且当前配置未开启导出日志,无法排查错误。
修复步骤
- 修改Collector配置的
prometheusremotewrite端点,替换为宿主机IP(或Docker Desktop专用的host.internal):exporters: prometheusremotewrite: endpoint: http://host.internal:8428/api/v1/write # 或宿主机实际IP,如http://192.168.1.100:8428/api/v1/write resource_to_telemetry_conversion: enabled: true - 添加
loggingexporter,开启详细导出日志:exporters: logging: verbosity: detailed prometheusremotewrite: endpoint: http://host.internal:8428/api/v1/write resource_to_telemetry_conversion: enabled: true service: pipelines: metrics: receivers: [otlp] exporters: [logging, prometheusremotewrite] - 重启Collector容器,查看日志定位具体导出错误。
2. 修复服务名称显示异常问题
问题原因
自定义的MeterProvider未配置资源属性,默认使用unknown_service:java;且application.properties中的配置仅对OpenTelemetry自动配置生效,手动创建的MeterProvider不会读取这些属性。
修复步骤
- 修改
OpenTelemetryConfig.java,在构建SdkMeterProvider时添加服务名称资源属性:@Bean public MeterProvider meterProvider() { // 配置服务名称资源 Resource resource = Resource.getDefault() .merge(Resource.create(Attributes.of(AttributeKey.stringKey("service.name"), "springboot-app"))); OtlpGrpcMetricExporter metricExporter = OtlpGrpcMetricExporter.builder() .setEndpoint("http://localhost:4317") .build(); PeriodicMetricReader metricReader = PeriodicMetricReader.builder(metricExporter) .setInterval(Duration.ofMillis(5000)) .build(); return SdkMeterProvider.builder() .setResource(resource) // 绑定资源配置 .registerMetricReader(metricReader) .build(); } - 移除
RestartMetrics.java中数据点的重复service.name属性:@PostConstruct public void init() { restartCounter.add(1); // 去掉Attributes参数,避免重复设置服务名称 } - 重启Spring Boot应用,查看Collector日志,
service.name应显示为springboot-app。
内容的提问来源于stack exchange,提问作者smith
相关产品推荐
相关产品推荐

