Node Exporter: Thu thập metrics hệ thống Linux cho Prometheus

Monitoring tutorial - IT technology blog
Monitoring tutorial - IT technology blog

Node Exporter là gì và tại sao bạn cần nó?

Prometheus rất giỏi thu thập và lưu trữ metrics theo thời gian, nhưng nó không tự đọc được thông tin phần cứng hay OS của Linux. Đó là chỗ Node Exporter chen vào — nó chạy trên mỗi server, đọc dữ liệu hệ thống, rồi expose ra một HTTP endpoint để Prometheus scrape định kỳ.

Nói nôm na: Node Exporter là “agent” đứng trên từng máy, đọc /proc/sys của Linux rồi dịch ra định dạng Prometheus hiểu được.

Hệ thống monitoring của mình gồm Prometheus + Grafana theo dõi 15 server, và setup này đã giúp phát hiện sự cố trước khi user báo — chẳng hạn disk của một server staging lên tới 94% lúc 2 giờ sáng, Alertmanager bắn Telegram ngay, kịp xử lý trước giờ làm việc. Tất cả bắt đầu từ việc cài đúng Node Exporter.

Bài này đi thẳng vào phần Node Exporter: cài như thế nào, collectors nào đáng bật, và cách xác nhận nó chạy đúng. Phần kết nối Prometheus/Grafana mình đã có bài riêng.

Cài đặt Node Exporter

Cách 1: Cài thủ công từ binary (khuyến nghị)

Cách này kiểm soát được version và dùng được trên mọi distro. Truy cập trang releases của Node Exporter để lấy link bản mới nhất:

# Tải Node Exporter (thay version nếu cần)
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz

# Giải nén
tar xvf node_exporter-1.8.2.linux-amd64.tar.gz

# Copy binary vào /usr/local/bin
sudo cp node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo chmod +x /usr/local/bin/node_exporter

Tạo user riêng để chạy service

Chạy Node Exporter bằng root là một ý tệ. Tạo một system user không có shell, không có home directory:

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

Tạo systemd service

Có service thì Node Exporter tự khởi động sau reboot và dễ quản lý bằng systemctl:

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

Nội dung file:

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

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
  --collector.systemd \
  --collector.processes
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target
# Reload và enable service
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter

# Kiểm tra trạng thái
sudo systemctl status node_exporter

Cách 2: Cài qua package manager (Ubuntu/Debian)

Một số distro có sẵn package, nhưng version thường tụt hậu khá xa so với upstream:

# Ubuntu 22.04+
sudo apt install prometheus-node-exporter -y

# Tự động tạo service và start
sudo systemctl status prometheus-node-exporter

Vấn đề ở chỗ binary nằm ở /usr/bin/prometheus-node-exporter thay vì /usr/local/bin/node_exporter, tên service cũng khác. Nếu team dùng nhiều distro thì dễ nhầm lẫn khi debug. Mình thường chọn cài thủ công để mọi server đồng nhất.

Cấu hình collectors

Node Exporter có hơn 50 collectors, mặc định đã bật những cái quan trọng nhất. Một số collector hữu ích thì phải kích hoạt tay.

Collectors mặc định (luôn bật)

  • cpu — CPU usage, iowait, steal time
  • meminfo — RAM total, used, buffers, cached
  • diskstats — Disk I/O (read/write ops, throughput)
  • filesystem — Disk space usage theo mount point
  • netdev — Network interface statistics
  • loadavg — Load average 1/5/15 phút
  • stat — Kernel statistics (context switches, interrupts)

Collectors cần bật thêm

Thêm vào phần ExecStart trong file systemd:

ExecStart=/usr/local/bin/node_exporter \
  --collector.systemd \
  --collector.processes \
  --collector.interrupts \
  --collector.tcpstat \
  --collector.cpu.info

Từng option làm gì:

  • --collector.systemd — Theo dõi trạng thái systemd services (active/failed). Thiếu cái này thì không alert được khi service crash.
  • --collector.processes — Số process đang chạy, zombie processes
  • --collector.tcpstat — TCP connection states (ESTABLISHED, TIME_WAIT…)
  • --collector.cpu.info — Thông tin CPU model, frequency

Tắt collector không cần thiết

Muốn giảm lượng metrics Prometheus phải xử lý, tắt những collector ít dùng đi:

ExecStart=/usr/local/bin/node_exporter \
  --no-collector.infiniband \
  --no-collector.ipvs \
  --collector.systemd

Cấu hình network binding

Mặc định Node Exporter lắng nghe trên tất cả interface ở port 9100. Trên production, bind vào interface nội bộ thôi:

ExecStart=/usr/local/bin/node_exporter \
  --web.listen-address="10.0.0.5:9100" \
  --collector.systemd

Thay 10.0.0.5 bằng IP internal của server, rồi reload:

sudo systemctl daemon-reload
sudo systemctl restart node_exporter

Kiểm tra và monitoring

Xác nhận Node Exporter đang chạy

# Kiểm tra port đang listen
ss -tlnp | grep 9100

# Hoặc dùng curl để xem metrics trực tiếp
curl http://localhost:9100/metrics | head -50

Output trông như thế này là ổn:

# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 12345.67
node_cpu_seconds_total{cpu="0",mode="iowait"} 23.45

Kiểm tra một số metrics quan trọng

# Xem CPU metrics
curl -s http://localhost:9100/metrics | grep "^node_cpu"

# Xem disk usage
curl -s http://localhost:9100/metrics | grep "node_filesystem_avail_bytes"

# Xem RAM
curl -s http://localhost:9100/metrics | grep "node_memory_MemAvailable_bytes"

Mở firewall nếu cần

Prometheus server cần kết nối được vào port 9100 của node:

# UFW (Ubuntu)
sudo ufw allow from <prometheus-server-ip> to any port 9100

# Firewalld (CentOS/RHEL)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<prometheus-server-ip>" port protocol="tcp" port="9100" accept'
sudo firewall-cmd --reload

Thêm vào Prometheus config

Trên Prometheus server, chỉnh file prometheus.yml:

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets:
          - '10.0.0.5:9100'   # server 1
          - '10.0.0.6:9100'   # server 2
          - '10.0.0.7:9100'   # server 3
    # Thêm label để dễ filter trong Grafana
    relabel_configs:
      - source_labels: [__address__]
        target_label: instance

Reload Prometheus:

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

Kiểm tra trên Prometheus UI

Mở trình duyệt vào http://<prometheus-server>:9090/targets — các node hiển thị trạng thái UP màu xanh là đã kết nối. Thấy DOWN thì kiểm tra lại firewall và địa chỉ IP.

Thử vài PromQL query để xác nhận dữ liệu đã về:

# CPU usage tổng (trừ idle)
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# RAM còn trống (GB)
node_memory_MemAvailable_bytes / 1024 / 1024 / 1024

# Disk còn lại (%)
(node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100

Troubleshooting thường gặp

Một vài lỗi mình hay gặp khi setup hàng loạt server:

  • Service không start: Chạy journalctl -u node_exporter -n 20 xem log — thường do sai đường dẫn binary hoặc thiếu permission trên file.
  • Port bị chiếm: ss -tlnp | grep 9100 để xem tiến trình nào đang giữ port đó.
  • Prometheus không scrape được: Thử curl http://<node-ip>:9100/metrics từ Prometheus server. Không kết nối được là lỗi network/firewall, không phải lỗi Node Exporter.
  • Metrics systemd không có: User node_exporter cần quyền đọc D-Bus — một số distro yêu cầu thêm user vào group systemd-journal.

Share: