0

[Java Backend Zero to Hello] BÀI 5.10: SPRING BOOT ACTUATOR

Java Backend Zero to Hello

📚 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

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí