Skip to main content

2.5 Actuator and Production Monitoring

In production, you need to expose your application’s health and metrics for load balancers, APM, and orchestration. Spring Boot Actuator provides a standard set of HTTP (or JMX) endpoints for monitoring and management.

Reference: Spring Boot 3.2.x, spring-boot-starter-actuator

1. What is Actuator?

Actuator is a set of health, metrics, and management endpoints for a Spring Boot application. It is commonly used for load balancer health checks, APM integration, and Kubernetes liveness/readiness probes.

2. Dependency and Basic Configuration

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

Restricting which endpoints are exposed in application.yml is recommended for security. In production, often only health and info are exposed.

management:
endpoints:
web:
exposure:
include: health,info,metrics
base-path: /actuator
endpoint:
health:
show-details: when-authorized

3. Main Endpoints

EndpointDescriptionUse case
/actuator/healthApplication, DB, disk, etc.Load balancer health check, K8s probes
/actuator/infoBuild/version info (you configure)Deployment verification
/actuator/metricsJVM, HTTP, connection pool metricsAPM, Grafana
/actuator/metrics/{name}Specific metric valuesDetailed monitoring

Health response example

With show-details: always, the response can look like:

{
"status": "UP",
"components": {
"db": {
"status": "UP",
"details": {
"database": "MySQL",
"validationQuery": "isValid()"
}
},
"diskSpace": {
"status": "UP",
"details": {
"total": 500000000000,
"free": 250000000000,
"threshold": 10485760
}
}
}
}

4. Custom Health Indicator

You can add health checks for critical external systems (payment gateway, cache, etc.) by implementing HealthIndicator.

@Component
public class CustomPaymentHealthIndicator implements HealthIndicator {

private final PaymentGatewayClient paymentClient;

@Override
public Health health() {
try {
boolean reachable = paymentClient.ping();
return reachable
? Health.up().withDetail("payment", "available").build()
: Health.down().withDetail("payment", "unreachable").build();
} catch (Exception e) {
return Health.down(e).build();
}
}
}

5. Graceful Shutdown

For zero-downtime deployments, enable graceful shutdown so the application finishes in-flight requests before exiting.

server:
shutdown: graceful

spring:
lifecycle:
timeout-per-shutdown-phase: 30s

Spring Boot will stop accepting new requests and wait up to timeout-per-shutdown-phase for existing requests to complete before shutting down.

6. Exposing build info in /actuator/info

Add the following to build.gradle and rebuild; then /actuator/info can expose git and build metadata.

springBoot {
buildInfo()
}

tip

In production, keep management.endpoints.web.exposure.include minimal and restrict /actuator to internal networks or VPN. You can also secure Actuator endpoints with Spring Security.