Vấn đề: Dashboard xanh mướt nhưng khách vẫn báo lỗi
Bạn đã bao giờ gặp tình huống trớ trêu: Grafana báo CPU, RAM của server vẫn cực kỳ ổn định, nhưng khách hàng lại gọi điện cháy máy vì không vào được web? Mình đã nếm trải cảnh này không dưới chục lần. Nguyên nhân rất đơn giản: Server không chết, nhưng các dịch vụ cốt lõi như Nginx, MySQL hay một con Bot Python chạy dưới dạng systemd unit đã bị failed hoặc treo cứng.
Node Exporter mặc định có thể soi systemd nhưng chỉ ở mức cưỡi ngựa xem hoa. Để biết chính xác uptime từng unit hay lọc riêng các service quan trọng, Systemd Exporter mới là “hàng hiệu” thực sự. Nó giúp bạn quản lý trạng thái dịch vụ chi tiết và hiệu quả hơn nhiều.
Triển khai Systemd Exporter trong 5 phút
Không cần rườm rà, chúng ta sẽ cài đặt nhanh binary lên server Linux và kết nối nó với Prometheus ngay lập tức.
Bước 1: Tải và cài đặt binary
# Check bản mới nhất tại GitHub Prometheus Community
export VERSION="0.6.0"
wget https://github.com/prometheus-community/systemd_exporter/releases/download/v${VERSION}/systemd_exporter-${VERSION}.linux-amd64.tar.gz
tar -xvf systemd_exporter-${VERSION}.linux-amd64.tar.gz
sudo cp systemd_exporter-${VERSION}.linux-amd64/systemd_exporter /usr/local/bin/
Bước 2: Cấu hình Systemd Service cho Exporter
Chạy exporter bằng quyền root là sai lầm về bảo mật. Mình luôn tạo một user riêng, không có quyền login để chạy các công cụ này.
sudo useradd --no-create-home --shell /bin/false systemd_exporter
sudo nano /etc/systemd/system/systemd_exporter.service
Dán nội dung cấu hình sau:
[Unit]
Description=Systemd Exporter
After=network-online.target
[Service]
User=systemd_exporter
Group=systemd_exporter
ExecStart=/usr/local/bin/systemd_exporter \
--collector.unit-include="(nginx|mysql|docker|ssh).*" \
--web.listen-address=":9101"
[Install]
WantedBy=multi-user.target
Mẹo nhỏ: Flag --collector.unit-include cực kỳ quan trọng. Nó giúp bạn chỉ lấy metrics của những service cần thiết, tránh làm nhiễu database của Prometheus bởi hàng trăm service hệ thống vô danh.
Bước 3: Kích hoạt
sudo systemctl daemon-reload
sudo systemctl enable --now systemd_exporter
# Test nhanh kết quả
curl http://localhost:9101/metrics | grep node_systemd_unit_state
Tại sao Systemd Exporter đáng đồng tiền bát gạo?
Nhiều bạn sẽ hỏi: “Node Exporter có sẵn rồi, cài thêm cái này làm gì cho nặng máy?”. Thực tế, Systemd Exporter cực nhẹ, chỉ tốn khoảng 10-15MB RAM nhưng mang lại 3 giá trị mà Node Exporter không thể làm tốt:
- Bộ lọc Regex: Bạn có quyền chọn chính xác service nào được phép xuất hiện trên dashboard.
- Uptime chính xác: Biết rõ service đã chạy được bao nhiêu giây. Nếu con số này nhảy về 0 liên tục, chắc chắn app đang bị crash loop.
- Trạng thái đa dạng: Phân biệt rõ ranh giới mong manh giữa
activating(đang khởi động) vàfailed(đã chết).
Cấu hình Prometheus thu thập dữ liệu
Thêm đoạn cấu hình sau vào file prometheus.yml của bạn. Hãy nhớ đổi IP cho đúng thực tế.
scrape_configs:
- job_name: 'systemd_nodes'
static_configs:
- targets: ['192.168.1.10:9101']
relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: 'app-server-01'
Kinh nghiệm thực tế: Trị dứt điểm Alert Fatigue
Ngày trước, khi quản lý cụm 50 node, mình từng mắc lỗi “newbie”: Cảnh báo tất cả mọi thứ. Chỉ cần một cái timer dọn log bị inactive là Telegram nổ thông báo. Kết quả là mình lờ đi mọi cảnh báo vì quá nhiễu. Để khắc phục, hãy chia cảnh báo làm 2 loại:
1. Cảnh báo Đỏ (Service chết hẳn)
Chỉ áp dụng cho các dịch vụ sống còn. Nếu nó failed quá 2 phút, hãy bắn alert ngay.
- alert: ServiceDown
expr: node_systemd_unit_state{state="failed"} == 1
for: 2m
labels:
severity: critical
annotations:
summary: "Service {{ $labels.name }} chết trên {{ $labels.instance }}"
2. Cảnh báo Vàng (Service restart liên tục)
Đây là lỗi “ngầm” khó chịu nhất. Service vẫn báo active nhưng cứ 30 giây lại restart. Lúc này, hãy dùng metric node_systemd_unit_start_time_seconds để bắt thóp nó.
- alert: ServiceFlapping
expr: (time() - node_systemd_unit_start_time_seconds) < 60
for: 5m
labels:
severity: warning
annotations:
summary: "Service {{ $labels.name }} đang khởi động lại liên tục"
Dashboard và Vận hành
Đừng tốn công vẽ dashboard từ đầu. Hãy dùng Grafana ID: 7539. Nó cung cấp cái nhìn tổng thể về trạng thái xanh/đỏ của toàn bộ hệ thống. Nhìn vào biểu đồ uptime, nếu thấy đường kẻ đang đi lên mà bỗng dưng rơi thẳng đứng xuống đáy, đó là lúc bạn cần vào kiểm tra log ngay.
Một vài lưu ý cuối cùng: Tối kỵ việc mở port 9101 ra internet. Hãy dùng Firewall để chỉ cho phép Prometheus Server truy cập. Nếu bạn dùng Nginx với PHP-FPM qua socket, đừng quên giám sát luôn cả các .socket unit để đảm bảo luồng xử lý không bị tắc nghẽn.
Giám sát chi tiết đến cấp độ systemd giúp mình ngủ ngon hơn. Thay vì đợi khách hàng phàn nàn, mình thường xử lý xong lỗi ngay khi service vừa có dấu hiệu chập chờn. Chúc các bạn làm chủ hệ thống của mình!

