Prometheus + Grafana: สถาปัตยกรรม Monitoring Stack สำหรับ Production

Prometheus กับ Grafana เป็นคู่หูที่ใช้กันแพร่หลายในการทำระบบ Monitoring ระดับ Production โดยระบบเก็บ Metrics ทำหน้าที่เก็บ Metrics จากระบบต่าง ๆ ส่วน Grafana ทำหน้าที่นำข้อมูลมาแสดงผลผ่าน Dashboard ที่สวยงามและตอบสนองรวดเร็ว การออกแบบสถาปัตยกรรมของสองเครื่องมือนี้ให้เหมาะสมกับปริมาณงานและความต้องการขององค์กรมีความสำคัญอย่างยิ่ง

บทความนี้จะอธิบายองค์ประกอบหลักของสถาปัตยกรรม Monitoring Stack วิธีการเชื่อมต่อส่วนประกอบต่าง ๆ การวางแผนด้านความพร้อมใช้งานสูง การจัดเก็บข้อมูลระยะยาว และแนวทางที่แนะนำสำหรับการใช้งานจริงใน Production

องค์ประกอบหลักของ Monitoring Stack

Monitoring Stack ที่สมบูรณ์ประกอบด้วยหลายส่วนที่ทำงานร่วมกัน แต่ละส่วนมีหน้าที่เฉพาะและสามารถปรับขยายได้ตามปริมาณงาน

  • Prometheus Server — หัวใจของระบบที่ดึง Metrics จาก Target และเก็บไว้ใน Time Series Database
  • Exporters — โปรแกรมขนาดเล็กที่แปลง Metrics จากแหล่งต่าง ๆ ให้อยู่ในรูปแบบที่ Prometheus เข้าใจ
  • Alertmanager — จัดการการแจ้งเตือนจาก Prometheus ส่งต่อไปยังช่องทางต่าง ๆ
  • Pushgateway — รองรับ Metrics จาก Job ที่รันระยะสั้นหรือ Batch Job
  • Grafana — แสดง Dashboard และตั้งค่า Alert ขั้นสูง
  • Service Discovery — ค้นหา Target โดยอัตโนมัติจาก Kubernetes, Consul, EC2

การไหลของข้อมูลในระบบ

ข้อมูลใน Monitoring Stack ไหลตามรูปแบบที่ออกแบบไว้อย่างชัดเจน เริ่มจาก Application หรือระบบที่ถูกตรวจสอบ ไปจบที่ผู้ใช้งานที่ดู Dashboard หรือได้รับ Alert

ขั้นตอนการไหลของข้อมูล

  1. Application เปิด Endpoint /metrics เพื่อให้ Prometheus ดึงข้อมูล
  2. Server ทำ Scrape ข้อมูลตามช่วงเวลาที่กำหนด (เช่น ทุก 15 วินาที)
  3. ข้อมูลถูกเก็บใน Time Series Database ภายใน Prometheus
  4. Grafana เชื่อมต่อกับ Prometheus เป็น Data Source
  5. ผู้ใช้สร้าง Dashboard หรือ Alert Rule ใน Grafana
  6. Alertmanager ส่งการแจ้งเตือนไปยัง Email, Slack, PagerDuty

สถาปัตยกรรมแบบ Single Node

สำหรับระบบขนาดเล็กถึงกลางที่มี Target ไม่เกิน 100-200 เครื่อง การใช้งานบนเซิร์ฟเวอร์เดียวเป็นทางเลือกที่เรียบง่ายและคุ้มค่า เหมาะสำหรับการเริ่มต้นหรือระบบภายในองค์กรที่ไม่ต้องการความพร้อมใช้งานสูงมาก

# docker-compose.yml สำหรับ Single Node Setup
version: '3.8'

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=15d'
      - '--web.enable-lifecycle'
    restart: unless-stopped

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=StrongPassword123
    restart: unless-stopped

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
    restart: unless-stopped

volumes:
  prometheus_data:
  grafana_data:

สถาปัตยกรรมแบบ High Availability

ในระบบ Production ที่ต้องการความพร้อมใช้งานสูง การใช้งานเพียงเครื่องเดียวอาจเสี่ยงต่อการสูญเสียข้อมูลและ Downtime การออกแบบแบบ HA จึงแนะนำให้รัน Instance อย่างน้อย 2 เครื่องคู่ขนานกัน ทำ Scrape เป้าหมายเดียวกัน เพื่อให้ข้อมูลซ้ำและทนต่อการล้มเหลว

องค์ประกอบสำหรับ HA

  • Prometheus HA Pair — 2 Instance รัน Scrape เป้าหมายเดียวกัน
  • Thanos หรือ Cortex — รวมข้อมูลจากหลาย Server และจัดเก็บระยะยาว
  • Load Balancer — กระจายโหลดและทำ Failover อัตโนมัติ
  • Alertmanager Cluster — รัน Alertmanager 3 Instance เพื่อ Deduplicate Alert
  • Grafana HA — ใช้ Database External (MySQL/PostgreSQL) ร่วมกับ Load Balancer

การเก็บข้อมูลระยะยาว (Long-term Storage)

ระบบถูกออกแบบมาให้เก็บข้อมูลแบบ Local Storage ซึ่งเหมาะกับการใช้งานระยะสั้น (15-90 วัน) แต่ในองค์กรที่ต้องการดูข้อมูลย้อนหลังเป็นปีหรือต้องปฏิบัติตามข้อกำหนดด้านการเก็บข้อมูล จำเป็นต้องใช้ Remote Storage

ตัวเลือก Long-term Storage

  • Thanos — ใช้ Object Storage (S3, GCS) เก็บข้อมูลระยะยาว รองรับ Query ข้ามหลาย Instance
  • Cortex / Mimir — Multi-tenant as a Service จาก Grafana Labs
  • VictoriaMetrics — Drop-in Replacement ที่ใช้ Storage น้อยกว่าและเร็วกว่า
  • InfluxDB — Time Series Database ที่รองรับ Prometheus Remote Write
  • TimescaleDB — PostgreSQL Extension สำหรับ Time Series

การตั้งค่าไฟล์ Configuration เบื้องต้น

ไฟล์ prometheus.yml คือหัวใจของการกำหนดค่าระบบ กำหนด Target ที่ต้อง Scrape ช่วงเวลา และกฎการแจ้งเตือน

# prometheus.yml — ตัวอย่างสำหรับ Production
global:
  scrape_interval: 15s
  evaluation_interval: 15s
  external_labels:
    cluster: 'production'
    region: 'ap-southeast-1'

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - 'alertmanager:9093'

# Alert rules
rule_files:
  - "/etc/prometheus/rules/*.yml"

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

  - job_name: 'node-exporter'
    static_configs:
      - targets:
          - 'node1:9100'
          - 'node2:9100'
          - 'node3:9100'

  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true

# Remote write สำหรับ Long-term Storage
remote_write:
  - url: "https://thanos-receive:10908/api/v1/receive"

การเลือกขนาดของเซิร์ฟเวอร์

ขนาดของเซิร์ฟเวอร์ที่เหมาะสมขึ้นอยู่กับปริมาณ Metrics, จำนวน Target, และระยะเวลาการเก็บข้อมูล ตารางด้านล่างเป็นแนวทางสำหรับการเลือกขนาดเบื้องต้น

ขนาดระบบTargetMetrics/sCPURAMDisk
เล็ก< 100< 10K2 Core4 GB50 GB SSD
กลาง100-50010K-50K4 Core16 GB200 GB SSD
ใหญ่500-200050K-200K8 Core32 GB500 GB SSD
ใหญ่มาก> 2000> 200K16+ Core64+ GB1+ TB NVMe

แนวทางการออกแบบที่ดี

การวางระบบ Monitoring ให้ทำงานได้ดีในระยะยาวต้องคำนึงถึงหลายปัจจัย ไม่ใช่แค่การติดตั้งเครื่องมือแล้วเปิดใช้งาน แต่ต้องวางแผนการขยาย การดูแลรักษา และการใช้งานจริง

  • แยก Instance สำหรับแต่ละ Environment (Dev, Staging, Production)
  • ใช้ Service Discovery แทน Static Config เพื่อรองรับการเปลี่ยนแปลง
  • วางแผน Data Retention ตั้งแต่เริ่มต้น ป้องกัน Disk เต็ม
  • ตั้ง Recording Rules สำหรับ Query ที่ใช้บ่อยเพื่อลดภาระ
  • ใช้ Label อย่างสม่ำเสมอ หลีกเลี่ยง Label ที่มีค่าหลากหลาย (High Cardinality)
  • Monitor ตัวระบบเอง (Meta-Monitoring)

ข้อควรระวังเมื่อใช้งานใน Production

  • Cardinality Explosion — การใส่ Label ที่มีค่าเยอะ (เช่น User ID) จะทำให้ Memory เต็ม
  • Scrape Timeout — ตั้ง scrape_timeout ให้น้อยกว่า scrape_interval เสมอ
  • Disk Space — ตรวจสอบพื้นที่ Disk ต่อเนื่องและตั้ง Alert
  • Alert Fatigue — อย่าตั้ง Alert มากเกินไป จะทำให้ทีมเพิกเฉย
  • Time Drift — เซิร์ฟเวอร์ทุกเครื่องต้อง Sync NTP ตรงกัน

สรุป

การออกแบบสถาปัตยกรรม Monitoring Stack ด้วย Prometheus และ Grafana ต้องเริ่มจากการเข้าใจองค์ประกอบหลักของระบบ การไหลของข้อมูล และความต้องการขององค์กร สำหรับระบบเล็กสามารถเริ่มจาก Single Node ได้ แต่เมื่อระบบเติบโตควรวางแผนสู่ HA และ Long-term Storage ตั้งแต่เนิ่น ๆ

การเลือกขนาดเซิร์ฟเวอร์ที่เหมาะสม การตั้งค่า prometheus.yml ที่ยืดหยุ่น และการปฏิบัติตามแนวทางที่ดีจะช่วยให้ระบบ Monitoring ทำงานได้อย่างเสถียร รองรับการเติบโต และเป็นรากฐานสำคัญของการดูแลระบบ Production ที่มีคุณภาพ