Giám Sát Hệ Thống với Prometheus + Grafana: Đánh Giá Thực Tế Sau 6 Tháng

DevOps tutorial - IT technology blog
DevOps tutorial - IT technology blog

Tôi Đã Dùng Gì Trước Đây (Và Tại Sao Tôi Chuyển Sang)

Trước khi chọn Prometheus + Grafana, tôi đã dành vài tuần để đánh giá các monitoring stack khác nhau. Ba ứng viên lọt vào danh sách ngắn: ELK stack (Elasticsearch + Logstash + Kibana), Datadog và bộ đôi Prometheus + Grafana. Chọn sai không chỉ là bất tiện — nó đồng nghĩa với việc phải migrate dashboard, làm quen lại từ đầu và tái cấu hình toàn bộ service. Mất cả mấy tuần.

Đây là cách tôi đã so sánh chúng lúc đó.

Phương Án 1: Managed SaaS (Datadog, New Relic)

Không cần cài đặt gì cả. Cài agent, metrics chảy vào, dashboard hiện ra. Với các team không muốn bận tâm đến hạ tầng, giải pháp này rất ổn. Vấn đề là chi phí. Datadog tính khoảng $23/máy/tháng cho monitoring hạ tầng cơ bản — thêm APM hoặc custom metric là bạn đẩy lên $40–60/máy. Với 50 server, đó là $2,000–3,000/tháng trước khi bạn thêm bất kỳ custom metric series nào. Với startup hay team nhỏ, con số đó rất khó chịu.

Phương Án 2: ELK Stack

Elasticsearch là một search engine. Người ta gắn nó vào metrics pipeline vì nó có thể lưu time-series data, nhưng nó được tối ưu cho tìm kiếm log, không phải tổng hợp metric. Chỉ riêng memory footprint đã đau đầu — một Elasticsearch cluster nhỏ cho metrics có thể cần 16–32GB RAM so với 4GB cho một setup Prometheus tương đương. Visualization của Kibana đã cải thiện nhiều, nhưng tạo dashboard vẫn cảm thấy cồng kềnh so với giao diện Grafana.

Phương Án 3: Prometheus + Grafana

Đây là thứ tôi đang dùng hiện tại. Prometheus được thiết kế chuyên biệt cho metrics: nó scrape endpoint theo mô hình pull, lưu dữ liệu dạng time-series nén, và đi kèm PromQL — một ngôn ngữ truy vấn ánh xạ tự nhiên với cách bạn nghĩ về hành vi hệ thống. Grafana kết nối với Prometheus (và hàng chục data source khác) và cho bạn những dashboard thực sự tốt để sử dụng.

Triển khai nhanh vì hệ sinh thái exporter gần như bao phủ mọi thứ. PostgreSQL, Redis, Nginx, Kubernetes, RabbitMQ — hầu hết các dự án open-source nghiêm túc đều có endpoint /metrics hoặc có community exporter. Bạn có thể monitor stack của mình trong vài giờ, không phải vài ngày.

Ưu và Nhược Điểm Thực Sự Sau Sáu Tháng

Prometheus + Grafana Làm Tốt Điều Gì

  • Scraping theo mô hình pull rất hợp lý về mặt vận hành. Service expose metrics; Prometheus fetch theo lịch. Nếu service chết, bạn biết ngay — scrape thất bại và alert kích hoạt. Hệ thống push-based có thể che giấu lỗi im lặng nếu client đơn giản ngừng gửi dữ liệu.
  • PromQL rất mạnh khi bạn đã quen. Đường cong học tập có thật. Nhưng khi bạn đã nắm được rate(), irate(), histogram_quantile() và label matcher, bạn có thể trả lời gần như mọi câu hỏi về hệ thống trong vài giây.
  • Hệ sinh thái exporter gần như bao phủ mọi thứ. Node Exporter, cAdvisor, PostgreSQL Exporter, Redis Exporter, Nginx Exporter — nếu bạn chạy nó, hầu như đã có exporter cho nó. Không cần instrumentation tùy chỉnh cho các thành phần hạ tầng chuẩn.
  • Dashboard cộng đồng tiết kiệm thời gian thực sự. Grafana.com/dashboards có hàng nghìn setup được cộng đồng chia sẻ. Import một ID và bạn có dashboard sẵn sàng cho production trong dưới một phút.
  • Resource footprint có thể quản lý được. Monitor 50 host với scrape interval 15 giây chạy thoải mái trên 2 core và 4GB RAM. Storage cũng hợp lý — 30 ngày metrics cho 50 host thường dưới 20GB với cài đặt nén mặc định.

Điểm Hạn Chế

  • Lưu trữ dài hạn cần thêm công. TSDB local của Prometheus không được thiết kế cho retention nhiều năm. Quá 15–30 ngày, bạn cần một remote write target: Thanos, Cortex hoặc VictoriaMetrics.
  • Alertmanager có đường cong cấu hình dốc. Routing tree linh hoạt nhưng không trực quan. Hãy dành vài tiếng để silence rule và receiver routing hoạt động đúng như bạn mong đợi.
  • Không có tích hợp log correlation. Prometheus chỉ dành cho metrics. Thêm log đồng nghĩa thêm Loki — tích hợp tốt với Grafana, nhưng đó là thêm một component để vận hành và debug.
  • PromQL có những edge case sẽ khiến bạn bất ngờ. Xử lý staleness, range selector và counter reset hoạt động theo những cách không hiển nhiên lúc đầu. Alert kích hoạt bất ngờ trong quá trình restart service — do cách Prometheus xử lý counter reset — là một cạm bẫy phổ biến ban đầu. Cần đọc thêm để hiểu đầy đủ.

Setup Khuyến Nghị cho Hầu Hết Các Team

Với team chạy 10–100 server với workload Linux chuẩn, container và một vài database, đây là những gì tôi sẽ triển khai:

  • Prometheus — thu thập metrics cốt lõi, retention local 30 ngày
  • Node Exporter — metrics cấp hệ thống trên mỗi host (CPU, memory, disk, network)
  • cAdvisor — container metrics nếu bạn chạy Docker hoặc Kubernetes
  • Alertmanager — định tuyến alert đến Slack/PagerDuty/email
  • Grafana — dashboard và visualization

Cần retention dài hơn hoặc Prometheus HA? Thêm VictoriaMetrics làm remote write target. Đơn giản hơn để vận hành so với Thanos và lưu metrics chỉ khoảng một phần năm dung lượng đĩa so với Prometheus thô.

Hướng Dẫn Triển Khai

Bước 1: Cài Đặt Prometheus

Tải và cài Prometheus trên monitoring server của bạn:

# Tạo user chuyên dụng
sudo useradd --no-create-home --shell /bin/false prometheus

# Tải Prometheus (kiểm tra phiên bản mới nhất tại prometheus.io)
wget https://github.com/prometheus/prometheus/releases/download/v2.51.0/prometheus-2.51.0.linux-amd64.tar.gz
tar xvf prometheus-2.51.0.linux-amd64.tar.gz
cd prometheus-2.51.0.linux-amd64

# Cài đặt binaries
sudo cp prometheus /usr/local/bin/
sudo cp promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool

# Thiết lập các thư mục
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /etc/prometheus /var/lib/prometheus

Tạo cấu hình cơ bản tại /etc/prometheus/prometheus.yml:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

rule_files:
  - "/etc/prometheus/rules/*.yml"

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

  - job_name: 'node'
    static_configs:
      - targets:
          - 'server1:9100'
          - 'server2:9100'

Tạo file systemd service tại /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/ \
  --storage.tsdb.retention.time=30d \
  --web.listen-address=0.0.0.0:9090

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus

Bước 2: Cài Đặt Node Exporter trên Mỗi Host

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

Tạo /etc/systemd/system/node_exporter.service:

[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

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

Bước 3: Cài Đặt Grafana

# Ubuntu/Debian
sudo apt-get 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-get update
sudo apt-get install grafana

sudo systemctl enable grafana-server
sudo systemctl start grafana-server

Grafana chạy trên cổng 3000. Đăng nhập mặc định là admin / admin — thay đổi ngay lần đăng nhập đầu tiên.

Bước 4: Kết Nối Prometheus với Grafana

  1. Mở Grafana tại http://your-server:3000
  2. Vào Connections → Data Sources → Add data source
  3. Chọn Prometheus
  4. Đặt URL thành http://localhost:9090
  5. Nhấn Save & Test

Import dashboard ID 1860 — dashboard Node Exporter Full. Nó bao gồm CPU, memory, disk và network cho mỗi host trong cấu hình Prometheus của bạn. Không cần cấu hình thêm gì cả.

Bước 5: Một Alert Rule Hữu Ích Để Bắt Đầu

Tạo /etc/prometheus/rules/node.yml:

groups:
  - name: node_alerts
    rules:
      - alert: HighCPULoad
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU tải cao trên {{ $labels.instance }}"
          description: "Mức sử dụng CPU là {{ $value | printf \"%.1f\" }}%"

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 15
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Dung lượng đĩa thấp trên {{ $labels.instance }}"
          description: "Filesystem root còn {{ $value | printf \"%.1f\" }}% trống"

Reload cấu hình Prometheus mà không cần khởi động lại:

curl -X POST http://localhost:9090/-/reload

Sáu Tháng Sau

Không có sự cố lớn nào do khoảng trống giám sát. Ba tình huống đầy đĩa được phát hiện và xử lý trước khi trở thành sự cố ngừng hoạt động. Một service Node.js với memory leak chậm — tăng khoảng 200MB mỗi ngày — được phát hiện và vá trước khi nó làm sập production. Chi phí giám sát giảm khoảng 70% so với chi phí Datadog ở quy mô này.

Cài đặt ban đầu mất 4–6 tiếng từ đầu đến cuối. Bao gồm Prometheus, Node Exporter trên mỗi host, Grafana và lần thiết lập alert rule đầu tiên. Hầu hết các team hoàn vốn thời gian đó trong tuần đầu tiên.

Chạy hơn vài server mà không có metrics có cấu trúc đồng nghĩa với việc đi trong bóng tối. Stack này giải quyết vấn đề đó mà không cần hóa đơn $3,000/tháng.

Share: