0

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

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í