Hướng dẫn Setup Jenkins cho hệ thống Monolith + Bài học 37 + Giám sát sức khỏe hệ thống Jenkins với Prometheus và Grafana
Ở Bài 36, chúng ta đã kích hoạt chế độ Thực thi song song (parallel) để vắt kiệt sức mạnh đa nhân của cụm máy chủ Jenkins Master – Agent. Tuy nhiên, khi hệ thống CI/CD của bạn phải gánh hàng chục bản build Monolith nặng nề mỗi ngày, làm sao bạn biết được khi nào bộ nhớ JVM Heap của Jenkins Master sắp chạm ngưỡng tràn (OutOfMemoryError), khi nào hàng đợi (Build Queue) đang bị kẹt cứng vì thiếu Agent, hay tỷ lệ bản build thất bại trong tuần này đang tăng đột biến?
Nếu đợi đến khi lập trình viên nhắn tin phàn nàn "Anh ơi Jenkins đơ rồi không vào được web!" thì bạn đang vận hành theo kiểu bị động. Bài học hôm nay sẽ hướng dẫn bạn xây dựng một trung tâm giám sát thời gian thực (Real-time Observability) cho hạ tầng Jenkins bằng bộ đôi quyền lực nhất hiện nay: Prometheus (Thu thập chỉ số) và Grafana (Trực quan hóa biểu đồ & Cảnh báo sớm).
1. Bốn nhóm chỉ số "Sống còn" (Golden Signals) cần giám sát trên Jenkins
Đối với một máy chủ Jenkins phục vụ dự án Monolith quy mô lớn, bạn không cần theo dõi hàng nghìn thông số rác mà phải tập trung vào 4 nhóm chỉ số cốt lõi sau:
| Nhóm chỉ số | Tên Metric trong Prometheus | Ngưỡng nguy hiểm (Alert Threshold) | Ý nghĩa thực tế trong vận hành Monolith |
|---|---|---|---|
| 1. Bộ nhớ JVM của Jenkins Master | vm_memory_heap_usage |
> 0.85 (85% dung lượng Heap tối đa) | Jenkins chạy trên nền Java. Nếu Heap Memory vượt 85% liên tục, tiến trình Garbage Collection (GC) sẽ chạy điên cuồng làm đơ cứng giao diện Web UI. |
| 2. Độ trễ hàng đợi (Build Queue) | jenkins_queue_size_value |
> 5 jobs đang chờ quá 10 phút | Các nhánh song song đang chiếm hết khe thực thi (Executors), cần cắm thêm Worker Agent mới. |
| 3. Sức khỏe kết nối Agent | jenkins_node_offline_value |
>= 1 node bị Offline đột ngột | Máy chủ Agent bị đứt kết nối SSH hoặc bị khóa tự động do tràn ổ cứng. |
| 4. Hiệu suất Pipeline Monolith | default_jenkins_builds_duration_milliseconds_summary & builds_failed_build_count |
Thời gian build tăng gấp đôi hoặc tỷ lệ Fail > 30% | Có ai đó vừa thêm một bài test bị treo hoặc bộ nhớ đệm Caching đang không hoạt động. |
2. Cài đặt và cấu hình Prometheus Metrics Plugin trên Jenkins
Để Jenkins mở một cổng xuất dữ liệu định dạng chuẩn cho Prometheus đọc (tương tự như một điện tâm đồ), bạn thực hiện theo các bước sau:
Bước 1: Cài đặt Plugin
-
Đăng nhập vào Jenkins Master -> Manage Jenkins -> Plugins -> Available plugins.
-
Tìm kiếm từ khóa: Prometheus metrics (Plugin này sẽ tự động kéo theo thư viện lõi Metrics Plugin của Dropwizard).
-
Tích chọn và bấm Install.
Bước 2: Tinh chỉnh đường dẫn và quyền truy cập Metrics
-
Vào Manage Jenkins -> System, cuộn xuống tìm mục Prometheus.
-
Kiểm tra và thiết lập các thông số chuẩn:
-
Path:
prometheus(Đường dẫn truy xuất sẽ làhttp://<IP_JENKINS>:8080/prometheus/). -
Default Namespace:
default -
Collecting metrics period in seconds:
15(Cập nhật số liệu mới mỗi 15 giây). -
Tích chọn: Collect disk usage (Theo dõi dung lượng ổ cứng), Append param label to job metrics, và Fetch test results of builds (Đếm cả số lượng Unit Test Pass/Fail của dự án Monolith!).
-
Use authentication for endpoint:
-
Nếu mạng nội bộ (LAN Docker Network) an toàn, bạn có thể bỏ tích để Prometheus kéo dữ liệu nhanh gọn.
-
Nếu mở ra ngoài: Hãy tích chọn Use authentication và cấp quyền
Metrics -> Viewcho một tài khoản kỹ thuật chuyên dụng tên làprometheus_scrapertrong bảng RBAC (Bài 28)!
-
-
-
Bấm Save.
Ngay lúc này, bạn có thể mở trình duyệt hoặc gõ lệnh curl http://localhost:8080/prometheus/ sẽ thấy hàng trăm dòng số liệu thời gian thực của Jenkins được xuất ra!
3. Dựng cụm Prometheus & Grafana bằng Docker Compose
Để thu thập và vẽ biểu đồ cho Jenkins mà không làm ảnh hưởng đến môi trường chạy ứng dụng, chúng ta sẽ dựng nhanh một cụm docker-compose-monitoring.yml gồm 2 dịch vụ: Prometheus và Grafana.
Bước 1: Tạo tệp cấu hình prometheus.yml
Tạo thư mục /opt/jenkins-monitoring và tệp cấu hình /opt/jenkins-monitoring/prometheus.yml:
YAML
global:
scrape_interval: 15s # Định kỳ 15 giây sang hỏi thăm Jenkins 1 lần
evaluation_interval: 15s
scrape_configs:
- job_name: 'jenkins-monolith-master'
metrics_path: '/prometheus/'
scheme: 'http'
static_configs:
# Điền IP mạng LAN hoặc tên container của Jenkins Master
- targets: ['10.0.1.10:8080']
# Nếu bạn bật Use authentication ở Bước 2, hãy mở comment 3 dòng dưới đây:
# basic_auth:
# username: 'prometheus_scraper'
# password: 'YOUR_API_TOKEN_OR_PASSWORD'
Bước 2: Tạo tệp docker-compose-monitoring.yml và khởi chạy
YAML
version: '3.8'
services:
prometheus:
image: prom/prometheus:v2.51.0
container_name: jenkins-prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d' # Lưu lịch sử biểu đồ trong 30 ngày
grafana:
image: grafana/grafana:10.4.1
container_name: jenkins-grafana
restart: unless-stopped
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=GrafanaStrongPassword2026!
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
volumes:
prometheus_data:
grafana_data:
Khởi chạy cụm giám sát:
Bash
cd /opt/jenkins-monitoring
docker compose -f docker-compose-monitoring.yml up -d
4. Thiết lập Dashboard chuyên nghiệp trên Grafana chỉ trong 60 giây
Thay vì phải tự ngồi vẽ từng biểu đồ từ con số 0, cộng đồng Grafana đã xây dựng sẵn các mẫu Dashboard chuẩn mực dành riêng cho Prometheus Metrics Plugin của Jenkins:
-
Truy cập giao diện Grafana tại
http://<IP_SERVER>:3000(Đăng nhập vớiadmin/GrafanaStrongPassword2026!). -
Kết nối nguồn dữ liệu (Data Source):
-
Vào Connections -> Data sources -> Add data source -> Chọn Prometheus.
-
Tại ô Prometheus server URL, nhập:
http://prometheus:9090. -
Cuộn xuống dưới cùng bấm Save & test (Hiện thông báo xanh Successfully queried the Prometheus API là thành công).
-
-
Import Dashboard mẫu:
-
Vào menu Dashboards -> Bấm nút New -> Chọn Import.
-
Tại ô Import via grafana.com, nhập mã ID kinh điển dành cho Jenkins:
9964(Jenkins: Performance and Health Overview) -> Bấm Load. -
Chọn Data source là
Prometheusvừa tạo và bấm Import.
-
Ngay lập tức, một màn hình điều khiển trung tâm (Command Center) tuyệt đẹp sẽ hiện ra với đầy đủ thông số: CPU Load, JVM Memory Usage, Executor Free/Busy, Build Queue, Active Nodes và Thời gian chạy trung bình của Pipeline Monolith!
5. Tuyệt chiêu thực chiến: Các câu truy vấn PromQL đắt giá để theo dõi dự án Monolith
Nếu bạn muốn tự tạo thêm một vài bảng biểu đồ (Panels) đo lường chuyên sâu riêng cho dự án monolith-core-system của mình trên Grafana, hãy sử dụng 5 câu truy vấn PromQL thực chiến dưới đây:
A. Theo dõi phần trăm RAM JVM Heap đang bị chiếm dụng trên Jenkins Master
Đoạn mã
vm_memory_heap_usage * 100
(Nếu đồ thị này thường xuyên nằm ở mức 85% – 95%, bạn cần tăng ngay biến JAVA_OPTS=-Xmx4096m cho container Jenkins Master).
B. Tỷ lệ phần trăm Bản Build Thành công (Success Rate) của hệ thống Monolith
Đoạn mã
sum(default_jenkins_builds_success_build_count_total{jenkins_job=~".*monolith.*"})
/
sum(default_jenkins_builds_total_build_count_total{jenkins_job=~".*monolith.*"}) * 100
C. Thời gian Build trung bình (tính bằng Phút) của từng nhánh Monolith
Giúp kiểm chứng xem kỹ thuật Caching (Bài 18) và Parallel (Bài 36) có giữ được tốc độ build ổn định dưới 5 phút hay không:
Đoạn mã
default_jenkins_builds_last_build_duration_milliseconds{jenkins_job=~".*monolith.*"} / 1000 / 60
D. Đếm số lượng Unit Test bị Fail trong lần chạy gần nhất
Đoạn mã
default_jenkins_builds_last_build_tests_failing{jenkins_job=~".*monolith.*"}
E. Kiểm tra số lượng Khe thực thi (Executors) đang rảnh rỗi trên toàn cụm Agent
Đoạn mã
sum(jenkins_executor_free_value)
6. Thiết lập Cảnh báo tự động (Grafana Alerting) gửi về Telegram trước khi Jenkins sập
Biểu đồ đẹp đến mấy cũng vô dụng nếu lúc 12 giờ trưa máy chủ Agent bị đứt mạng mà không ai đang mở màn hình Grafana để nhìn. Hãy thiết lập 2 quy tắc cảnh báo tự động (Alert Rules) ngay trong mục Alerting của Grafana (kết nối vào đúng con Bot Telegram đã tạo ở Bài 19):
-
Quy tắc 1 - Cảnh báo Offline Node Agent (
Node Down Alert):-
Biểu thức điều kiện:
jenkins_node_offline_value > 0kéo dài liên tục trong2m(2 phút). -
Nội dung cảnh báo: "🚨 KHẨN CẤP: Có máy chủ Jenkins Worker Agent vừa bị mất kết nối (Offline)! Kiểm tra ngay SSH hoặc dung lượng ổ cứng của Agent."
-
-
Quy tắc 2 - Cảnh báo Tắc nghẽn Hàng đợi (
Build Queue Bottleneck):-
Biểu thức điều kiện:
jenkins_queue_size_value > 5kéo dài liên tục trong10m(10 phút). -
Nội dung cảnh báo: "⚠️ QUÁ TẢI CI/CD: Đang có hơn 5 bản build Monolith xếp hàng chờ quá 10 phút mà chưa có Agent xử lý! Cần kiểm tra xem có bản build nào đang bị treo hay không."
-
All rights reserved