如何桥接 OpenTelemetry (opentelemetry-java-instrumentation) 和 Micrometer

问题描述 投票:0回答:1

我的设置:

  1. 基于版本的Spring boot应用程序
    3.1.3
  2. 添加了依赖项
    spring-boot-starter-actuator
  3. 根据
    文档
    添加了自定义指标MyHealthMetricsExportConfiguration(如下所示)
  4. /actuator/metrics
    下我可以看到
    health
    公制
  5. 我已经从github下载了最新的otel java代理
  6. 我已经在intellij“vm options”中添加了配置:

-javaagent:./opentelemetry-javaagent.jar
-Dotel.metrics.exporter=otlp

  1. 我运行了 otel Collector,并将
    receiver
    设置为
    otlp

问题

我不知道如何让酒店代理“看到”并导出春季指标,例如 f.e. “MyHealthMetricsExportConfiguration”。在 that 博客上,它应该像这样简单:

  // Unregister the OpenTelemetryMeterRegistry from Metrics.globalRegistry and make it available
  // as a Spring bean instead.
  @Bean
  @ConditionalOnClass(name = "io.opentelemetry.javaagent.OpenTelemetryAgent")
  public MeterRegistry otelRegistry() {
    Optional<MeterRegistry> otelRegistry = Metrics.globalRegistry.getRegistries().stream()
        .filter(r -> r.getClass().getName().contains("OpenTelemetryMeterRegistry"))
        .findAny();
    otelRegistry.ifPresent(Metrics.globalRegistry::remove);
    return otelRegistry.orElse(null);
  }

但这对我不起作用。首先,durig bean 创建

Metrics.globalRegistry.getRegistries()
是空的。其次,otel Collector 中没有可用的
health
指标。我该怎么做才能让该代理将我的自定义指标发送给收集器?


@Configuration(proxyBeanMethods = false)
public class MyHealthMetricsExportConfiguration {

    public MyHealthMetricsExportConfiguration(MeterRegistry registry, HealthEndpoint healthEndpoint) {
        // This example presumes common tags (such as the app) are applied elsewhere
        Gauge.builder("health", healthEndpoint, this::getStatusCode).strongReference(true).register(registry);
    }

    private int getStatusCode(HealthEndpoint health) {
        Status status = health.health().getStatus();
        if (Status.UP.equals(status)) {
            return 3;
        }
        if (Status.OUT_OF_SERVICE.equals(status)) {
            return 2;
        }
        if (Status.DOWN.equals(status)) {
            return 1;
        }
        return 0;
    }

}
java spring spring-boot open-telemetry-java
1个回答
0
投票

从你的描述来看,你似乎混合了两种方法

  1. 使用 opentelemetry-spring-boot-starter 这意味着 optl 代理包含在您的 spring-boot jar 中
  2. 使用
    -javaagent:
    它将在运行时检测你的 spring-boot 应用程序

此条件

@ConditionalOnClass(name = "io.opentelemetry.javaagent.OpenTelemetryAgent")
将为第二个选项返回 false(在其中放置断点或调试日志,您将看到您的应用程序不会创建
otelRegistry 
bean)。

如果您选择使用 javaagent + prometheus(在依赖项中包含

io.micrometer:micrometer-registry-prometheus
),您可以放弃
OpenTelemetryMeterRegistry
(条件 bean)
Metrics.globalRegistry.getRegistries()
返回
PrometheusMeterRegistry

如果您喜欢 optl 格式,您应该点击上面的链接

© www.soinside.com 2019 - 2024. All rights reserved.