Prometheus Grafana Real-time Server Monitoring

เมื่อ VPS ของคุณมีจำนวนมากขึ้น การ Monitor server ด้วยตา นั้นเป็นไปไม่ได้เลย Prometheus + Grafana คือชุดเครื่องมือที่ช่วยแก้ปัญหานี้ได้อย่างสมบูรณ์ Prometheus เป็น Time-series Database ที่เก็บ metrics เช่น CPU, Memory, Disk usage จาก server ต่างๆ ส่วน Grafana เป็น Frontend ที่สวยงามแล้ว interactive มากสำหรับแสดงข้อมูล metrics เป็น Dashboard ในรูปแบบ Graph, Table, Gauge หรือ Heatmap ทำให้คุณสามารถ Monitor infrastructure แบบ Real-time พร้อมตั้ง Alert rules เมื่อ metrics ผิดปกติได้ทันที

ทำไมต้อง Prometheus + Grafana

ปัญหาที่พบบ่อยเมื่อจำนวน server มีมาก คือ คุณต้องลง SSH เข้าแต่ละ server แล้วรัน top, df, free -h เป็นแบบนี้เรื่อยๆ ยิ่งเมื่อเกิดปัญหาขึ้น คุณต้อง react ได้เร็ว เพราะถ้า server ล่มเพียงตัวเดียว อาจส่งผลกระทบต่อทั้งระบบ Prometheus + Grafana แก้ไขปัญหาได้หลายด้าน ทำให้คุณสามารถจัดการ infrastructure ที่มีความซับซ้อนได้อย่างมีประสิทธิภาพ

ข้อกำหนดเบื้องต้น

ก่อนเริ่มติดตั้ง Prometheus + Grafana ต้องตรวจสอบให้แน่ใจว่า VPS ของคุณ ตรงตามข้อกำหนดข้อเท่าไหร่ต่อไปนี้ การมี resource เพียงพอจะช่วยให้ระบบ monitoring ทำงานได้อย่างเรียบเรียง

ขั้นที่ 1 — ติดตั้ง Prometheus

สร้าง user และ directory

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

ดาวน์โหลด Prometheus

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

# Copy ไฟล์ binary
sudo cp prometheus-2.45.0.linux-amd64/prometheus /usr/local/bin/
sudo cp prometheus-2.45.0.linux-amd64/promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool

# Copy console template
sudo cp -r prometheus-2.45.0.linux-amd64/consoles /etc/prometheus
sudo cp -r prometheus-2.45.0.linux-amd64/console_libraries /etc/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus

สร้าง config file prometheus.yml

sudo tee /etc/prometheus/prometheus.yml > /dev/null << 'EOF'
global:
  scrape_interval: 15s
  evaluation_interval: 15s

alerting:
  alertmanagers:
    - static_configs:
        - targets: []

rule_files:
  - '/etc/prometheus/alert.rules.yml'

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

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

  - job_name: 'vps-server-2'
    static_configs:
      - targets: ['192.168.1.100:9100']  # แปลงเป็น IP ของ server ที่ 2

  - job_name: 'vps-server-3'
    static_configs:
      - targets: ['192.168.1.101:9100']

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

สร้าง systemd service

sudo tee /etc/systemd/system/prometheus.service > /dev/null << 'EOF'
[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

Restart=always
RestartSec=5

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

ตรวจสอบ Prometheus ว่าทำงาน

curl -s http://localhost:9090
# ต้องได้ HTML response พร้อมคำว่า "Prometheus"
# เข้า http://YOUR_VPS_IP:9090 จะเห็น Prometheus UI

หมายเหตุ: Prometheus ตัวเดียวเก็บ metrics ของตัวเองได้ แต่เพื่อ monitor server อื่นๆ ต้องติดตั้ง Node Exporter บนแต่ละ server ที่จะ monitor

ขั้นที่ 2 — ติดตั้ง Node Exporter (บนแต่ละ server ที่จะ monitor)

cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar -xvf node_exporter-1.6.1.linux-amd64.tar.gz

sudo cp node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/
sudo chown root:root /usr/local/bin/node_exporter

# สร้าง systemd service
sudo tee /etc/systemd/system/node_exporter.service > /dev/null << 'EOF'
[Unit]
Description=Node Exporter
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/node_exporter \
  --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)

Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

ตรวจสอบ Node Exporter

curl -s http://localhost:9100/metrics | head -20
# ต้องเห็น metrics เช่น node_cpu_seconds_total, node_memory_MemTotal_bytes เป็นต้น

ขั้นที่ 3 — ติดตั้ง Grafana

ติดตั้งจาก APT repository

sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana

เริ่มต้น Grafana service

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

# ตรวจสอบสถานะ
sudo systemctl status grafana-server

เข้า Grafana Dashboard

# เข้า http://YOUR_VPS_IP:3000
# ชื่อผู้ใช้: admin
# รหัสผ่าน: admin
# ระบบจะให้เปลี่ยนรหัสผ่านอันแรกเข้า

ขั้นที่ 4 — เพิ่ม Prometheus เป็น Data Source ใน Grafana

  1. เข้า Grafana UI → Configuration (gear icon) → Data Sources
  2. คลิก "Add data source"
  3. เลือก "Prometheus"
  4. ใส่ URL: http://localhost:9090
  5. กด "Save & test" → ต้องได้ข้อความ "Data source is working"

ขั้นที่ 5 — สร้าง Dashboard

ไปยัง Dashboards → Create → Dashboard

หรือใช้ pre-built dashboard จาก Grafana community library (ต้องมี ID เช่น 1860 = Node Exporter Full)

ตัวอย่าง: Import Dashboard เสร็จสิ้นแล้ว

# ใน Grafana UI → + (plus) → Import
# ใส่ Dashboard ID: 1860
# เลือก Prometheus data source ที่เพิ่งสร้าง
# คลิก Import
# จะเห็น Dashboard แสดง CPU, Memory, Disk, Network metrics ทันที

ขั้นที่ 6 — ตั้งค่า Alert Rules

สร้าง alert.rules.yml

sudo tee /etc/prometheus/alert.rules.yml > /dev/null << 'EOF'
groups:
  - name: System Alerts
    interval: 30s
    rules:
      - alert: HighCPUUsage
        expr: (100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"
          description: "CPU usage is {{ $value }}% on {{ $labels.instance }}"

      - alert: HighMemoryUsage
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High memory usage on {{ $labels.instance }}"

      - alert: HighDiskUsage
        expr: (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs"} / node_filesystem_size_bytes)) * 100 > 90
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Disk usage high on {{ $labels.instance }}: {{ $value | humanize }}%"

EOF
sudo chown prometheus:prometheus /etc/prometheus/alert.rules.yml

Reload Prometheus config

sudo systemctl reload prometheus

# ตรวจสอบ alert สถานะใน http://YOUR_VPS_IP:9090/alerts

Troubleshooting ปัญหาทั่วไป

Prometheus ไม่ connected ไป Node Exporter

ปัญหานี้มักเกิดจากการตั้งค่าที่ไม่ถูกต้องหรือ firewall blockage ต่อไปนี้เป็นวิธีการแก้ปัญหา:

# ตรวจ Prometheus logs เพื่อดูข้อมูล error
sudo journalctl -u prometheus -n 50

# ตรวจ firewall (ถ้าเป็น remote server) แน่ใจว่า port 9100 เปิด
sudo ufw allow 9100/tcp
sudo ufw status

# ตรวจ config syntax ให้แน่ใจว่า prometheus.yml ไม่มี syntax error
sudo -u prometheus /usr/local/bin/promtool check config /etc/prometheus/prometheus.yml

# ลอง ping remote server ดู (หาก DNS ใช้ได้)
ping 192.168.1.100

# Reload prometheus เพื่อให้อ่าน config ใหม่
sudo systemctl reload prometheus

Grafana แสดง "No data"

ถ้า Grafana dashboard แสดง "No data" ให้ตรวจสอบหลายๆ จุด เพื่อหาสาเหตุ:

# ตรวจ Time range ว่า set ไว้ใหญ่พอไหม (default 6 hours ถ้า data เพิ่งออก อาจต้อง expand)
# ตรวจ PromQL query ในแต่ละ panel ว่า syntax ถูกไหม หรือ metric name ถูกไหม
# ตรวจว่า Prometheus มี metrics อยู่จริง
curl http://localhost:9090/api/v1/targets
# ต้องเห็น state = "up" ของ targets ที่ configure ไว้

# ลอง query ตรง Prometheus UI
# ไปยัง http://YOUR_VPS_IP:9090/graph
# ทดลอง query เช่น: node_cpu_seconds_total

Alert ไม่ทำงาน

Alert ไม่ทำงานได้มีหลายสาเหตุ เช่น syntax error ใน alert rule หรือ expression ที่ไม่มีข้อมูล:

# ตรวจ alert.rules.yml syntax ให้แน่ใจว่าไม่มี YAML error
sudo -u prometheus /usr/local/bin/promtool check rules /etc/prometheus/alert.rules.yml

# ตรวจว่า expression สามารถ evaluate ได้
# ไปยัง http://YOUR_VPS_IP:9090/graph
# ใส่ expression เช่น: (100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100))
# ดูว่า มีค่ากลับมาไหม ถ้าไม่มีค่า คือ metric ไม่มีข้อมูล

# ตรวจ Alerts page เพื่อดูสถานะ alert
# http://YOUR_VPS_IP:9090/alerts

ขั้นต่อไป: ตั้ง Alertmanager (ส่ง Slack/Email notification)

ทั้งนี้ Alert rules ใน Prometheus ยังส่ง notification ไปยัง slack หรือ email ไม่ได้ต้องใช้ Alertmanager component ตั้งต่อ แต่นั่นเป็นเรื่องของขั้นตอนต่อไป สำหรับ monitoring พื้นฐาน Prometheus + Grafana + Node Exporter ที่เขียนไว้ข้างบนก็พอใช้ได้ดี

ต้องการ VPS สำหรับรัน Prometheus + Grafana?

AsiaGB มี VPS Linux พร้อม Full Root Access และ SSD ที่เหมาะสำหรับ monitoring infrastructure เริ่มต้น 500 บาท/เดือน พร้อม uptime 99%

ดู VPS Plans