📡 Obs · Zero→Hero
หน้าแรก/📈 2 · Metrics/Lab: Prometheus + Grafana + node_exporter
🧪 LAB⏱ ~30 นาที

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 ที่สวยมากอยู่แล้ว:

  1. เมนูซ้าย → Dashboards → New → Import
  2. ใส่ Dashboard ID: 1860 (Node Exporter Full) → Load
  3. เลือก 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):

  1. Dashboards → New → New dashboard → Add visualization → เลือก Prometheus
  2. ในช่อง query ใส่:
    100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100)
    
  3. ตั้ง Title = "CPU Busy %", panel unit = Percent (0-100) (ในแท็บ Standard options)
  4. เพิ่ม Threshold สีแดงที่ 80 (Field → Thresholds)
  5. 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 ให้เด้งเตือน