0
votes

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.

1
After further investigation it looks like this health metrics I used in spring boot 1 is simply not there in this way anymore. I diged into the micrometer prometheus registry and it looks like this is not implemented.Unfaced

1 Answers

0
votes

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