บทนำ: เจาะลึกโลกแห่งการมอนิเตอร์ระบบ 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 ของเราเองและแชร์ให้กับคนอื่นๆ ได้อีกด้วย
วิธีติดตั้งและใช้งาน 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 หรือ InfluxDBGrafana 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 ไปยังช่องทางต่างๆ ได้ตามใจเลยครับ