Hướng dẫn cài đặt và cấu hình Prometheus kết hợp Grafana trên Ubuntu Server

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

1. Vấn đề thực tế: Server sập lúc 2h sáng và sự bất lực khi thiếu metrics

2 giờ sáng thứ Bảy, hệ thống API báo lỗi 504 Gateway Timeout hàng loạt. Khách hàng réo, sếp gọi, mình vội bật laptop SSH vào server gõ top, free -m, df -h. Trớ trêu thay, CPU lúc này chỉ 3%, RAM trống hơn 10GB và ổ cứng còn hơn 40% dung lượng. Sự cố diễn ra trong khoảng 5 phút rồi tự hết, để lại một hiện trường sạch trơn.

Không có dữ liệu lịch sử (historical metrics), mình hoàn toàn đoán mò. CPU spike do cronjob chạy ngầm? Memory leak khiến OOM-killer kích hoạt? Hay ổ cứng bị nghẽn I/O do database flush dữ liệu? Câu trả lời là: không ai biết.

2. Phân tích nguyên nhân: Vì sao các lệnh CLI truyền thống là chưa đủ?

Các lệnh kinh điển như top, vmstat hay iostat chỉ cho bạn biết trạng thái tại đúng giây bạn ấn Enter. Chúng là ảnh chụp tức thời (snapshot). Khi sự cố trôi qua, mọi dấu vết đều biến mất.

Mặt khác, log ứng dụng chỉ ghi nhận lỗi ở tầng code (như timeout kết nối DB), chứ không nói cho bạn biết lúc đó disk write latency vọt lên 500ms. Khi hạ tầng tăng từ 1 lên 10 hay 50 server, việc SSH vào từng máy để kiểm tra thủ công là bất khả thi. Bạn cần một hệ thống tự động gom chỉ số định kỳ và lưu vào cơ sở dữ liệu chuyên dụng (Time-series DB).

3. So sánh các phương án giám sát hạ tầng

  • SaaS (Datadog, New Relic): Cài đặt bằng một dòng lệnh, giao diện rất đẹp. Tuy nhiên, chi phí khoảng $15 – $23/host/tháng. Khi cụm server phình to kèm hàng triệu custom metrics, hóa đơn cuối tháng sẽ trở thành gánh nặng lớn.
  • Zabbix / Nagios: Rất mạnh trong việc check trạng thái sống/chết (up/down). Điểm trừ là cấu hình agent khá cồng kềnh, tiêu tốn tài nguyên và khả năng xử lý dữ liệu chuỗi thời gian không linh hoạt bằng Prometheus.
  • Tự viết Bash script đẩy vào MySQL/InfluxDB: Dễ viết lúc đầu nhưng khó scale, dễ lỗi format và tốn công bảo trì hạ tầng lưu trữ.

4. Giải pháp: Bộ ba Prometheus, Node Exporter và Grafana

Đây là tiêu chuẩn thực tế (de-facto standard) trong giới DevOps nhờ tính gọn nhẹ, miễn phí và khả năng mở rộng tốt:

  • Node Exporter: Agent thu thập số liệu phần cứng (CPU, RAM, Disk, Network) trên từng server và mở endpoint HTTP :9100/metrics.
  • Prometheus: Server trung tâm, định kỳ 15 giây chủ động kéo (pull) metrics về lưu trữ dạng chuỗi thời gian.
  • Grafana: Giao diện trực quan hóa, truy vấn dữ liệu từ Prometheus để vẽ dashboard và thiết lập cảnh báo (Alerting).

Bước 1: Tạo System User và phân quyền thư mục

Chạy các tiến trình giám sát bằng user root là rủi ro bảo mật không cần thiết. Hãy tạo các service user riêng biệt:

sudo useradd --no-create-home --shell /bin/false prometheus
sudo useradd --no-create-home --shell /bin/false node_exporter

sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus

Bước 2: Cài đặt và cấu hình Node Exporter

Tải bản phát hành ổn định (ví dụ v1.8.2) từ GitHub:

cd /tmp
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-1.8.2.linux-amd64.tar.gz
sudo mv node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
rm -rf node_exporter-1.8.2.*

Tạo systemd service để quản lý tiến trình:

sudo nano /etc/systemd/system/node_exporter.service

Nội dung file:

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

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Khởi chạy và bật tự động bật khi reboot:

sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter

Kiểm tra dữ liệu mẫu trả về:

curl -s http://localhost:9100/metrics | head -n 10

Bước 3: Cài đặt và cấu hình Prometheus Server

Tải gói binary Prometheus (bản 2.54.1):

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

cd prometheus-2.54.1.linux-amd64
sudo mv prometheus promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool

sudo mv consoles console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus/consoles /etc/prometheus/console_libraries

Tạo file cấu hình quét metrics:

sudo nano /etc/prometheus/prometheus.yml

Cấu hình Prometheus định kỳ lấy số liệu từ chính nó và Node Exporter:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

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

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']

Phân quyền lại file cấu hình:

sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml

Tạo systemd service cho Prometheus:

sudo nano /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
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/ \
  --storage.tsdb.retention.time=30d \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Khởi chạy service:

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

Kiểm tra trên trình duyệt qua cổng 9090: http://IP_SERVER:9090. Vào mục Status > Targets, nếu cả 2 endpoint đều báo trạng thái UP màu xanh lá là thành công.

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

Cài đặt Grafana từ repository chính thức của Grafana Labs để luôn nhận được các bản vá bảo mật:

sudo apt update
sudo apt install -y apt-transport-https software-properties-common wget

sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null

echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list

sudo apt update
sudo apt install -y grafana

sudo systemctl enable --now grafana-server

Mở trình duyệt truy cập: http://IP_SERVER:3000. Tài khoản ban đầu là admin / admin (Grafana sẽ yêu cầu đặt mật khẩu mới ngay khi vào).

Bước 5: Kết nối Prometheus và import Dashboard chuẩn

  1. Trong giao diện Grafana, chọn Connections > Data sources > nhấn Add data source.
  2. Chọn Prometheus.
  3. Tại trường Prometheus server URL, nhập http://localhost:9090.
  4. Kéo xuống cuối trang, nhấn Save & test để xác nhận kết nối.
  5. Để dựng giao diện theo dõi mà không cần vẽ thủ công từng chart: vào Dashboards > New > Import.
  6. Nhập ID Dashboard cộng đồng phổ biến nhất cho Node Exporter: 1860 (Node Exporter Full) rồi nhấn Load.
  7. Chọn Data source Prometheus vừa kết nối ở bước trên và bấm Import.

Toàn bộ tài nguyên server sẽ hiển thị trực quan: % CPU sử dụng theo từng core, RAM cache/available thực tế, I/O read/write latency và lưu lượng network throughput theo thời gian thực.

Share: