我的设置:
3.1.3
spring-boot-starter-actuator
文档添加了自定义指标
MyHealthMetricsExportConfiguration
(如下所示)/actuator/metrics
下我可以看到 health
公制-javaagent:./opentelemetry-javaagent.jar
-Dotel.metrics.exporter=otlp
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;
}
}
从你的描述来看,你似乎混合了两种方法
-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 格式,您应该点击上面的链接