Lab: Prometheus + Grafana + node_exporter
ถึงเวลาลงมือจริง! ใน lab นี้คุณจะตั้ง metrics stack ครบชุด ด้วย Docker Compose แล้วดู CPU/RAM/disk ของเครื่องตัวเองแบบ real-time เหมือนที่ระบบ production ทำ
ไฟล์ทั้งหมดพร้อมรันอยู่ที่
docker/prometheus/lab-metrics-01/ใน repo แล้ว — เปิดไปดูควบคู่กับอ่านบทนี้ได้เลย
สิ่งที่จะได้: Prometheus (เก็บ metric) + node_exporter (metric เครื่อง) + cAdvisor (metric container) + Grafana (dashboard)
ขั้นที่ 0: เข้าใจ topology ก่อน
┌─────────────┐ scrape :9100 ┌───────────────┐
│ │◀───────────────│ node-exporter │ CPU/RAM/disk ของเครื่อง
│ Prometheus │ scrape :8080 ┌───────────────┐
│ :9090 │◀───────────────│ cAdvisor │ metric ต่อ container
│ │ └───────────────┘
└──────┬──────┘
│ query (PromQL)
▼
┌─────────────┐
│ Grafana │ dashboard → http://localhost:3001
│ :3001 │
└─────────────┘
ขั้นที่ 1: รัน stack
cd docker/prometheus/lab-metrics-01
docker compose up -d
รอสัก 15-20 วินาทีให้ทุกอย่างพร้อม แล้วเช็คว่า container ขึ้นครบ:
docker compose ps
# ควรเห็น prometheus, node-exporter, cadvisor, grafana เป็น "Up"
ขั้นที่ 2: ยืนยันว่า Prometheus scrape ได้
เปิด http://localhost:9090 → เมนู Status → Targets
คุณควรเห็น 3 job (prometheus, node, cadvisor) เป็นสีเขียว UP ทั้งหมด
ถ้า target ไหนเป็น DOWN ให้ดู error ข้างๆ — ปกติเป็นเรื่องชื่อ host ใน
prometheus.ymlไม่ตรงกับชื่อ service ใน compose (จำ pull model จากบทที่ 20 — Prometheus ต้องต่อไปหา target ให้ได้)
ลองดู metric up ที่หน้า Graph (พิมพ์ up แล้ว Execute) — ทุก target ที่ scrape ได้จะมีค่า 1
ขั้นที่ 3: เล่น PromQL กับข้อมูลจริง
ที่หน้า Graph ของ Prometheus (http://localhost:9090/graph) ลองพิมพ์ทีละ query (ทบทวนบทที่ 21):
# CPU busy % ของเครื่อง (100 ลบเวลาที่ idle)
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)
# Memory ที่ใช้ไป %
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# Disk เหลือ % ของ root filesystem
node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100
# CPU ที่แต่ละ container ใช้ (จาก cAdvisor)
rate(container_cpu_usage_seconds_total{name!=""}[1m])
ลองเปิดโปรแกรมหนักๆ บนเครื่อง (เช่น build โปรเจกต์ หรือ
stress) แล้วดูกราฟ CPU ขยับขึ้นแบบ real-time — นี่คือความรู้สึกของการ "เห็น" ระบบครั้งแรก
ขั้นที่ 4: เข้า Grafana
เปิด http://localhost:3001 → login ด้วย admin / admin (จะให้เปลี่ยนรหัส กด skip ได้ตอนเรียน)
Data source Prometheus ถูกตั้งไว้ให้อัตโนมัติแล้ว (ผ่าน provisioning — บทที่ 23) เช็คได้ที่ Connections → Data sources
ขั้นที่ 5: Import dashboard สำเร็จรูป
ไม่ต้องสร้างเองจากศูนย์ — community มี dashboard node_exporter ที่สวยมากอยู่แล้ว:
- เมนูซ้าย → Dashboards → New → Import
- ใส่ Dashboard ID:
1860(Node Exporter Full) → Load - เลือก data source เป็น Prometheus → Import
คุณจะได้ dashboard เต็มรูปแบบของเครื่องตัวเองทันที — CPU, RAM, disk, network, ครบตาม USE method
Dashboard ID
1860ดึงมาจาก grafana.com/dashboards ซึ่งเป็นคลัง dashboard ที่คนแชร์กัน — ของดีมีคนทำไว้เยอะ ไม่ต้อง reinvent
ขั้นที่ 6: สร้าง panel เองสัก 1 อัน
ลองสร้างเองเพื่อเข้าใจ flow (Data source → Query → Visualization จากบทที่ 23):
- Dashboards → New → New dashboard → Add visualization → เลือก Prometheus
- ในช่อง query ใส่:
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100) - ตั้ง Title = "CPU Busy %", panel unit = Percent (0-100) (ในแท็บ Standard options)
- เพิ่ม Threshold สีแดงที่ 80 (Field → Thresholds)
- Save
ตอนนี้คุณมี panel ที่เตือนด้วยสีเมื่อ CPU เกิน 80% แล้ว 🎉
ขั้นที่ 7: ทดลองทำให้ target ตาย
เพื่อเข้าใจพลังของ pull model ลองปิด node_exporter:
docker compose stop node-exporter
กลับไปดู up ใน Prometheus — จะเห็น node กลายเป็น 0 ทันที ภายใน 15 วินาที (scrape ถัดไป) นี่คือข้อดีของ pull ที่เรียนในบทที่ 20: scrape ไม่ได้ = รู้ว่าตายทันที
เปิดกลับ:
docker compose start node-exporter
ทำความสะอาด
docker compose down # หยุด + ลบ container
docker compose down -v # + ลบ volume ข้อมูลด้วย (เริ่มใหม่หมด)
✅ Checklist สิ่งที่ได้เรียนรู้
- รัน Prometheus + node_exporter + cAdvisor + Grafana ด้วย compose
- ยืนยัน target UP ที่ Status → Targets
- เขียน PromQL คำนวณ CPU/RAM/disk เอง
- เชื่อม Grafana กับ Prometheus (ผ่าน provisioning)
- import dashboard 1860 + สร้าง panel เอง
- เห็น target down ทันทีเมื่อปิด exporter (pull model)
สรุป
คุณเพิ่งตั้ง metrics pillar ครบชุดที่ repo ยังไม่มี! ตอนนี้ได้เห็นทั้ง infra layer (node_exporter) และ container layer (cAdvisor) จากบทที่ 02 เป็นข้อมูลจริง
Lab หน้าจะยกระดับ: instrument แอป Node.js เอง ให้พ่น RED metrics แล้วตั้ง Alertmanager ให้เด้งเตือน