Search code examples
springprometheusjmxspring-boot-actuator

Health Endpoint Metrics not being exported after Spring Boot 2 migration


My Team migrated our Microservices from Spring Boot 1 to Version 2 and since the Actuator changed, our Health Endpoint Metrics exported via prometheus jmx exporter do not work anymore.

The usual /actuator/health is working as expected, but the prometheus-jmx-exporter won't pick it up although several things tried:

  • I changed the Metainformation in the exporter-config.yaml to reflect the name change in Spring Boot 2
  • I added the io.micrometer:micrometer-registry-prometheus to our build.gradle to see if this is the issue
  • I exposed web and jmx endpoints acording to the Spring Boot 2 Documentation

So now I run out of ideas and would appreciate any hints oyu might be able to give me

old 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  

new 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

current application properties about actuator endpoints:

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

in Spring Boot 1 with the old exporter-config.yaml I get results like this:

# 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

But with all the changes and in Spring Boot 2 I get nothing out of this.


Solution

  • You can cofigure your own health value and add it to the Prometheus Metrics endpoint:

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