Giám sát băng thông Internet 24/7: ‘Đối chất’ với nhà mạng bằng Prometheus và Grafana

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

Gói cước 300Mbps nhưng họp Zoom vẫn lag?

Kịch bản này chắc chắn không lạ gì với anh em sysadmin: Đang họp online thì kết nối chập chờn, hoặc tải Docker image lẹt đẹt vài trăm KB/s. Bạn gọi lên tổng đài, kỹ thuật viên báo ‘tín hiệu vẫn xanh’. Lúc này, một kết quả Speedtest chạy tay bằng trình duyệt là không đủ thuyết phục vì họ có thể đổ lỗi cho Wi-Fi hoặc thiết bị cá nhân của bạn.

Để thoát cảnh ‘đoán già đoán non’, chúng ta cần một hệ thống giám sát tự động, chạy 24/7 để đối chất bằng dữ liệu lịch sử. Thay vì bấm ‘Go’ thủ công, mình sẽ dùng Speedtest Exporter để tự động hóa việc đo đạc, đẩy metrics về Prometheus và trực quan hóa sinh động trên Grafana.

Mô hình triển khai: ‘Kiềng ba chân’

Trước khi gõ lệnh, hãy nhìn nhanh cách các thành phần này phối hợp với nhau:

  • Speedtest Exporter: Đóng vai trò client, định kỳ chạy test (ping, download, upload) rồi ‘phơi’ kết quả dưới dạng metrics chuẩn Prometheus.
  • Prometheus: ‘Kho lưu trữ’ dữ liệu thời gian (Time-series database). Nó sẽ ghé thăm Exporter để lấy metrics và lưu vào database theo chu kỳ.
  • Grafana: Lớp hiển thị cuối cùng. Công cụ này truy vấn dữ liệu từ Prometheus để vẽ biểu đồ, giúp bạn soi rõ xu hướng mạng lag vào giờ cao điểm hay ban đêm.

Các công cụ như Netdata hay htop rất tốt để xem traffic tức thời, nhưng chúng không cho biết băng thông tối đa bạn thực sự nhận được từ ISP là bao nhiêu. Đó là lý do Speedtest Exporter trở nên cần thiết.

Triển khai thực tế với Docker Compose

Dùng Docker là cách sạch sẽ nhất để tránh xung đột thư viện Python trên OS. Dưới đây là file docker-compose.yml mình đã tối ưu cho các môi trường homelab hoặc văn phòng nhỏ:

version: '3.8'

services:
  speedtest-exporter:
    image: miguelndecarvalho/speedtest-exporter
    container_name: speedtest-exporter
    restart: unless-stopped
    ports:
      - "9798:9798"
    environment:
      - SPEEDTEST_INTERVAL=3600 # Chạy test mỗi 60 phút

  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - "9090:9090"
    restart: unless-stopped

  grafana:
    image: grafana/grafana
    container_name: grafana
    ports:
      - "3000:3000"
    restart: unless-stopped

Một thông số cần lưu ý: Mình đặt SPEEDTEST_INTERVAL=3600 (1 tiếng/lần). Đừng ham set 1-5 phút một lần. Mỗi bài test có thể ngốn tới 500MB băng thông nếu mạng bạn nhanh. Chạy quá dày sẽ làm chính mạng nhà bạn bị chậm, chưa kể ISP có thể ‘sờ gáy’ vì lượng traffic bất thường hoặc bị server Speedtest chặn IP.

Cấu hình Prometheus lấy dữ liệu

Tiếp theo, bạn tạo file prometheus.yml cùng thư mục để chỉ đường cho Prometheus kết nối tới Exporter:

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'speedtest'
    static_configs:
      - targets: ['speedtest-exporter:9798']

Chạy lệnh docker-compose up -d để khởi động. Truy cập http://localhost:9090, gõ thử speedtest_download_bits_per_second để kiểm tra dữ liệu bắt đầu đổ về hay chưa.

Vẽ biểu đồ Grafana và bài toán ‘Alert Fatigue’

Trên giao diện Grafana, hãy thêm Data Source là Prometheus với URL http://prometheus:9090. Cách nhanh nhất là Import Dashboard ID 13680. Bạn sẽ có ngay biểu đồ Download, Upload và Ping cực kỳ chuyên nghiệp.

Kinh nghiệm xương máu về cảnh báo

Alert fatigue (ngộp thông báo) là vấn đề gây đau đầu nhất. Ban đầu, mình đặt cảnh báo Telegram khi Download xuống dưới 50Mbps. Kết quả là điện thoại ‘nổ’ thông báo liên tục mỗi khi nhà có người xem Netflix 4K hoặc tải game Steam. Đơn giản vì lúc đó Speedtest không chiếm đủ băng thông để đo chính xác.

Giải pháp thực chiến:
1. Tuyệt đối không alert dựa trên một kết quả duy nhất. Hãy dùng hàm avg_over_time trong Prometheus để tính trung bình trong 3-6 tiếng. Nếu trung bình cả buổi mà tốc độ thấp, lúc đó mới thực sự là lỗi từ nhà mạng.
2. Cố định Server ID gần nhất (ví dụ server của Viettel hoặc FPT tại Hà Nội/TP.HCM). Điều này tránh việc Exporter tự chọn server tận Singapore, khiến kết quả ping cao và tốc độ không ổn định.

Mẹo tối ưu để kết quả đo chính xác hơn

Nếu bạn chạy Exporter trên Raspberry Pi qua Wi-Fi, kết quả nhận được chỉ là tốc độ của… Wi-Fi nhà bạn. Để giám sát chuẩn nhất, hãy ghi nhớ:

  • Luôn cắm dây LAN trực tiếp từ thiết bị đo vào Router chính.
  • Sử dụng bản image của miguelndecarvalho vì nó hỗ trợ tốt cả ARM (cho Pi) lẫn x86 (Server/PC).
  • Đảm bảo CPU thiết bị không quá tải khi đo, vì xử lý dữ liệu tốc độ cao cũng ngốn tài nguyên đáng kể.

Kết luận

Giám sát Internet 24/7 giúp bạn có bằng chứng thép khi làm việc với ISP, đồng thời sớm phát hiện các vấn đề của mạng nội bộ. Hy vọng những mẹo về cấu hình và cách tránh alert fatigue này giúp hệ thống của bạn hoạt động hiệu quả. Nếu gặp lỗi khi viết Prometheus query, anh em cứ để lại bình luận phía dưới nhé!

Share: