我想将每个春季的健康指标映射到普罗米修斯指标。与http://micrometer.io/docs/guide/healthAsGauge类似,但适用于每个健康指标。我使用弹簧靴2 +千分尺+普罗米修斯。有什么优雅的方法可以做到这一点吗? ID
答案 0 :(得分:0)
解决方案可以是:
@Configuration
public class HealthMetricsConfiguration {
@Bean
public MeterRegistryCustomizer prometheusHealthCheck(HealthEndpoint healthEndpoint) {
return registry -> registry.gauge("health", healthEndpoint, HealthMetricsConfiguration::healthToCode);
}
public static int healthToCode(HealthEndpoint ep) {
Status status = ep.health().getStatus();
return status.equals(Status.UP) ? 1 : 0;
}
}
您可以在注册表中绑定所有健康指标。
答案 1 :(得分:0)
这是另一种解决方案。它为每个HealthDindicater创建一个指标,并将指标的名称作为属性值。指标值1表示健康的个体,否则存在问题。
@Bean
public MeterRegistryCustomizer<MeterRegistry> healthRegistryCustomizer(HealthContributorRegistry healthRegistry) {
return registry -> healthRegistry.stream().forEach(namedContributor -> registry.gauge("health", Tags.of("name", namedContributor.getName()), healthRegistry, health -> {
var status = ((HealthIndicator) health.getContributor(namedContributor.getName())).getHealth(false).getStatus();
return healthToCode(status);
}));
}
public static int healthToCode(Status status) {
return status.equals(Status.UP) ? 1 : 0;
}
答案 2 :(得分:0)
这是对之前解决方案的清理。
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsHealthGauge(HealthEndpoint healthEndpoint) {
log.info("Registering application_health metric gauge");
return registry ->
Gauge.builder("application_health", healthEndpoint, e -> e.health().getStatus().equals(Status.UP) ? 1 : 0).register(registry);
}