Lab 7 - Monitoring Todo Application với Spring Boot Actuator và Micrometer
Series: Kubernetes từ Zero đến Production
Tình huống thực tế
Sau Lab 6, DevOps đã có Dashboard theo dõi toàn bộ Kubernetes Cluster.
Dashboard cho biết:
- CPU của Node
- Memory của Pod
- Số lượng Pod
- Restart Count
Một buổi sáng, Product Owner báo:
"Người dùng phản ánh API tạo Todo rất chậm."
Dashboard Kubernetes cho thấy:
- CPU chỉ khoảng 30%
- Memory còn rất nhiều
- Không có Pod Restart
Mọi thứ đều bình thường.
Nhưng người dùng vẫn thấy ứng dụng chậm.
Điều này cho thấy chỉ theo dõi hạ tầng là chưa đủ.
DevOps cần biết:
- API nào đang chậm?
- Có bao nhiêu request mỗi giây?
- Bao nhiêu request bị lỗi?
- JVM đang dùng bao nhiêu Memory?
- Garbage Collector có chạy quá nhiều không?
Đó là lúc Application Monitoring phát huy tác dụng.
Mục tiêu
Sau bài lab này, bạn sẽ:
- Hiểu Application Metrics
- Cài Spring Boot Actuator
- Tích hợp Micrometer
- Export Metrics cho Prometheus
- Cấu hình Prometheus Scrape Application
- Quan sát Request Rate
- Quan sát Request Latency
- Quan sát HTTP Status
- Quan sát JVM Metrics
- Quan sát Garbage Collector
Kiến thức cần chuẩn bị
Đã hoàn thành:
- ✅ Lab 1 → Lab 6
Đã có:
- Kubernetes Cluster
- Prometheus
- Grafana
Kiến trúc
Browser
↓
Spring Boot
↓
Actuator
↓
Micrometer
↓
/actuator/prometheus
↓
Prometheus
↓
Grafana
Lần đầu tiên Prometheus sẽ lấy Metrics trực tiếp từ ứng dụng.
Infrastructure Metrics và Application Metrics
Cho đến Lab 6, chúng ta chỉ có:
CPU
Memory
Network
Restart Count
Đó là Metrics của Kubernetes.
Trong Lab này sẽ có thêm:
HTTP Request
Latency
Status Code
JVM Memory
GC
Thread
Đây mới là dữ liệu giúp DevOps và Developer phân tích hiệu năng của ứng dụng.
Bước 1. Thêm Spring Boot Actuator
Mở file:
pom.xml
Thêm dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Build lại ứng dụng.
Bước 2. Thêm Micrometer
Thêm dependency:
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
Micrometer sẽ chuyển Metrics của Spring Boot sang định dạng Prometheus.
Bước 3. Cấu hình Actuator
Mở:
application.properties
Thêm:
management.endpoints.web.exposure.include=health,prometheus
management.endpoint.health.show-details=always
management.metrics.tags.application=todo-api
Khởi động lại ứng dụng.
Bước 4. Kiểm tra Endpoint
Port Forward:
kubectl port-forward deployment/todo-backend \
8080:8080 \
-n todo-app
Kiểm tra:
http://localhost:8080/actuator/health
Ví dụ:
{
"status":"UP"
}
Tiếp tục:
http://localhost:8080/actuator/prometheus
Bạn sẽ thấy:
jvm_memory_used_bytes
http_server_requests_seconds
process_cpu_usage
Điều này chứng tỏ ứng dụng đã export Metrics thành công.
Bước 5. Cấu hình Prometheus Scrape
Mở cấu hình Prometheus.
Thêm Job mới:
scrape_configs:
- job_name: todo-api
metrics_path: /actuator/prometheus
static_configs:
- targets:
- todo-backend-service.todo-app.svc.cluster.local:8080
Áp dụng cấu hình và khởi động lại Prometheus nếu cần.
Bước 6. Kiểm tra Targets
Mở Prometheus.
Status
↓
Targets
Bạn sẽ thấy:
todo-api
UP
Nếu trạng thái là UP, Prometheus đã scrape được Metrics từ ứng dụng.
Bước 7. Kiểm tra Metrics
Query:
http_server_requests_seconds_count
Ví dụ:
GET /api/todos
1520
Đây là tổng số request mà ứng dụng đã xử lý.
Bước 8. Request Rate
Query:
rate(http_server_requests_seconds_count[1m])
Quan sát:
12 req/s
↓
25 req/s
↓
42 req/s
Đây là số request mỗi giây.
Bước 9. Request Latency
Query:
rate(http_server_requests_seconds_sum[1m])
/
rate(http_server_requests_seconds_count[1m])
Ví dụ:
35 ms
↓
48 ms
↓
160 ms
Nếu Latency tăng nhanh trong khi CPU vẫn thấp, rất có thể nút thắt nằm ở Database hoặc các dịch vụ phụ thuộc.
Bước 10. HTTP Status
Query:
http_server_requests_seconds_count
Lọc theo:
status=500
Ví dụ:
200
3200
500
15
404
8
Bạn có thể nhanh chóng phát hiện nếu số lượng lỗi 5xx tăng bất thường.
Bước 11. JVM Memory
Query:
jvm_memory_used_bytes
Quan sát:
Heap
420 Mi
↓
520 Mi
↓
610 Mi
Nếu Heap tăng liên tục mà không giảm, cần kiểm tra khả năng Memory Leak.
Bước 12. Garbage Collector
Query:
jvm_gc_pause_seconds_count
Quan sát:
GC
20
↓
25
↓
40
GC tăng nhanh có thể ảnh hưởng trực tiếp đến thời gian phản hồi của ứng dụng.
Bước 13. Thread
Query:
jvm_threads_live_threads
Ví dụ:
Live Threads
52
↓
61
↓
80
Số lượng Thread tăng đột biến có thể là dấu hiệu của Thread Leak hoặc tải cao.
Bước 14. Tạo Dashboard
Trong Grafana:
Tạo Dashboard mới.
Thêm các Panel:
- Request Rate
- Request Latency
- HTTP Status
- JVM Heap
- JVM Non-Heap
- GC
- Live Threads
- CPU
- Memory
Đây sẽ là Dashboard riêng cho ứng dụng Todo.
Bước 15. Load Test
Thực hiện:
ab -n 10000 -c 100 \
http://todo.company.local/api/todos
Hoặc:
k6 run script.js
Quan sát Dashboard.
Bạn sẽ thấy:
- Request Rate tăng
- Latency tăng
- CPU tăng
- HPA Scale Up
- JVM Heap thay đổi
Lần đầu tiên bạn có thể theo dõi cả hạ tầng và ứng dụng trên cùng một hệ thống Monitoring.
Bước 16. Thử tạo lỗi
Gây lỗi API
Tạm thời sửa một API để trả về:
HTTP 500
Quan sát:
- HTTP 500 tăng
- Request Latency thay đổi
- Dashboard phản ánh gần như ngay lập tức
Tạo tải lớn
Chạy Load Test liên tục.
Quan sát:
- Request Rate
- Heap
- GC
- Thread
Debug
Không có Metrics
Kiểm tra:
http://localhost:8080/actuator/prometheus
Nếu không truy cập được:
- Kiểm tra Actuator
- Kiểm tra Micrometer
- Kiểm tra cấu hình
management.endpoints.web.exposure.include
Target DOWN
Kiểm tra:
Status
↓
Targets
Đảm bảo:
todo-api
UP
Dọn dẹp
Nếu muốn quay lại cấu hình ban đầu:
- Xóa Job trong Prometheus
- Gỡ Actuator (nếu chỉ dùng cho bài thực hành)
Hoặc giữ nguyên để sử dụng cho Lab 8.
Những gì bạn đã học
Sau bài lab này, bạn đã biết:
- ✅ Spring Boot Actuator
- ✅ Micrometer
- ✅ Export Metrics theo chuẩn Prometheus
- ✅ Scrape Application Metrics
- ✅ Request Rate
- ✅ Request Latency
- ✅ HTTP Status
- ✅ JVM Memory
- ✅ Garbage Collector
- ✅ Live Threads
- ✅ Dashboard Application
Bài học rút ra
Monitoring hạ tầng giúp bạn biết máy chủ và Kubernetes đang hoạt động như thế nào.
Application Monitoring giúp bạn biết chính ứng dụng đang phục vụ người dùng ra sao.
Khi kết hợp Infrastructure Metrics và Application Metrics, DevOps có thể nhanh chóng xác định nguyên nhân của các vấn đề về hiệu năng, thay vì chỉ dựa vào CPU hay Memory của Pod.
Ở Lab 8, chúng ta sẽ tiến thêm một bước với Alerting. Thay vì phải liên tục mở Grafana để quan sát Dashboard, hệ thống sẽ tự động gửi cảnh báo khi CPU quá cao, Pod liên tục Restart hoặc tỷ lệ lỗi HTTP 5xx vượt ngưỡng cho phép.
All rights reserved