📖 Scenario: You are building a simple Spring Boot application that needs a custom health check endpoint. This endpoint will tell if the application is healthy based on a custom condition.
🎯 Goal: Create a Spring Boot application with a custom health indicator that reports the health status as 'UP' or 'DOWN' based on a simple condition.
📋 What You'll Learn
Create a class that implements HealthIndicator
Add a boolean variable serviceUp to represent service status
Implement the health() method to return Health.up() or Health.down() based on serviceUp
Register the custom health indicator as a Spring bean
💡 Why This Matters
🌍 Real World
Custom health endpoints help monitor application status in production environments, enabling better reliability and alerting.
💼 Career
Understanding how to customize Spring Boot actuator endpoints is valuable for backend developers working on microservices and cloud-native applications.
Progress0 / 4 steps
1
Create the Custom Health Indicator Class
Create a class called CustomHealthIndicator that implements HealthIndicator interface.
Spring Boot
Hint
Start by importing Health and HealthIndicator. Then create a public class CustomHealthIndicator that implements HealthIndicator. Implement the health() method to return Health.up().build().
2
Add a Service Status Variable
Inside CustomHealthIndicator, add a private boolean variable called serviceUp and set it to true.
Spring Boot
Hint
Declare a private boolean variable named serviceUp and initialize it to true inside the class but outside any method.
3
Implement Conditional Health Logic
Modify the health() method to return Health.up().build() if serviceUp is true, otherwise return Health.down().build().
Spring Boot
Hint
Use an if statement inside the health() method to check serviceUp. Return Health.up().build() if true, else Health.down().build().
4
Register the Custom Health Indicator as a Bean
Create a Spring configuration class called HealthConfig with a method annotated with @Bean that returns a new instance of CustomHealthIndicator.
Spring Boot
Hint
Create a class annotated with @Configuration. Inside it, add a method annotated with @Bean that returns a new CustomHealthIndicator instance.
Practice
(1/5)
1. What is the main purpose of customizing the health endpoint in Spring Boot?
easy
A. To automatically restart the application on failure
B. To change the port number of the application
C. To add specific checks that show detailed app status
D. To disable all health checks
Solution
Step 1: Understand the health endpoint role
The health endpoint shows the app's status and can be extended to include custom checks.
Step 2: Identify customization purpose
Customizing allows adding specific checks to provide detailed status beyond default info.
Final Answer:
To add specific checks that show detailed app status -> Option C
Quick Check:
Health endpoint customization = detailed app status [OK]
Hint: Health endpoint customization means adding detailed status checks [OK]
Common Mistakes:
Thinking it changes app port
Assuming it disables health checks
Believing it restarts app automatically
2. Which interface must you implement to create a custom health check in Spring Boot?
easy
A. HealthIndicator
B. HealthCheck
C. HealthService
D. HealthStatus
Solution
Step 1: Recall Spring Boot health customization
Custom health checks require implementing a specific interface.
Step 2: Identify correct interface
The interface to implement is HealthIndicator, which requires overriding health().
Final Answer:
HealthIndicator -> Option A
Quick Check:
Custom health check interface = HealthIndicator [OK]
Hint: Custom health checks need HealthIndicator interface [OK]
Common Mistakes:
Using HealthCheck instead of HealthIndicator
Confusing with HealthService or HealthStatus
Not overriding health() method
3. Given this custom health indicator code, what will the health endpoint show?
public class MyHealth implements HealthIndicator {
@Override
public Health health() {
return Health.up().withDetail("db", "reachable").build();
}
}
medium
A. {"status":"UP","details":{"db":"reachable"}}
B. {"status":"DOWN","details":{"db":"reachable"}}
C. {"status":"UP"}
D. {"status":"DOWN"}
Solution
Step 1: Analyze health() method return
The method returns Health.up() with a detail key "db" set to "reachable".
Step 2: Understand output format
The health endpoint shows status "UP" and includes the details map with "db":"reachable".
Final Answer:
{"status":"UP","details":{"db":"reachable"}} -> Option A
Quick Check:
Health.up() with details = status UP plus details [OK]
Hint: Health.up() withDetail adds details and sets status UP [OK]
Common Mistakes:
Confusing UP with DOWN status
Ignoring details in output
Assuming default status without details
4. Identify the error in this custom health indicator code:
public class CustomHealth implements HealthIndicator {
public Health health() {
return Health.down().withDetails("error", "Database unreachable").build();
}
}
medium
A. Method should be annotated with @Override
B. withDetails() method does not exist, should be withDetail()
C. Method name should be checkHealth() instead of health()
D. Health.down() cannot be used in custom indicators
Solution
Step 1: Check method signature and annotations
The method correctly named health() matches interface; @Override annotation is optional but recommended.
Step 2: Verify method calls on Health builder
The method withDetails() does not exist; correct method is withDetail() for adding one detail.
Final Answer:
withDetails() method does not exist, should be withDetail() -> Option B
Quick Check:
Use withDetail() to add single detail [OK]
Hint: Use withDetail() not withDetails() to add details [OK]
Common Mistakes:
Missing @Override annotation (not error but best practice)
Wrong method name instead of health()
Thinking Health.down() is invalid
5. You want to customize the health endpoint to show "UP" only if both database and cache are reachable. Which approach correctly implements this logic?
hard
A. Use two separate HealthIndicator classes without combining results
B. Return Health.up() always and add details for database and cache status
C. Return Health.down() always and ignore individual checks
D. Return Health.up() if both checks pass; else Health.down() with details for each failure
Solution
Step 1: Understand combined health logic
The health status should be UP only if both database and cache are reachable; otherwise DOWN.
Step 2: Implement conditional return with details
Return Health.up() if both pass; else return Health.down() and include details explaining which failed.
Final Answer:
Return Health.up() if both checks pass; else Health.down() with details for each failure -> Option D
Quick Check:
Combined checks control status UP or DOWN with details [OK]
Hint: Return UP only if all checks pass; else DOWN with failure details [OK]
Common Mistakes:
Returning UP regardless of failures
Ignoring combined status logic
Splitting checks without combining results
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.