[Java Backend Zero to Hello] BÀI 5.10: SPRING BOOT ACTUATOR
📚 Bài viết thuộc series Java Backend Zero to Hello 📌 Phần: Phase 5: Spring Framework & Spring Boot | Bài 56/86
BÀI 5.10: SPRING BOOT ACTUATOR
Mục tiêu
- Sử dụng Spring Boot Actuator
- Health check và metrics
- Custom endpoint
- Monitoring ứng dụng
1. ACTUATOR LÀ GÌ?
Spring Boot Actuator cung cấp các endpoint sẵn để giám sát và quản lý ứng dụng trong production.
2. DEPENDENCY
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3. CÁC ENDPOINT CƠ BẢN
| Endpoint | Mô tả |
|---|---|
/actuator/health |
Trạng thái ứng dụng |
/actuator/info |
Thông tin ứng dụng |
/actuator/metrics |
Metrics (JVM, HTTP, DB) |
/actuator/env |
Biến môi trường |
/actuator/loggers |
Cấu hình logging |
/actuator/threaddump |
Thread dump |
/actuator/heapdump |
Heap dump |
/actuator/mappings |
Tất cả URL mapping |
4. CẤU HÌNH
4.1 application.yml
management:
endpoints:
web:
exposure:
include: health, info, metrics, env, loggers
base-path: /actuator
endpoint:
health:
show-details: always
show-components: always
metrics:
enabled: true
info:
env:
enabled: true
4.2 Bảo mật Actuator
@Configuration
public class ActuatorSecurityConfig {
@Bean
public SecurityFilterChain actuatorSecurity(HttpSecurity http) throws Exception {
http.securityMatcher("/actuator/**")
.authorizeHttpRequests(auth -> auth
.requestMatchers("/actuator/health").permitAll()
.requestMatchers("/actuator/**").hasRole("ADMIN")
)
.httpBasic(Customizer.withDefaults());
return http.build();
}
}
5. HEALTH CHECK
5.1 Truy cập
GET /actuator/health
Response:
{
"status": "UP",
"components": {
"db": { "status": "UP" },
"diskSpace": { "status": "UP" },
"ping": { "status": "UP" }
}
}
5.2 Custom Health Indicator
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
boolean isHealthy = checkSomething();
if (isHealthy) {
return Health.up()
.withDetail("service", "running")
.build();
}
return Health.down()
.withDetail("error", "Service unavailable")
.build();
}
}
6. METRICS
6.1 Truy cập
GET /actuator/metrics
GET /actuator/metrics/jvm.memory.used
GET /actuator/metrics/http.server.requests
6.2 Custom Metric
@Service
@RequiredArgsConstructor
public class OrderService {
private final MeterRegistry meterRegistry;
private final Counter orderCounter;
@PostConstruct
void init() {
orderCounter = Counter.builder("orders.created")
.description("Total orders created")
.register(meterRegistry);
}
public Order createOrder(OrderRequest request) {
Order order = // ...
orderCounter.increment();
return order;
}
}
6.3 Timer
@Service
@RequiredArgsConstructor
public class UserService {
private final MeterRegistry meterRegistry;
public User findById(Long id) {
Timer.Sample sample = Timer.start(meterRegistry);
try {
return userRepository.findById(id).orElseThrow();
} finally {
sample.stop(Timer.builder("user.find")
.description("Time to find user")
.register(meterRegistry));
}
}
}
7. INFO ENDPOINT
info:
app:
name: MyApp
version: 1.0.0
description: Backend API
build:
artifact: my-app
group: com.example
Truy cập: GET /actuator/info
8. LOGGING MANAGEMENT
8.1 Xem level hiện tại
GET /actuator/loggers
GET /actuator/loggers/com.example
8.2 Thay đổi level
POST /actuator/loggers/com.example
Content-Type: application/json
{
"configuredLevel": "DEBUG"
}
9. PROMETHEUS + GRAFANA
9.1 Dependency
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
9.2 Cấu hình
management:
endpoints:
web:
exposure:
include: health, info, metrics, prometheus
metrics:
export:
prometheus:
enabled: true
9.3 Prometheus scrape
GET /actuator/prometheus
10. CUSTOM ENDPOINT
@Component
@Endpoint(id = "custom")
public class CustomEndpoint {
@ReadOperation
public Map<String, Object> info() {
return Map.of(
"status", "running",
"uptime", System.currentTimeMillis()
);
}
@WriteOperation
public void update(@Selector String key, String value) {
// Cập nhật config
}
}
11. DISTRIBUTED TRACING
11.1 Dependency
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-tracing-bridge-brave</artifactId>
</dependency>
11.2 Cấu hình
management:
tracing:
sampling:
probability: 1.0
12. BÀI TẬP THỰC HÀNH
Bài 1: Health Check
Tạo custom HealthIndicator kiểm tra kết nối database.
Bài 2: Custom Metric
Đếm số lượng API call theo endpoint.
Bài 3: Prometheus
Tích hợp Prometheus và visualize với Grafana.
13. TÓM TẮT
| Khái niệm | Mô tả |
|---|---|
| Actuator | Endpoints giám sát |
| Health Check | Trạng thái ứng dụng |
| Metrics | Số liệu (JVM, HTTP, DB) |
| HealthIndicator | Custom health check |
| MeterRegistry | Đăng ký metric |
| Prometheus | Hệ thống thu thập metric |
| Grafana | Visualization |
Bài tiếp theo: 5.11 Caching
🧭 Điều Hướng Series
⬅️ Bài trước: BÀI 5.9: SPRING SECURITY CƠ BẢN
📋 Lộ trình tổng quan: Xem Toàn Bộ Series
➡️ Bài tiếp theo: BÀI 5.11: CACHING
All rights reserved