📖 Scenario: You are building a Spring Boot application that needs a custom health check endpoint to report the status of a special service.
🎯 Goal: Create a custom actuator endpoint named customHealth that returns a simple health status message.
📋 What You'll Learn
Create a class named CustomHealthEndpoint annotated as a Spring Boot actuator endpoint
Add a method named health that returns a String with the value "Service is running"
Configure the endpoint with the ID customHealth
Expose the custom endpoint through Spring Boot actuator
💡 Why This Matters
🌍 Real World
Custom actuator endpoints let you add your own health checks or metrics to Spring Boot applications, useful for monitoring and alerting in production.
💼 Career
Knowing how to extend Spring Boot actuator is valuable for backend developers working on microservices and cloud-native applications.
Progress0 / 4 steps
1
Create the custom endpoint class
Create a public class named CustomHealthEndpoint in package com.example.demo.
Spring Boot
Hint
Start by defining a public class named CustomHealthEndpoint inside the package com.example.demo.
2
Add the @Endpoint annotation with id
Annotate the CustomHealthEndpoint class with @Endpoint(id = "customHealth") and import the correct package org.springframework.boot.actuate.endpoint.annotation.Endpoint.
Spring Boot
Hint
Use @Endpoint(id = "customHealth") above the class declaration to define the custom actuator endpoint ID.
3
Add a read operation method
Inside CustomHealthEndpoint, add a public method named health annotated with @ReadOperation that returns a String with the value "Service is running". Import org.springframework.boot.actuate.endpoint.annotation.ReadOperation.
Spring Boot
Hint
Add a method health with @ReadOperation that returns the string "Service is running".
4
Enable the custom endpoint in application properties
In src/main/resources/application.properties, add the line management.endpoints.web.exposure.include=customHealth to expose the custom endpoint over HTTP.
Spring Boot
Hint
To make the custom endpoint accessible via HTTP, add management.endpoints.web.exposure.include=customHealth in application.properties.
Practice
(1/5)
1. What annotation is used to define a custom actuator endpoint in Spring Boot?
easy
A. @Endpoint
B. @Controller
C. @Service
D. @RestController
Solution
Step 1: Understand the purpose of custom actuator endpoints
Custom actuator endpoints allow you to add your own monitoring or info checks in Spring Boot.
Step 2: Identify the correct annotation for defining custom endpoints
The @Endpoint annotation is specifically designed to mark a class as a custom actuator endpoint.
Final Answer:
@Endpoint -> Option A
Quick Check:
Custom actuator endpoint = @Endpoint [OK]
Hint: Custom actuator endpoints always use @Endpoint annotation [OK]
Common Mistakes:
Confusing @Endpoint with @Controller
Using @Service instead of @Endpoint
Using @RestController which is for REST APIs
2. Which annotation should you use on a method inside a custom actuator endpoint to expose a read-only operation?
easy
A. @WriteOperation
B. @ReadOperation
C. @GetMapping
D. @PostMapping
Solution
Step 1: Recall method annotations for custom actuator endpoints
Custom actuator endpoints use specific annotations to define operations: read or write.
Step 2: Match read-only operation annotation
The @ReadOperation annotation marks a method as a read-only operation accessible via HTTP GET.
Final Answer:
@ReadOperation -> Option B
Quick Check:
Read-only method = @ReadOperation [OK]
Hint: Use @ReadOperation for read-only endpoint methods [OK]
Common Mistakes:
Using @WriteOperation for read methods
Confusing @GetMapping with actuator annotations
Using @PostMapping which is for REST controllers
3. Given this custom endpoint class, what will be the HTTP response body when accessing the endpoint?
@Endpoint(id = "status")
public class StatusEndpoint {
@ReadOperation
public String getStatus() {
return "UP";
}
}
medium
A. "DOWN"
B. 404 Not Found
C. "UP"
D. 500 Internal Server Error
Solution
Step 1: Analyze the custom endpoint class
The class is annotated with @Endpoint(id = "status") and has a method with @ReadOperation returning "UP".
Step 2: Understand the HTTP response from the read operation
Accessing the actuator endpoint with id "status" triggers the getStatus() method, returning the string "UP" as the response body.
Final Answer:
"UP" -> Option C
Quick Check:
Read operation returns "UP" [OK]
Hint: ReadOperation returns method result as HTTP response body [OK]
Common Mistakes:
Expecting 404 if endpoint is defined correctly
Confusing return value with HTTP status code
Assuming method returns JSON object instead of string
4. Identify the error in this custom actuator endpoint code:
@Endpoint(id = "metrics")
public class MetricsEndpoint {
@ReadOperation
public String metrics() {
return 12345;
}
}
medium
A. The @ReadOperation annotation is missing
B. The method name must be getMetrics
C. The @Endpoint annotation must be on a method, not class
D. The method declares String return type but returns an int
Solution
Step 1: Check method return type consistency
The method metrics() returns an integer literal 12345 but declares return type String, causing a type mismatch.
Step 2: Verify annotations and method naming
The @ReadOperation annotation is present, and @Endpoint is correctly on the class. Method name can be arbitrary.
Final Answer:
The method declares String return type but returns an int -> Option D
Quick Check:
Return type mismatch causes error [OK]
Hint: Method return type must match declared type [OK]
Common Mistakes:
Thinking @Endpoint goes on methods
Assuming method name must follow getter pattern
Ignoring type mismatch errors
5. You want to create a custom actuator endpoint that accepts a POST request to update a configuration value. Which combination of annotations and method signature is correct?
A)
@Endpoint(id = "config")
public class ConfigEndpoint {
@WriteOperation
public String updateConfig(String key, String value) {
// update logic
return "Updated";
}
}
B)
@Endpoint(id = "config")
public class ConfigEndpoint {
@ReadOperation
public void updateConfig(String key, String value) {
// update logic
}
}
C)
@Endpoint(id = "config")
public class ConfigEndpoint {
@WriteOperation
public void updateConfig() {
// update logic
}
}
D)
@Endpoint(id = "config")
public class ConfigEndpoint {
@WriteOperation
public String updateConfig() {
// update logic
return "Updated";
}
}
hard
A. Option A is correct because @WriteOperation supports parameters and returns a response
B. Option B is correct because @ReadOperation can update values
C. Option C is correct because @WriteOperation methods cannot have parameters
D. Option D is correct because @WriteOperation methods should not have parameters
Solution
Step 1: Understand @WriteOperation usage
@WriteOperation marks methods that handle write operations, typically POST, and can accept parameters for input.
Step 2: Analyze method signatures and annotations
The correct combination uses @WriteOperation with String key and String value parameters and returns a String response, which is valid for POST updates. Using @ReadOperation is wrong for update operations. The other snippets lack parameters needed to receive key and value.
Final Answer:
Option A is correct because @WriteOperation supports parameters and returns a response -> Option A
Quick Check:
@WriteOperation with parameters for POST updates [OK]
Hint: Use @WriteOperation with parameters for POST updates [OK]