You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
    
  • 添加logging exporter,开启详细导出日志:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 21:09:54