Operations

Giám sát VPS với Prometheus và Grafana tự host

Mỗi khi VPS chạy WordPress bỗng chậm rì, bạn phải SSH vào xem htop rồi lại thoát ra. Không có cảnh báo trước khi RAM đầy hoặc disk I/O vọt lên, sự cố thường phát hiện khi đã muộn. Bộ đôi PrometheusGrafana cho phép bạn tự host toàn bộ hệ thống giám sát trên chính VPS Linux của mình, thu thập metrics real-time, vẽ dashboard trực quan và gửi cảnh báo qua Telegram trước khi server tê liệt. Bài này hướng dẫn chi tiết trên Ubuntu 24.04 LTS.

Yêu cầu trước khi bắt đầu

  • Một VPS chạy Ubuntu 24.04 LTS với ít nhất 2GB RAM20GB SSD (Prometheus + Grafana ngốn khoảng 500MB RAM, tùy số lượng target). VPS giá rẻ 2GB RAM đủ cho môi trường nhỏ.
  • User sudo non-root (hoặc root trực tiếp).
  • Domain trỏ về IP VPS (ví dụ: monitor.example.com) - khuyến khích để có HTTPS cho Grafana.
  • Port 9090 (Prometheus), 3000 (Grafana), 9100 (Node Exporter) mở trên firewall (chỉ cho phép IP nội bộ hoặc qua reverse proxy).

Kiến trúc giám sát cơ bản

Prometheus đóng vai trò thu thập và lưu trữ metrics (dạng time-series database). Node Exporter là agent chạy trên mỗi máy chủ, expose thông số CPU/RAM/Disk/Network qua HTTP. Grafana là lớp trực quan, query dữ liệu từ Prometheus và hiển thị dashboard. Bạn có thể mở rộng thêm MySQL Exporter, Nginx Exporter khi cần. So với các dịch vụ giám sát đám mây (Datadog, New Relic), tự host bằng Prometheus + Grafana giúp bạn kiểm soát dữ liệu hoàn toàn và không phát sinh phí theo node.

Bước 1 - Cài đặt Prometheus

Prometheus không có trong apt mặc định, nên tải binary từ GitHub. Đầu tiên, tạo user và thư mục dữ liệu:

sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir /etc/prometheus /var/lib/prometheus

Tải phiên bản mới nhất (kiểm tra trang releases):

wget https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz
tar xvf prometheus-*.tar.gz
cd prometheus-*

Copy binary và config:

sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles console_libraries /etc/prometheus/
sudo cp prometheus.yml /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

Tạo file systemd service /etc/systemd/system/prometheus.service:

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus/ \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target

Khởi động và kiểm tra:

sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
sudo systemctl status prometheus

Output mong đợi: active (running). Mở trình duyệt http://<IP_VPS>:9090 - bạn sẽ thấy giao diện Prometheus web UI (chưa có data ngoại trừ metrics nội bộ của Prometheus).

Bước 2 - Cài đặt Node Exporter

Node Exporter chạy trên mọi VPS cần giám sát (có thể là cùng máy với Prometheus hoặc node khác). Tải binary và cấu hình tương tự:

sudo useradd --no-create-home --shell /bin/false node_exporter
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xvf node_exporter-*.tar.gz
sudo cp node_exporter-*/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

File service /etc/systemd/system/node_exporter.service:

[Unit]
Description=Node Exporter
After=network.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter --web.listen-address=:9100

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
sudo systemctl status node_exporter

Verify: curl http://localhost:9100/metrics | head -20 - bạn sẽ thấy các dòng node_cpu_seconds_total, node_memory_MemTotal_bytes, v.v.

Bước 3 - Cấu hình Prometheus thu thập metrics Node Exporter

Sửa file /etc/prometheus/prometheus.yml:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

Nếu Node Exporter chạy trên server khác, thay localhost:9100 bằng IP thật (vd '10.0.0.2:9100'). Khởi động lại Prometheus:

sudo systemctl restart prometheus

Kiểm tra: vào http://<IP_VPS>:9090/targets - mục node phải hiện UP.

Bước 4 - Cài đặt Grafana

Grafana cài qua apt repository chính thức:

sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo apt-get update
sudo apt-get install -y grafana
sudo systemctl enable --now grafana-server
sudo systemctl status grafana-server

Output: active (running). Truy cập http://<IP_VPS>:3000, đăng nhập bằng admin/admin (sẽ đổi password ngay).

Quan trọng: bạn nên đặt Grafana sau reverse proxy Nginx với Let's Encrypt SSL (tham khảo bài cấu hình Nginx reverse proxy) để truy cập an toàn qua HTTPS.

Bước 5 - Cấu hình Data source và Dashboard

Trong Grafana, vào Connections → Add new connection, chọn Prometheus. URL: http://localhost:9090 (nếu Prometheus cùng server), Access: Server (default), click Save & test. Thông báo xanh "Data source is working" là thành công.

Import dashboard: vào Dashboards → Import, nhập ID 1860 (Node Exporter Full của rfmoz) hoặc 11074 (Node Exporter Server Metrics của idealista). Click Load, chọn data source Prometheus vừa tạo, Import. Sau vài phút bạn sẽ thấy biểu đồ CPU, RAM, Disk, Network.

Mở rộng: bạn có thể thêm MySQL Exporter, Nginx Exporter, Blackbox Exporter (check HTTP/HTTPS), cấu trúc tương tự: cài agent, thêm target vào prometheus.yml.

Xử lý lỗi thường gặp

Lỗi: Grafana hiển thị "No data" trên dashboard

Kiểm tra: curl http://localhost:9090/api/v1/query?query=up - nếu trả về "result":[], Prometheus không nhận target. Vào /etc/prometheus/prometheus.yml xem dòng targets có đúng IP/port không, chạy promtool check config /etc/prometheus/prometheus.yml để debug syntax.

Lỗi: Port 3000 không truy cập được

Kiểm tra firewall: sudo ufw allow 3000/tcp (hoặc dùng firewall-cmd trên AlmaLinux/Rocky). Nếu dùng cloud provider, kiểm thêm Security Group. Cách an toàn hơn là chặn port 3000 public và dùng reverse proxy Nginx + SSL.

Lỗi: Prometheus không start sau khi sửa config

Xem log: sudo journalctl -u prometheus -n 50 --no-pager. Hay gặp lỗi indent YAML (Prometheus yêu cầu indent chính xác 2 space). Copy config mẫu từ tài liệu chính thức.

Mở rộng: Gửi cảnh báo qua Telegram

Prometheus hỗ trợ Alertmanager. Tạo file /etc/prometheus/alertmanager.yml cấu hình webhook Telegram, sau đó thêm rules vào prometheus.yml. Chi tiết có thể tham khảo bài gửi cảnh báo hệ thống qua Telegram bot để thấy cách tích hợp đơn giản hơn mà không cần Alertmanager.

Câu hỏi thường gặp

Prometheus và Grafana có tốn nhiều tài nguyên không?

Với 2-3 node giám sát, Prometheus + Grafana + Node Exporter ngốn khoảng 500MB - 1GB RAM, chủ yếu do Prometheus lưu metrics. Nên dùng VPS riêng 2GB RAM cho bộ giám sát này.

Có thể giám sát nhiều VPS cùng lúc không?

Có. Chỉ cần cài Node Exporter trên từng VPS, mở port 9100 cho phép IP của Prometheus server access, rồi thêm target vào prometheus.yml. Trên thuê VPS của bạn, có thể giám sát toàn bộ cluster từ một trung tâm.

Có cần mở port 9090/3000 ra internet không?

Không nên. Dùng reverse proxy Nginx với SSL (Let's Encrypt) cho Grafana, và giữ Prometheus port chỉ listen localhost hoặc trong private network. Bài cấu hình Nginx reverse proxy sẽ hướng dẫn chi tiết.

Grafana có hỗ trợ cảnh báo không?

Có. Grafana v8+ tích hợp sẵn Alerting engine, có thể gửi cảnh báo qua Telegram, Slack, Email mà không cần Alertmanager. Tuy nhiên với môi trường phức tạp, Prometheus Alertmanager vẫn linh hoạt hơn.

Làm sao để backup dữ liệu Prometheus?

Dùng snapshot API của Prometheus: curl -XPOST http://localhost:9090/api/v1/admin/tsdb/snapshot. Hoặc backup thư mục /var/lib/prometheus khi Prometheus đã stop. Kết hợp cronjob và script push lên S3 như bài backup VPS lên S3 với Restic.

Bài viết liên quan

Lưu ý: Bài viết mang tính tham khảo, tổng hợp kiến thức chung. Mỗi hệ thống, hạ tầng và nhu cầu có đặc thù riêng, nên kiểm thử trong môi trường an toàn và tham vấn kỹ sư trước khi triển khai thực tế.