← กลับหน้าหลัก

Prometheus + Grafana Monitor ระบบ Server

โดย อ.บอม (SiamCafe Admin) | 13/02/2026 | Server | 2,391 คำ
Prometheus + Grafana Monitor ระบบ Server

บทนำ: เจาะลึกโลกแห่งการมอนิเตอร์ระบบ Server ด้วย Prometheus และ Grafana

ในยุคดิจิทัลที่ทุกอย่างขับเคลื่อนด้วยข้อมูล ระบบ Server เปรียบเสมือนหัวใจสำคัญที่คอยหล่อเลี้ยงให้ธุรกิจดำเนินไปได้อย่างราบรื่น แต่จะเกิดอะไรขึ้นหากหัวใจดวงนี้เกิดอาการผิดปกติ? การมอนิเตอร์ระบบ Server อย่างมีประสิทธิภาพจึงไม่ใช่แค่เรื่อง "ควรทำ" แต่เป็น "ต้องทำ" เพื่อให้เราสามารถตรวจจับปัญหาได้ตั้งแต่เนิ่นๆ ก่อนที่จะลุกลามจนส่งผลกระทบต่อผู้ใช้งานและธุรกิจโดยรวม

ลองจินตนาการถึงสถานการณ์ที่เว็บไซต์อีคอมเมิร์ซชื่อดังกำลังประสบปัญหา Server ล่มในช่วงเวลาที่มียอดขายสูงสุด นั่นหมายถึงการสูญเสียรายได้มหาศาล โอกาสทางธุรกิจที่หลุดลอยไป และความน่าเชื่อถือที่ลดลงในสายตาของลูกค้า เหตุการณ์เหล่านี้สามารถป้องกันได้หากมีการติดตั้งระบบมอนิเตอร์ที่แข็งแกร่ง ซึ่งจะช่วยให้ทีมงานสามารถระบุสาเหตุของปัญหาและแก้ไขได้อย่างทันท่วงที

Prometheus และ Grafana คือสองเครื่องมือ Open Source ที่ได้รับความนิยมอย่างแพร่หลายในวงการ DevOps และ SRE (Site Reliability Engineering) ด้วยความสามารถในการเก็บรวบรวม วิเคราะห์ และแสดงผลข้อมูล (metrics) ที่เกี่ยวข้องกับระบบ Server ทำให้ทีมงานสามารถมองเห็นภาพรวมของระบบได้อย่างชัดเจนและสามารถตัดสินใจได้อย่างแม่นยำ

จากสถิติพบว่า องค์กรที่นำ Prometheus และ Grafana ไปใช้งาน สามารถลดระยะเวลาในการแก้ไขปัญหา (Mean Time to Resolution หรือ MTTR) ได้ถึง 50% และเพิ่มความพร้อมใช้งานของระบบ (Uptime) ได้อย่างมีนัยสำคัญ นอกจากนี้ ยังช่วยให้ทีมงานสามารถวางแผนการขยายระบบ (Scaling) ได้อย่างเหมาะสม โดยอิงจากข้อมูลจริงที่ได้จากการมอนิเตอร์

ผมเองเคยมีประสบการณ์ตรงในการเซ็ตอัพระบบมอนิเตอร์ด้วย Prometheus และ Grafana ให้กับบริษัท Startup แห่งหนึ่ง ตอนแรกก็เจอปัญหาจุกจิกพอสมควร ทั้งเรื่องการ Config ไฟล์ การตั้งค่า Alert แต่พอทำไปเรื่อยๆ เริ่มเข้าใจหลักการทำงานของมัน ก็รู้สึกว่ามันเป็นเครื่องมือที่ทรงพลังมากจริงๆ ช่วยให้ทีมงานของเราทำงานได้ง่ายขึ้นเยอะเลย

พื้นฐานความรู้ที่ควรรู้ก่อนเริ่มใช้งาน Prometheus และ Grafana

Metrics คืออะไร? ทำไมถึงสำคัญ?

Metrics คือ ข้อมูลเชิงปริมาณที่ใช้วัดประสิทธิภาพและสถานะของระบบ Server หรือ Application ต่างๆ ตัวอย่างของ Metrics ที่สำคัญ เช่น CPU Utilization, Memory Usage, Disk I/O, Network Traffic, Response Time และ Error Rate Metrics เหล่านี้เป็นเหมือนสัญญาณชีพที่บ่งบอกถึงสุขภาพโดยรวมของระบบ

ความสำคัญของ Metrics อยู่ที่การช่วยให้เราสามารถเข้าใจพฤติกรรมของระบบได้อย่างลึกซึ้ง สามารถระบุจุดที่เป็นคอขวด (Bottleneck) และตรวจจับปัญหาที่อาจเกิดขึ้นได้ในอนาคต ลองคิดดูว่าถ้าเราไม่รู้ว่า CPU ของ Server กำลังทำงานหนักเกินไป เราก็อาจจะไม่รู้ว่าระบบกำลังจะล่มในอีกไม่ช้า

นอกจากนี้ Metrics ยังเป็นพื้นฐานสำคัญในการสร้าง Alert หรือการแจ้งเตือนอัตโนมัติ เมื่อ Metrics บางตัวมีค่าผิดปกติ เช่น CPU Utilization สูงเกิน 90% ระบบก็จะส่ง Alert ไปยังทีมงาน เพื่อให้เข้าไปตรวจสอบและแก้ไขปัญหาได้ทันท่วงที การมีระบบ Alert ที่ดี จะช่วยลดระยะเวลาในการแก้ไขปัญหาและป้องกันไม่ให้ปัญหาลุกลาม

การเลือก Metrics ที่เหมาะสมในการมอนิเตอร์ เป็นสิ่งสำคัญอย่างยิ่ง เราควรเลือก Metrics ที่มีความเกี่ยวข้องกับธุรกิจและความต้องการของเรา ตัวอย่างเช่น หากเราให้บริการเว็บไซต์อีคอมเมิร์ซ เราอาจจะให้ความสำคัญกับ Metrics ที่เกี่ยวข้องกับ Response Time และ Error Rate มากเป็นพิเศษ

Metrics สามารถแบ่งออกได้เป็นหลายประเภท เช่น Counter (ตัวนับ), Gauge (ค่าที่เปลี่ยนแปลงได้), Histogram (การกระจายตัวของข้อมูล) และ Summary (ค่าสรุป) การเข้าใจประเภทของ Metrics จะช่วยให้เราสามารถเลือก Metrics ที่เหมาะสมและวิเคราะห์ข้อมูลได้อย่างถูกต้อง

Prometheus ทำงานอย่างไร?

Prometheus เป็นระบบ Monitoring ที่เน้นการเก็บรวบรวม Metrics ในรูปแบบ Time Series Data นั่นหมายถึง Metrics จะถูกเก็บพร้อมกับ Timestamp หรือเวลาที่ทำการวัดค่า ทำให้เราสามารถดูแนวโน้มของ Metrics ในช่วงเวลาต่างๆ ได้

หลักการทำงานของ Prometheus คือ การดึงข้อมูล (Pull) จาก Targets ต่างๆ ที่เราต้องการมอนิเตอร์ Targets เหล่านี้อาจจะเป็น Server, Application หรือ Service อื่นๆ Prometheus จะส่ง HTTP Request ไปยัง Targets เพื่อขอ Metrics และ Targets จะตอบกลับด้วย Metrics ในรูปแบบ Text-based format ที่เรียกว่า Exposition Format

Prometheus จะทำการจัดเก็บ Metrics ที่ได้รับใน Time Series Database ของตัวเอง ทำให้เราสามารถ Query หรือดึงข้อมูล Metrics ออกมาวิเคราะห์ได้ โดยใช้ภาษา Query ที่เรียกว่า PromQL (Prometheus Query Language) PromQL เป็นภาษา Query ที่ทรงพลัง ช่วยให้เราสามารถ Filter, Aggregate และ Transform Metrics ได้อย่างยืดหยุ่น

นอกจากนี้ Prometheus ยังมี Alertmanager ที่ทำหน้าที่ในการจัดการ Alert เมื่อ Metrics บางตัวมีค่าผิดปกติ Alertmanager จะทำการ De-duplicate, Group และ Route Alert ไปยังช่องทางต่างๆ เช่น Email, Slack หรือ PagerDuty

Prometheus ถูกออกแบบมาให้มีความ Scalable และ Reliable สามารถรองรับการมอนิเตอร์ระบบที่มีขนาดใหญ่และซับซ้อนได้ นอกจากนี้ ยังมี Community ที่แข็งแกร่ง ทำให้เราสามารถค้นหาข้อมูลและความช่วยเหลือได้ง่าย

Grafana ช่วยอะไรในการแสดงผลข้อมูล?

Grafana เป็นเครื่องมือ Visualization ที่ช่วยให้เราสามารถสร้าง Dashboard ที่สวยงามและเข้าใจง่าย เพื่อแสดงผล Metrics ที่เก็บรวบรวมโดย Prometheus หรือ Data Source อื่นๆ Grafana รองรับ Data Source หลากหลายประเภท เช่น Prometheus, Graphite, InfluxDB, Elasticsearch และ MySQL

Grafana มี Panel Types ให้เลือกมากมาย เช่น Graph, Gauge, Table, Text และ Heatmap เราสามารถเลือก Panel Type ที่เหมาะสมกับ Metrics ที่เราต้องการแสดงผล เพื่อให้ Dashboard ของเรามีความน่าสนใจและสื่อความหมายได้ดี

Grafana มี Template Variables ที่ช่วยให้เราสามารถสร้าง Dashboard ที่มีความยืดหยุ่นสูง ตัวอย่างเช่น เราสามารถสร้าง Variable ที่ใช้เลือก Server ที่เราต้องการดู Metrics ได้ ทำให้เราไม่ต้องสร้าง Dashboard แยกกันสำหรับแต่ละ Server

Grafana มี Alerting System ในตัว ที่ช่วยให้เราสามารถสร้าง Alert จาก Dashboard ได้ เมื่อ Metrics บางตัวมีค่าผิดปกติ Grafana จะส่ง Alert ไปยังช่องทางต่างๆ เช่น Email, Slack หรือ PagerDuty

Grafana มี Community ที่แข็งแกร่ง ทำให้เราสามารถค้นหา Dashboard Templates ที่มีคนสร้างไว้แล้วได้ นอกจากนี้ เรายังสามารถสร้าง Dashboard ของเราเองและแชร์ให้กับคนอื่นๆ ได้อีกด้วย

🎬 YouTube @icafefx

วิธีติดตั้งและใช้งาน Prometheus และ Grafana อย่างง่าย

การติดตั้ง Prometheus และ Grafana สามารถทำได้หลายวิธี ขึ้นอยู่กับระบบปฏิบัติการและ Infrastructure ที่เราใช้งาน ในตัวอย่างนี้ เราจะแสดงวิธีการติดตั้งบน Ubuntu Server โดยใช้ Docker ซึ่งเป็นวิธีที่ง่ายและสะดวก

ขั้นตอน คำอธิบาย
1. ติดตั้ง Docker และ Docker Compose ติดตั้ง Docker Engine และ Docker Compose บน Ubuntu Server
2. สร้าง Docker Compose file สร้างไฟล์ docker-compose.yml เพื่อกำหนด Container สำหรับ Prometheus และ Grafana
3. รัน Docker Compose รันคำสั่ง docker-compose up -d เพื่อสร้างและรัน Container
4. เข้าถึง Prometheus และ Grafana เข้าถึง Prometheus ผ่าน Browser ที่ http://localhost:9090 และ Grafana ที่ http://localhost:3000
5. Config Data Source ใน Grafana เพิ่ม Prometheus เป็น Data Source ใน Grafana เพื่อให้สามารถ Query Metrics ได้

ขั้นตอนที่ 1: ติดตั้ง Docker และ Docker Compose

ก่อนอื่น เราต้องทำการติดตั้ง Docker Engine และ Docker Compose บน Ubuntu Server ของเราก่อน สามารถทำได้โดยใช้คำสั่งต่อไปนี้:

sudo apt update
sudo apt install docker.io
sudo apt install docker-compose

หลังจากติดตั้งเสร็จแล้ว ให้ตรวจสอบว่า Docker ทำงานได้ถูกต้อง โดยใช้คำสั่ง docker version และ docker-compose version

ขั้นตอนที่ 2: สร้าง Docker Compose file

สร้างไฟล์ docker-compose.yml ใน Directory ที่ต้องการ โดยมีเนื้อหาดังนี้:

version: "3.8"

services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - prometheus_data:/prometheus
    restart: always

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      GF_SECURITY_ADMIN_USER: admin
      GF_SECURITY_ADMIN_PASSWORD: password
    depends_on:
      - prometheus
    restart: always

volumes:
  prometheus_data: {}

ไฟล์นี้จะกำหนด Container สำหรับ Prometheus และ Grafana โดย Prometheus จะถูก Map ไปที่ Port 9090 และ Grafana จะถูก Map ไปที่ Port 3000 นอกจากนี้ ยังมีการกำหนด Volume สำหรับเก็บข้อมูลของ Prometheus และ Environment Variables สำหรับ Grafana

ขั้นตอนที่ 3: รัน Docker Compose

ใน Directory ที่มีไฟล์ docker-compose.yml ให้รันคำสั่งต่อไปนี้:

docker-compose up -d

คำสั่งนี้จะสร้างและรัน Container สำหรับ Prometheus และ Grafana ใน Background

ขั้นตอนที่ 4: เข้าถึง Prometheus และ Grafana

หลังจากรัน Docker Compose เสร็จแล้ว ให้เปิด Browser และเข้าถึง Prometheus ผ่าน URL http://localhost:9090 และ Grafana ผ่าน URL http://localhost:3000 (หากรันบน Server อื่น ให้เปลี่ยน localhost เป็น IP Address ของ Server)

สำหรับ Grafana ให้ใช้ Username admin และ Password password ที่เรากำหนดไว้ในไฟล์ docker-compose.yml

ขั้นตอนที่ 5: Config Data Source ใน Grafana

เมื่อเข้าสู่ Grafana แล้ว ให้ไปที่ Configuration -> Data Sources -> Add data source เลือก Prometheus และใส่ URL ของ Prometheus (http://prometheus:9090) จากนั้นกด Save & Test

หลังจาก Config Data Source เสร็จแล้ว เราก็สามารถสร้าง Dashboard เพื่อแสดงผล Metrics ที่เก็บรวบรวมโดย Prometheus ได้

"การมอนิเตอร์ระบบ Server ไม่ใช่แค่เรื่องของเครื่องมือ แต่เป็นเรื่องของกระบวนการและความเข้าใจในระบบที่เราต้องการมอนิเตอร์ เราต้องเลือก Metrics ที่เหมาะสม สร้าง Alert ที่มีประสิทธิภาพ และวิเคราะห์ข้อมูลอย่างสม่ำเสมอ เพื่อให้ระบบของเราทำงานได้อย่างราบรื่นและมีประสิทธิภาพสูงสุด"

เทคนิคขั้นสูง / Configuration

การใช้งาน Prometheus และ Grafana ให้มีประสิทธิภาพสูงสุดนั้น ไม่ได้จบแค่การติดตั้งและตั้งค่าพื้นฐานเท่านั้นครับ การปรับแต่งค่าคอนฟิกูเรชัน (configuration) ในเชิงลึก และการใช้เทคนิคขั้นสูง จะช่วยให้เราสามารถดึงข้อมูลเชิงลึกออกมาได้อย่างแม่นยำ และตอบโจทย์ความต้องการในการมอนิเตอร์ระบบที่ซับซ้อนได้มากยิ่งขึ้น ผมจะพาไปดูเทคนิคและคอนฟิกูเรชันที่น่าสนใจกันครับ

การตั้งค่า Alerting Rules ที่ซับซ้อน

การแจ้งเตือน (alerting) เป็นหัวใจสำคัญของการมอนิเตอร์ระบบครับ เพราะมันช่วยให้เราทราบถึงปัญหาที่เกิดขึ้นได้ทันท่วงที ก่อนที่มันจะส่งผลกระทบต่อผู้ใช้งาน แต่การตั้งค่าแจ้งเตือนแบบง่ายๆ อาจไม่เพียงพอต่อการตรวจจับปัญหาที่ซับซ้อนได้ เราจึงต้องใช้ Alerting Rules ที่ซับซ้อนมากขึ้นครับ ตัวอย่างเช่น การตั้งค่าแจ้งเตือนเมื่อ CPU usage เกิน 80% เป็นเวลา 5 นาที และมี network latency สูงกว่า 200ms พร้อมกัน เราสามารถทำได้โดยการใช้ PromQL (Prometheus Query Language) ในการเขียน Alerting Rules ดังนี้ครับ
groups:
- name: ExampleAlerts
  rules:
  - alert: HighCpuAndNetworkLatency
    expr: sum(rate(process_cpu_seconds_total[5m])) by (instance) > 0.8 and avg(probe_duration_seconds) > 0.2
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "High CPU and Network Latency detected on {{ $labels.instance }}"
      description: "CPU usage is above 80% and network latency is above 200ms on {{ $labels.instance }}"
จากโค้ดด้านบน เราได้กำหนด Alerting Rule ที่ชื่อว่า `HighCpuAndNetworkLatency` ซึ่งจะทำงานเมื่อเงื่อนไข `expr` เป็นจริง โดยเงื่อนไขนี้จะตรวจสอบว่า CPU usage เฉลี่ยในช่วง 5 นาทีที่ผ่านมา เกิน 80% หรือไม่ และ network latency เฉลี่ยสูงกว่า 200ms หรือไม่ หากเงื่อนไขนี้เป็นจริงต่อเนื่องเป็นเวลา 5 นาที (`for: 5m`) ระบบก็จะส่งการแจ้งเตือนออกมา โดยมีการกำหนด `severity` เป็น `critical` และมีรายละเอียดของปัญหาใน `annotations`

การใช้ Service Discovery เพื่อจัดการ Target แบบ Dynamic

ในสภาพแวดล้อมที่มีการเปลี่ยนแปลงอยู่เสมอ เช่น การใช้ Kubernetes หรือ Docker Swarm การจัดการ Target ของ Prometheus แบบ static นั้นเป็นเรื่องที่ยุ่งยากมากครับ เพราะเราต้องคอยแก้ไขไฟล์คอนฟิกูเรชันอยู่เสมอเมื่อมี instance ใหม่เพิ่มขึ้น หรือ instance เก่าถูกลบออกไป โชคดีที่ Prometheus มีฟีเจอร์ Service Discovery ที่ช่วยให้เราสามารถจัดการ Target แบบ dynamic ได้อย่างง่ายดาย ตัวอย่างเช่น หากเราใช้ Kubernetes เราสามารถใช้ `kubernetes_sd_config` ในไฟล์ `prometheus.yml` เพื่อให้ Prometheus ค้นหา Target จาก Kubernetes API Server ได้โดยอัตโนมัติ ดังนี้ครับ
scrape_configs:
  - job_name: 'kubernetes-nodes'
    kubernetes_sd_configs:
    - role: node
    relabel_configs:
    - source_labels: [__address__]
      separator: ;
      regex: ^(.*)$
      replacement: kubernetes.default.svc.cluster.local:443
      target_label: __address__
    - source_labels: []
      separator: ;
      regex: ^$
      replacement: /metrics
      target_label: __metrics_path__
    scheme: https
    tls_config:
      ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
    bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
จากคอนฟิกูเรชันด้านบน Prometheus จะค้นหา Node ทั้งหมดใน Kubernetes Cluster และดึงข้อมูล metrics จาก `/metrics` endpoint โดยอัตโนมัติ โดยที่เราไม่ต้องมากำหนด IP address หรือ hostname เองเลยครับ

การปรับแต่ง Grafana Dashboards ให้เหมาะสมกับ Use Case

Grafana Dashboards เป็นเครื่องมือที่ทรงพลังในการแสดงผลข้อมูล metrics ที่ Prometheus รวบรวมมา แต่การใช้ Dashboards สำเร็จรูป อาจไม่ตอบโจทย์ความต้องการของเราได้ทั้งหมด เราจึงต้องปรับแต่ง Dashboards ให้เหมาะสมกับ Use Case ของเราครับ ตัวอย่างเช่น หากเราต้องการมอนิเตอร์ประสิทธิภาพของ Web Application เราอาจสร้าง Dashboard ที่แสดงผลข้อมูล request per second, response time, error rate, และ CPU/Memory usage ของ Web Server แต่ละตัว โดยเราสามารถใช้ Grafana Query Editor ในการเขียน PromQL queries เพื่อดึงข้อมูลที่ต้องการมาแสดงผลได้ตามใจชอบเลยครับ นอกจากนี้ เรายังสามารถใช้ Grafana Variables เพื่อสร้าง Dashboards ที่มีความยืดหยุ่นสูงได้อีกด้วย ตัวอย่างเช่น เราอาจสร้าง Variable ที่ชื่อว่า `instance` ซึ่งมีค่าเป็นชื่อของ Web Server แต่ละตัว แล้วใช้ Variable นี้ใน PromQL queries เพื่อให้ผู้ใช้สามารถเลือกดูข้อมูลของ Web Server ที่ต้องการได้

เปรียบเทียบ

ในตลาดของเครื่องมือ Monitoring นั้น มีตัวเลือกมากมายให้เราได้เลือกใช้ ซึ่งแต่ละตัวก็มีจุดเด่นและจุดด้อยที่แตกต่างกันไป การเปรียบเทียบเครื่องมือต่างๆ จะช่วยให้เราตัดสินใจได้ว่าเครื่องมือตัวไหนเหมาะสมกับความต้องการของเรามากที่สุด ในส่วนนี้ ผมจะเปรียบเทียบ Prometheus และ Grafana กับเครื่องมือ Monitoring ยอดนิยมอื่นๆ เพื่อให้เห็นภาพชัดเจนยิ่งขึ้นครับ

Prometheus vs. Alternatives

| Feature | Prometheus | Graphite | InfluxDB | |---|---|---|---| | Data Model | Time Series | Time Series | Time Series | | Query Language | PromQL | Graphite Functions | InfluxQL | | Data Storage | Local Storage, Remote Storage | Local Storage, Carbon Relay | Local Storage, Remote Storage | | Alerting | Alertmanager | Not Built-in | Kapacitor | | Scalability | Horizontal Scalability | Horizontal Scalability | Clustering | | Use Case | Infrastructure Monitoring, Application Monitoring | Infrastructure Monitoring | IoT, Application Monitoring | | Complexity | Moderate | Moderate | Moderate | | Community | Large and Active | Large and Active | Large and Active | จากตารางเปรียบเทียบ เราจะเห็นได้ว่า Prometheus มีจุดเด่นในเรื่องของ PromQL ที่มีความยืดหยุ่นสูง และ Alertmanager ที่ช่วยให้เราจัดการการแจ้งเตือนได้อย่างมีประสิทธิภาพ นอกจากนี้ Prometheus ยังมีความสามารถในการ Scalability ในแนวนอน ทำให้รองรับ workload ที่มีขนาดใหญ่ได้ดี อย่างไรก็ตาม Prometheus อาจมีความซับซ้อนในการตั้งค่ามากกว่า Graphite หรือ InfluxDB

Grafana vs. Alternatives

| Feature | Grafana | Kibana | Datadog | |---|---|---|---| | Data Sources | Prometheus, Graphite, InfluxDB, Elasticsearch, etc. | Elasticsearch | Datadog Agent | | Visualization | Rich set of visualizations | Limited visualizations | Rich set of visualizations | | Alerting | Built-in | Built-in | Built-in | | Dashboarding | Flexible and customizable | Limited customization | Easy to use | | Collaboration | Team support, sharing dashboards | Team support, sharing dashboards | Team support, sharing dashboards | | Use Case | General-purpose monitoring | Log analysis, security monitoring | Cloud monitoring | | Complexity | Moderate | Moderate | Low | | Pricing | Open Source | Open Source | Paid | จากตารางเปรียบเทียบ Grafana โดดเด่นในเรื่องของการรองรับ Data Sources ที่หลากหลาย และมี visualizations ให้เลือกใช้มากมาย นอกจากนี้ Grafana ยังมีความยืดหยุ่นในการสร้าง Dashboards ทำให้เราสามารถปรับแต่ง Dashboards ให้เหมาะสมกับความต้องการของเราได้อย่างเต็มที่ อย่างไรก็ตาม Grafana อาจมีความซับซ้อนในการตั้งค่ามากกว่า Datadog

ข้อควรระวัง Troubleshooting

การใช้งาน Prometheus และ Grafana นั้น ถึงแม้จะสะดวกและมีประสิทธิภาพ แต่ก็มีข้อควรระวัง และปัญหาที่อาจเกิดขึ้นได้ระหว่างการใช้งาน หากเราไม่ระมัดระวัง หรือไม่มีความรู้ความเข้าใจที่เพียงพอ อาจทำให้ระบบ Monitoring ของเราทำงานไม่ถูกต้อง หรือไม่สามารถใช้งานได้เลย ในส่วนนี้ ผมจะรวบรวมข้อควรระวัง และวิธีการแก้ไขปัญหาที่พบบ่อย เพื่อให้ทุกคนสามารถใช้งาน Prometheus และ Grafana ได้อย่างราบรื่นครับ
"การมอนิเตอร์ระบบ ไม่ใช่แค่การติดตั้งเครื่องมือ แต่เป็นการทำความเข้าใจระบบ และปรับแต่งเครื่องมือให้เหมาะสมกับระบบของเรา"
* **Resource Consumption:** Prometheus อาจใช้ CPU และ Memory ค่อนข้างมาก โดยเฉพาะอย่างยิ่งเมื่อมี Target จำนวนมาก หรือมีการ query ข้อมูลที่ซับซ้อน เราควรตรวจสอบ Resource Consumption ของ Prometheus อย่างสม่ำเสมอ และปรับแต่งค่าคอนฟิกูเรชันให้เหมาะสม * **Data Retention:** Prometheus จะเก็บข้อมูล metrics ไว้ใน Local Storage ตามระยะเวลาที่เรากำหนด หากเราไม่ได้ตั้งค่า Remote Storage ไว้ เมื่อ Local Storage เต็ม ข้อมูลเก่าก็จะถูกลบออกไป เราควรวางแผน Data Retention ให้เหมาะสมกับความต้องการของเรา * **PromQL Complexity:** PromQL เป็นภาษา query ที่มีความยืดหยุ่นสูง แต่ก็มีความซับซ้อนเช่นกัน การเขียน PromQL query ที่ไม่ถูกต้อง อาจทำให้ได้ผลลัพธ์ที่ไม่ถูกต้อง หรือทำให้ Prometheus ทำงานช้าลง เราควรศึกษา PromQL ให้เข้าใจ และทดสอบ query ก่อนนำไปใช้งานจริง * **Alerting Fatigue:** การตั้งค่า Alerting Rules ที่มากเกินไป หรือ Alerting Rules ที่ไม่ถูกต้อง อาจทำให้เกิด Alerting Fatigue ซึ่งทำให้เราละเลย Alert ที่สำคัญจริงๆ เราควรตั้งค่า Alerting Rules อย่างระมัดระวัง และปรับปรุง Alerting Rules อย่างสม่ำเสมอ * **Security:** Prometheus และ Grafana อาจมีช่องโหว่ด้านความปลอดภัย หากเราไม่ได้ตั้งค่าความปลอดภัยอย่างเหมาะสม เราควรตั้งค่า Authentication และ Authorization ให้กับ Prometheus และ Grafana และอัปเดตซอฟต์แวร์ให้เป็นเวอร์ชันล่าสุดอยู่เสมอ

ตัวอย่างจากประสบการณ์ 20 ปี

ตลอด 20 ปีที่ผมคลุกคลีอยู่ในวงการ IT ผมได้มีโอกาสใช้งาน Prometheus และ Grafana ในหลากหลายสถานการณ์ และได้เรียนรู้จากประสบการณ์จริงมากมาย ในส่วนนี้ ผมจะยกตัวอย่างสถานการณ์จริงที่ผมเคยเจอ และวิธีการแก้ไขปัญหา เพื่อเป็นแนวทางให้กับทุกคนครับ ในปี 2020 ผมเคยเจอปัญหา CPU utilization ของ Web Server ขึ้นสูงผิดปกติ โดยที่ไม่มีใครทราบสาเหตุ ผมจึงใช้ Prometheus และ Grafana ในการวิเคราะห์ปัญหา โดยผมได้สร้าง Dashboard ที่แสดงผล CPU utilization ของ Web Server แต่ละตัว และ Top 10 processes ที่ใช้ CPU มากที่สุด จาก Dashboard นี้ ผมพบว่ามี process ที่ชื่อว่า `evil_script.sh` ใช้ CPU มากผิดปกติ เมื่อตรวจสอบเพิ่มเติม ผมพบว่ามี Hacker แอบเข้ามาติดตั้ง malware บน Web Server ของเรา โชคดีที่ผมตรวจพบความผิดปกติได้ทันท่วงที และสามารถแก้ไขปัญหาได้ก่อนที่มันจะส่งผลกระทบต่อผู้ใช้งาน อีกสถานการณ์หนึ่งที่ผมเคยเจอคือ Network latency ระหว่าง Data Center 2 แห่งสูงขึ้นผิดปกติ ผมจึงใช้ Prometheus และ Grafana ในการวิเคราะห์ปัญหา โดยผมได้สร้าง Dashboard ที่แสดงผล Network latency ระหว่าง Data Center แต่ละแห่ง และ packet loss rate จาก Dashboard นี้ ผมพบว่ามี Network congestion เกิดขึ้นบน Link ระหว่าง Data Center ทั้งสอง เมื่อตรวจสอบเพิ่มเติม ผมพบว่ามี traffic ที่ไม่จำเป็นจำนวนมากถูกส่งผ่าน Link นี้ ผมจึงทำการปรับแต่ง Network configuration เพื่อลด traffic ที่ไม่จำเป็น และแก้ไขปัญหา Network congestion ได้สำเร็จ จากประสบการณ์ของผม ผมพบว่า Prometheus และ Grafana เป็นเครื่องมือที่ทรงพลังในการมอนิเตอร์ระบบ แต่การใช้งานให้มีประสิทธิภาพสูงสุดนั้น ต้องอาศัยความรู้ความเข้าใจในระบบ และความสามารถในการวิเคราะห์ข้อมูล ผมหวังว่าบทความนี้จะเป็นประโยชน์กับทุกคน และช่วยให้ทุกคนสามารถใช้งาน Prometheus และ Grafana ได้อย่างราบรื่นครับ

เครื่องมือแนะนำ

Node Exporter: เพื่อนซี้ของ Prometheus

Node Exporter ถือเป็นพระเอกอีกตัวที่ขาดไม่ได้เลยครับในการมอนิเตอร์ระบบ Linux/Unix ด้วย Prometheus หน้าที่หลักของมันคือการเก็บ metrics ต่างๆ ของเครื่องที่เราสนใจ ไม่ว่าจะเป็น CPU usage, memory utilization, disk I/O, network statistics และอื่นๆ อีกมากมาย แล้ว expose metrics เหล่านี้ในรูปแบบที่ Prometheus สามารถดึงไปใช้ได้ การติดตั้ง Node Exporter ก็ง่ายมากๆ ครับ ดาวน์โหลด binary file มา extract แล้วรันได้เลย สมมติว่าเราดาวน์โหลดมาไว้ที่ `/opt/node_exporter`:
cd /opt/node_exporter
./node_exporter
โดย default มันจะรันอยู่ที่ port 9100 เราสามารถเข้าไปดู metrics ดิบๆ ได้ที่ `http://your_server_ip:9100/metrics` ลองเข้าไปส่องดูครับ จะเห็นข้อมูลเพียบเลย! จากนั้นก็แค่ config Prometheus ให้ไป scrape metrics จาก Node Exporter ตัวนี้ แค่นี้เราก็จะได้ข้อมูลระบบมาแสดงผลบน Grafana แล้วครับ

cAdvisor: ส่อง Container อย่างละเอียด

ถ้าเราใช้ Docker หรือ containerization technology อื่นๆ cAdvisor คือเครื่องมือที่ต้องมีติดไว้เลยครับ มันจะช่วยให้เราเห็นภาพรวมการทำงานของ container แต่ละตัวได้อย่างละเอียด ไม่ว่าจะเป็น CPU, memory, network I/O, disk I/O ของแต่ละ container cAdvisor ใช้งานง่ายมากครับ ส่วนใหญ่เราจะรันมันเป็น Docker container ตัวหนึ่งเลย Command ประมาณนี้:
docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  gcr.io/google-containers/cadvisor:latest
พอรันแล้ว เราสามารถเข้าไปดู dashboard ของ cAdvisor ได้ที่ `http://your_server_ip:8080` เราจะเห็น container ทั้งหมดที่รันอยู่บนเครื่อง และ metrics ต่างๆ ของแต่ละ container อย่างละเอียดเลยครับ จากนั้นก็ config Prometheus ให้ไป scrape metrics จาก cAdvisor อีกที

Alertmanager: ส่งเสียงเตือนเมื่อมีปัญหา

Prometheus เก่งเรื่องการเก็บ metrics และ query ข้อมูล แต่เรื่องการแจ้งเตือน (alerting) ต้องยกให้ Alertmanager ครับ มันจะทำหน้าที่รับ alert จาก Prometheus แล้วจัดการส่ง notification ไปยังช่องทางต่างๆ ที่เรา config ไว้ เช่น อีเมล, Slack, PagerDuty หรือ webhook อื่นๆ Alertmanager มีความสามารถในการ grouping alerts, silencing alerts (ปิดเสียงชั่วคราว), และ inhibition (ยับยั้งการแจ้งเตือนซ้ำซ้อน) ทำให้เราจัดการ alert ได้อย่างมีประสิทธิภาพมากขึ้น ตัวอย่าง config file ของ Alertmanager (alertmanager.yml):
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 12h
  receiver: 'web.hook'

receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://your_webhook_url'
ตรงนี้เรา config ให้ Alertmanager ส่ง alert ไปที่ webhook ที่เรากำหนดไว้ เราก็ไปเขียน script รับ webhook แล้วจัดการส่ง notification ไปยังช่องทางต่างๆ ได้ตามใจเลยครับ

Case Study ประสบการณ์จริง

สมัยที่ผมดูแลระบบ e-commerce แห่งหนึ่งเมื่อปี 2020 (นานมากละ) เราเจอปัญหา performance เป็นระยะๆ แต่จับต้นชนปลายไม่ถูก บางทีลูกค้าบ่นว่าเว็บช้า แต่พอเข้าไปดูตอนนั้นก็ปกติแล้ว ทำให้หาสาเหตุยากมาก หลังจากนั้นผมเลยตัดสินใจ implement Prometheus + Grafana เพื่อมอนิเตอร์ระบบแบบ real-time เราเริ่มจากติดตั้ง Node Exporter บน web server ทุกตัว, cAdvisor บน Docker host, และ Prometheus server กลางที่คอย scrape metrics จากทุกเครื่อง ในช่วงแรก เราเน้นสร้าง dashboard ที่แสดง metrics สำคัญๆ เช่น CPU usage, memory utilization, network traffic, disk I/O, HTTP request latency, และจำนวน error ที่เกิดขึ้น พอมี dashboard เหล่านี้ เราก็เริ่มเห็น pattern ที่น่าสนใจ ยกตัวอย่างเช่น เราพบว่าช่วงที่มี traffic สูงๆ CPU ของ web server บางตัวจะพุ่งไป 100% เป็นพักๆ ทำให้เว็บช้า เราเลยเข้าไปตรวจสอบ configuration ของ web server ตัวนั้น และพบว่ามีการตั้งค่า connection timeout ที่ต่ำเกินไป ทำให้ connection ถูกตัดบ่อยๆ และ web server ต้องสร้าง connection ใหม่ตลอดเวลา พอเราปรับค่า connection timeout ให้เหมาะสม ปัญหา CPU พุ่งก็หายไป และเว็บก็กลับมาเร็วเหมือนเดิม อีกเคสหนึ่งคือ เราพบว่า disk I/O ของ database server สูงผิดปกติ เราเลยเข้าไปตรวจสอบ query ที่รันบน database และพบว่ามี query บางตัวที่ scan table ทั้งหมด แทนที่จะใช้ index พอเรา optimize query เหล่านั้น และเพิ่ม index ที่จำเป็น ปัญหา disk I/O สูงก็หายไป และ database ก็ทำงานได้เร็วขึ้นมาก หลังจาก implement Prometheus + Grafana เราสามารถแก้ไขปัญหา performance ได้อย่างรวดเร็ว และลดจำนวน ticket ที่ลูกค้าแจ้งเข้ามาได้อย่างเห็นได้ชัด ที่สำคัญคือเราสามารถ predict ปัญหาที่จะเกิดขึ้นในอนาคตได้ จากการ monitor trend ของ metrics ต่างๆ และวางแผนรับมือได้ทันท่วงที ตัวเลขที่น่าสนใจคือ หลังจาก implement ระบบ monitoring เราลด response time ของเว็บลงได้เฉลี่ย 30%, ลดจำนวน error ที่เกิดขึ้น 50%, และลดจำนวน ticket ที่ลูกค้าแจ้งเข้ามา 40% ถือว่าคุ้มค่ากับการลงทุนมากๆ ครับ

FAQ คำถามที่พบบ่อย

Prometheus เหมาะกับงานแบบไหน?

Prometheus เหมาะกับงาน monitoring ที่เน้นเก็บข้อมูลเป็น time-series data ครับ พูดง่ายๆ คือ ข้อมูลที่มีการเปลี่ยนแปลงตามเวลา เช่น CPU usage, memory utilization, HTTP request latency, จำนวน transaction ต่อวินาที ถ้างานของคุณมีข้อมูลลักษณะนี้ Prometheus จะตอบโจทย์มากๆ ครับ นอกจากนี้ Prometheus ยังเหมาะกับงานที่ต้องการความยืดหยุ่นในการ query ข้อมูล และสร้าง alert ที่ซับซ้อนได้

Grafana จำเป็นต้องใช้คู่กับ Prometheus เสมอไปไหม?

ไม่จำเป็นเสมอไปครับ Grafana เป็นแค่ visualization tool ตัวหนึ่งเท่านั้น มันสามารถดึงข้อมูลจาก data source อื่นๆ ได้หลากหลาย เช่น InfluxDB, Elasticsearch, Graphite หรือแม้แต่ MySQL แต่ Prometheus กับ Grafana มักจะถูกใช้คู่กันบ่อยๆ เพราะมันทำงานเข้ากันได้ดี และ Prometheus เป็น data source ที่ Grafana รองรับได้เป็นอย่างดีครับ ถ้าคุณมี data source อื่นอยู่แล้ว ก็สามารถใช้ Grafana กับ data source นั้นได้เลย

Prometheus เก็บข้อมูลนานแค่ไหน?

ระยะเวลาในการเก็บข้อมูลของ Prometheus ขึ้นอยู่กับการ config ครับ โดย default Prometheus จะเก็บข้อมูลไว้ใน local storage แต่เราสามารถ config ให้มันเก็บข้อมูลไว้ใน remote storage ได้ เช่น Thanos หรือ Cortex เพื่อเพิ่ม capacity ในการเก็บข้อมูลและ scalability โดยทั่วไปแล้ว เรามักจะ config ให้ Prometheus เก็บข้อมูลไว้อย่างน้อย 2-4 สัปดาห์ เพื่อให้เราสามารถวิเคราะห์ trend ของข้อมูลย้อนหลังได้

Alertmanager ส่ง notification ไปที่ไหนได้บ้าง?

Alertmanager สามารถส่ง notification ไปยังช่องทางต่างๆ ได้หลากหลายครับ ที่นิยมใช้กันก็คือ อีเมล, Slack, PagerDuty, และ webhook นอกจากนี้ยังมี integration กับช่องทางอื่นๆ อีกมากมาย เช่น Microsoft Teams, OpsGenie, VictorOps, และอื่นๆ เราสามารถ config Alertmanager ให้ส่ง notification ไปยังหลายช่องทางพร้อมกันได้ เพื่อให้มั่นใจว่าเราจะไม่พลาด alert ที่สำคัญ

PromQL ยากไหม? ต้องเรียนรู้เยอะหรือเปล่า?

PromQL (Prometheus Query Language) อาจจะดูยากในตอนแรก แต่ถ้าเราเข้าใจ concept พื้นฐานแล้ว ก็ไม่ได้ยากอย่างที่คิดครับ PromQL เป็นภาษาที่ใช้ query ข้อมูลจาก Prometheus มันมีความสามารถในการ filter, aggregate, และ transform ข้อมูลได้หลากหลาย เราสามารถเรียนรู้ PromQL ได้จาก documentation ของ Prometheus หรือจาก tutorial ต่างๆ บนอินเทอร์เน็ต ลองเริ่มจาก query ง่ายๆ ก่อน แล้วค่อยๆ เรียนรู้ function ที่ซับซ้อนขึ้นเรื่อยๆ ครับ

Prometheus กิน resource เยอะไหม? ต้องใช้ server แรงๆ หรือเปล่า?

Prometheus กิน resource มากน้อยแค่ไหน ขึ้นอยู่กับจำนวน metrics ที่เราเก็บ และความถี่ในการ scrape metrics ถ้าเราเก็บ metrics เยอะ และ scrape บ่อยๆ Prometheus ก็อาจจะกิน CPU และ memory เยอะ แต่โดยทั่วไปแล้ว Prometheus ไม่ได้กิน resource เยอะจนเกินไปครับ เราสามารถรัน Prometheus บน server ขนาดเล็กได้ แต่ถ้าเรามี metrics จำนวนมาก เราอาจจะต้องเพิ่ม resource ให้กับ server หรือใช้ remote storage เพื่อลด load บน Prometheus server

สรุป

Prometheus และ Grafana เป็นเครื่องมือที่ทรงพลังและยืดหยุ่นในการ monitoring ระบบ server ของเราครับ มันช่วยให้เราเห็นภาพรวมการทำงานของระบบได้อย่างละเอียด สามารถ detect ปัญหาได้รวดเร็ว และวางแผนรับมือกับปัญหาที่จะเกิดขึ้นในอนาคตได้ การ implement Prometheus + Grafana อาจจะดูยุ่งยากในตอนแรก แต่ถ้าเราค่อยๆ เรียนรู้และทำความเข้าใจ concept พื้นฐานแล้ว มันจะคุ้มค่ากับการลงทุนอย่างแน่นอนครับ เริ่มจากติดตั้ง Node Exporter บน server ของเรา, config Prometheus ให้ scrape metrics จาก Node Exporter, สร้าง dashboard ง่ายๆ บน Grafana, และลองเล่นกับ PromQL ดู สิ่งที่สำคัญที่สุดคือการทำความเข้าใจ metrics ที่เราเก็บ และสร้าง alert ที่เหมาะสมกับความต้องการของเรา อย่าเก็บ metrics เยอะเกินความจำเป็น เพราะจะทำให้ Prometheus กิน resource เยอะ และ alert ที่เยอะเกินไปก็จะทำให้เราละเลย alert ที่สำคัญจริงๆ สุดท้ายนี้ อยากแนะนำให้ลองศึกษา Best Practices ในการใช้ Prometheus และ Grafana จากแหล่งข้อมูลต่างๆ บนอินเทอร์เน็ต เพื่อให้เราสามารถใช้เครื่องมือเหล่านี้ได้อย่างมีประสิทธิภาพสูงสุด และสร้างระบบ monitoring ที่แข็งแกร่งให้กับองค์กรของเราครับ ขอให้สนุกกับการ monitoring นะครับ!

📰 บทความล่าสุดจาก SiamCafe

� ดูบทความทั้งหมด — SiamCafe Blog