在Spring Boot 2迁移后无法导出运行状况端点指标

时间:2019-07-29 13:33:55

标签: spring jmx prometheus actuator

我的团队将我们的微服务从Spring Boot 1迁移到了版本2,并且由于执行器发生了变化,因此通过prometheus jmx导出器导出的Health Endpoint Metrics不再起作用。

通常的/ actuator / health运行正常,但是prometheus-jmx-exporter不会尝试,尽管尝试了以下几种方法:

  • 我更改了exporter-config.yaml中的元信息以反映Spring Boot 2中的名称更改
  • 我将io.micrometer:micrometer-registry-prometheus添加到了我们的build.gradle中,以查看这是否是问题所在
  • 我根据Spring Boot 2文档公开了Web和jmx端点

所以现在我用尽了所有想法,希望能得到oyu可能给我的任何提示

旧的prometheus-jmx-exporter exporter-config.yaml:

---
lowercaseOutputName: true
lowercaseOutputLabelNames: true
whitelistObjectNames: ["org.springframework.boot:type=Endpoint,name=healthEndpoint"]
rules:
- pattern: 'org.springframework.boot<type=Endpoint, name=healthEndpoint><(.*, )?(.*)>(.*):'
  name: health_endpoint_$1$3
  attrNameSnakeCase: true  

新的prometheus-jmx-exporter exporter-config.yaml:

---
lowercaseOutputName: true
lowercaseOutputLabelNames: true
whitelistObjectNames: ["org.springframework.boot:type=Endpoint,name=Health"]
rules:
- pattern: 'org.springframework.boot<type=Endpoint, name=Health>'
  name: health_endpoint_$1$3
  attrNameSnakeCase: true

关于执行器端点的当前应用程序属性:

management.endpoints.web.exposure.include=info, health, refresh, metrics, prometheus
management.endpoints.jmx.exposure.include=health, metrics, prometheus

在带有旧的exporter-config.yaml的Spring Boot 1中,我得到如下结果:

# HELP health_endpoint_hystrix_status Invoke the underlying endpoint (org.springframework.boot<type=Endpoint, name=healthEndpoint><hystrix, status>status)
# TYPE health_endpoint_hystrix_status untyped
health_endpoint_hystrix_status 1.0
# HELP health_endpoint_status Invoke the underlying endpoint (org.springframework.boot<type=Endpoint, name=healthEndpoint><status>status)
# TYPE health_endpoint_status untyped
health_endpoint_status 1.0

但是在进行了所有更改之后,在Spring Boot 2中我什么也没得到。

1 个答案:

答案 0 :(得分:0)

您可以配置自己的健康值并将其添加到Prometheus Metrics端点:

@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;
    }
}