เมื่อ 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 ที่มีความซับซ้อนได้อย่างมีประสิทธิภาพ
- Centralized monitoring — ดูสถานะ 10-100 server จากหน้า Dashboard เดียว ไม่ต้องเข้า SSH ทีละตัว เป็นวิธีที่สามารถประหยัดเวลาและลดความผิดพลาดได้มาก
- Historical data — Prometheus เก็บข้อมูลรายชั่วโมง-รายวัน ดูเทรนด์ CPU/Memory ได้หลายสัปดาห์ย้อนหลัง ช่วยในการวิเคราะห์ performance bottleneck และการวางแผนการ upgrade infrastructure
- Alert rules — ตั้ง Alert เมื่อ CPU > 80% หรือ Disk > 90% จะส่ง notification ไปยัง Slack, Email, PagerDuty อัตโนมัติ ไม่ต้องคอยตรวจจากหน้า Dashboard ตลอดวัน
- ฟรี Open-source — Prometheus และ Grafana (community edition) ไม่มีค่าใช้จ่าย ติดตั้งบน VPS ของคุณเอง ไม่ต้องจ่ายค่าสมัครรายเดือนให้ SaaS provider
- Flexible queries — Prometheus มี PromQL query language ที่ทรงพลัง ทำการวิเคราะห์ metrics ได้ลึก เช่น คำนวณ average, rate of change, percentile ฯลฯ
- Extensible architecture — รองรับ exporter กว่า 1000 ตัวสำหรับ database, web server, message queue ทำให้สามารถ monitor application ประเภทต่างๆ ได้
ข้อกำหนดเบื้องต้น
ก่อนเริ่มติดตั้ง Prometheus + Grafana ต้องตรวจสอบให้แน่ใจว่า VPS ของคุณ ตรงตามข้อกำหนดข้อเท่าไหร่ต่อไปนี้ การมี resource เพียงพอจะช่วยให้ระบบ monitoring ทำงานได้อย่างเรียบเรียง
- OS และ CPU: VPS Ubuntu 20.04 LTS ขึ้นไป (Prometheus ต่ำสุด RAM 512 MB แต่ 2 GB ปลอดภัยกว่า) CPU 1 core พอสำหรับ monitoring server 10-20 ตัว แต่ถ้ามีจำนวนมากกว่านั้นแนะนำให้มี 2-4 core
- Firewall และ Port: Port 9090 (Prometheus), 3000 (Grafana), 9100 (Node Exporter) ต้องเปิดใน Firewall บนทั้ง monitoring server และ remote server ที่จะ monitor
- Sudo access: ต้องมี sudo privilege เพื่อติดตั้ง service, สร้าง user, และจัดการ systemd
- Domain (ไม่บังคับแต่แนะนำ): Domain หรือ IP address ที่ชี้ไปยัง VPS ช่วยให้ access Grafana ได้สะดวก บวกกับการตั้ง SSL certificate ให้ security ที่ดีขึ้น
ขั้นที่ 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
- เข้า Grafana UI → Configuration (gear icon) → Data Sources
- คลิก "Add data source"
- เลือก "Prometheus"
- ใส่ URL:
http://localhost:9090 - กด "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