Prometheus Grafana Monitoring ระบบ Server แบบ Pro

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

บทความนี้จะพาคุณเจาะลึกถึงโลกของการ Monitoring ระบบ Server ด้วย Prometheus และ Grafana ตั้งแต่พื้นฐานไปจนถึงเทคนิคขั้นสูง เพื่อให้คุณสามารถนำไปปรับใช้กับระบบของคุณได้อย่างมืออาชีพ ไม่ว่าคุณจะเป็น System Administrator, DevOps Engineer, หรือแม้แต่ผู้ประกอบการที่ต้องการความมั่นใจว่าระบบของคุณจะทำงานได้อย่างไร้ที่ติ เรามีทุกสิ่งที่คุณต้องการครับ

สารบัญ

ทำไมต้อง Monitoring ระบบ Server แบบ Pro? ความสำคัญที่มองข้ามไม่ได้

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

ปัญหาที่พบบ่อยเมื่อไม่มีการ Monitoring ที่ดีพอ

ลองจินตนาการดูนะครับว่าถ้าไม่มีระบบ Monitoring ที่ดีพอ จะเกิดอะไรขึ้นบ้าง:

  • การหยุดชะงักของระบบโดยไม่รู้ตัว (Downtime): คุณอาจไม่รู้เลยว่า Server ล่ม หรือ Application หยุดทำงาน จนกว่าจะมีลูกค้าโทรมาแจ้ง ซึ่งตอนนั้นความเสียหายได้เกิดขึ้นแล้วครับ
  • ประสิทธิภาพการทำงานลดลง (Performance Degradation): Server อาจจะยังไม่ล่ม แต่ทำงานช้าลงอย่างมากจนผู้ใช้รู้สึกหงุดหงิด ประสบการณ์ผู้ใช้ที่แย่ลงอาจทำให้ลูกค้าหายไปในที่สุด
  • ปัญหายากต่อการแก้ไข (Troubleshooting Challenges): เมื่อเกิดปัญหาขึ้นมา คุณจะไม่มีข้อมูลย้อนหลัง ไม่รู้ว่าอะไรเป็นสาเหตุที่แท้จริง ต้องใช้เวลานานในการหาสาเหตุและแก้ไข
  • ความเสี่ยงด้านความปลอดภัยที่มองไม่เห็น (Hidden Security Risks): การ Monitoring ที่ดีช่วยให้คุณตรวจจับความผิดปกติที่อาจบ่งชี้ถึงการโจมตีทางไซเบอร์ได้ หากไม่มีสิ่งนี้ คุณอาจตกเป็นเหยื่อโดยไม่รู้ตัว
  • การวางแผนทรัพยากรผิดพลาด (Poor Resource Planning): คุณไม่รู้ว่า Server ของคุณกำลังใช้ทรัพยากรไปเท่าไหร่ (CPU, Memory, Disk) ทำให้ยากต่อการตัดสินใจว่าจะต้องขยายระบบเมื่อไหร่ หรือจะลดขนาดลงเพื่อประหยัดค่าใช้จ่ายได้หรือไม่
  • ความเสียหายต่อชื่อเสียงและรายได้ (Reputation and Revenue Loss): สิ่งเหล่านี้เป็นผลลัพธ์โดยตรงจากปัญหาข้างต้นครับ การที่ลูกค้าไม่สามารถเข้าถึงบริการได้ หรือบริการทำงานได้ไม่ดี ย่อมส่งผลเสียต่อภาพลักษณ์และรายได้ของธุรกิจคุณอย่างแน่นอน

ประโยชน์ของการ Monitoring แบบมืออาชีพ

การลงทุนในระบบ Monitoring แบบ Pro ด้วย Prometheus และ Grafana จึงเป็นการลงทุนที่คุ้มค่าในระยะยาวครับ เพราะมันมอบประโยชน์มากมายดังนี้:

  • ตรวจจับปัญหาได้รวดเร็ว (Early Detection): ระบบจะแจ้งเตือนทันทีที่มีความผิดปกติ ทำให้คุณสามารถแก้ไขได้ก่อนที่ปัญหาจะบานปลาย
  • ระบุสาเหตุและแก้ไขได้ตรงจุด (Efficient Troubleshooting): ด้วยข้อมูล Metric ที่ละเอียดและครบถ้วน คุณสามารถวิเคราะห์หาสาเหตุของปัญหาได้อย่างแม่นยำและรวดเร็ว
  • เพิ่มประสิทธิภาพการทำงาน (Performance Optimization): คุณสามารถเห็นภาพรวมของทรัพยากรที่ใช้งานอยู่ และปรับแต่งระบบให้ทำงานได้ดีที่สุด
  • วางแผนการขยายระบบได้อย่างมีข้อมูล (Informed Capacity Planning): รู้ว่าเมื่อไหร่ควรเพิ่มทรัพยากร หรือเมื่อไหร่ควรปรับลด เพื่อให้ระบบรองรับการใช้งานได้อย่างเหมาะสม
  • เพิ่มความน่าเชื่อถือและความพร้อมใช้งาน (Enhanced Reliability & Uptime): ลดโอกาสที่ระบบจะหยุดชะงัก ทำให้ธุรกิจของคุณดำเนินไปได้อย่างต่อเนื่อง
  • ประหยัดค่าใช้จ่าย (Cost Saving): การป้องกันปัญหาย่อมดีกว่าการตามแก้ปัญหาเสมอครับ นอกจากนี้ การวางแผนทรัพยากรที่ดีจะช่วยให้คุณใช้จ่ายอย่างคุ้มค่า
  • สร้างความอุ่นใจ (Peace of Mind): คุณสามารถมั่นใจได้ว่าระบบของคุณอยู่ภายใต้การดูแลอย่างใกล้ชิด

การ Monitoring แบบ Pro ด้วย Prometheus และ Grafana ไม่ได้เป็นเพียงแค่การดูตัวเลข แต่เป็นการทำความเข้าใจ “สุขภาพ” ของระบบคุณอย่างลึกซึ้ง ทำให้คุณสามารถจัดการและตัดสินใจได้อย่างชาญฉลาด เพื่อให้ธุรกิจของคุณก้าวไปข้างหน้าได้อย่างมั่นคงครับ

ทำความรู้จักกับ Prometheus: หัวใจของการเก็บ Metric

Prometheus เป็นเครื่องมือ Open Source สำหรับการ Monitoring และ Alerting ที่ได้รับความนิยมอย่างสูงในปัจจุบันครับ โดยเฉพาะในกลุ่ม Cloud Native และ Kubernetes Ecosystem ซึ่งเป็นที่มาของความสามารถในการรองรับการ Monitoring ระบบขนาดใหญ่และมีความ dynamic สูงได้อย่างยอดเยี่ยม

Prometheus คืออะไร?

Prometheus ถูกพัฒนาขึ้นครั้งแรกโดย SoundCloud ในปี 2012 และได้เข้าร่วมเป็นโปรเจกต์ของ Cloud Native Computing Foundation (CNCF) ในปี 2016 ซึ่งเป็นองค์กรเดียวกับที่ดูแล Kubernetes ครับ

หัวใจหลักของ Prometheus คือการรวบรวมข้อมูลตัวเลข (Metrics) จาก Target ที่ถูกกำหนดไว้เป็นระยะ ๆ จัดเก็บไว้ในฐานข้อมูล Time Series Database (TSDB) ของตัวเอง และสามารถประมวลผล Query ข้อมูลเหล่านี้ด้วยภาษา PromQL รวมถึงการส่ง Alert ไปยัง Alertmanager เมื่อเงื่อนไขที่กำหนดไว้เป็นจริง

สถาปัตยกรรมของ Prometheus (Pull Model)

สิ่งที่โดดเด่นและเป็นเอกลักษณ์ของ Prometheus คือสถาปัตยกรรมการทำงานแบบ “Pull Model” ครับ

  • Prometheus Server จะเป็นผู้ “ดึง” ข้อมูล: แทนที่ Target (เช่น Server, Application) จะเป็นผู้ส่งข้อมูล Metric ไปหา Prometheus Server, Prometheus Server กลับเป็นผู้ที่ร้องขอและดึงข้อมูล Metric จาก Target เหล่านั้นเอง
  • Target ต้องมี Exporter: เพื่อให้ Prometheus สามารถดึงข้อมูลได้ Target จะต้องมี “Exporter” ทำหน้าที่เปิด Endpoint HTTP เพื่อให้บริการข้อมูล Metric ในรูปแบบที่ Prometheus เข้าใจ
  • ข้อดีของ Pull Model:
    • จัดการง่าย: Prometheus Server เป็นผู้กำหนดว่าจะดึงข้อมูลจากไหน ทำให้การเพิ่มหรือลบ Target ทำได้ง่าย
    • ทนทานต่อความล้มเหลว: หาก Prometheus Server ล่มชั่วคราว Target ก็ยังคงทำงานปกติ เมื่อ Server กลับมาทำงาน ก็จะเริ่มดึงข้อมูลต่อได้
    • ลดภาระ Target: Target ไม่ต้องกังวลเรื่องการส่งข้อมูล เพียงแค่เตรียมข้อมูลให้พร้อม
    • เหมาะกับ Service Discovery: ทำงานได้ดีกับระบบที่มีการเปลี่ยนแปลงของ Target บ่อยครั้ง เช่นใน Kubernetes

Component หลักของ Prometheus

Prometheus ไม่ได้มีแค่ Server ตัวเดียวครับ แต่ประกอบด้วย Component หลายส่วนที่ทำงานร่วมกัน:

  • Prometheus Server:
    • Scraper: ดึงข้อมูล Metric จาก Exporter
    • Time Series Database (TSDB): จัดเก็บข้อมูล Metric
    • HTTP Server: สำหรับให้บริการ PromQL Query และ Web UI
  • Exporters:
    • โปรแกรมเล็ก ๆ ที่รันอยู่บน Target ทำหน้าที่แปลง Metric ของ Target นั้น ๆ ให้อยู่ในรูปแบบที่ Prometheus เข้าใจ และเปิด HTTP Endpoint ให้ Prometheus ดึงข้อมูลไป
    • ตัวอย่าง: Node Exporter (สำหรับ OS metrics), cAdvisor (สำหรับ Container metrics), JMX Exporter (สำหรับ Java applications), Blackbox Exporter (สำหรับ Probing Endpoints)
  • Pushgateway:
    • สำหรับใช้ในกรณีที่ Target ไม่สามารถให้ Prometheus ดึงข้อมูลได้โดยตรง หรือเป็น Job ที่รันสั้น ๆ แล้วจบไป (Short-lived jobs)
    • Target จะ Push ข้อมูล Metric มายัง Pushgateway และ Prometheus Server จะ Pull ข้อมูลจาก Pushgateway อีกที
  • Alertmanager:
    • รับ Alert ที่ถูกสร้างขึ้นจาก Prometheus Server และจัดการกับการแจ้งเตือน เช่น Grouping, Silencing, และ Routing ไปยังช่องทางต่าง ๆ (Email, Slack, PagerDuty, Line Notify)
  • Service Discovery:
    • Prometheus สามารถค้นหา Target ที่จะ Scrape ได้โดยอัตโนมัติจากแหล่งต่าง ๆ เช่น Kubernetes, Consul, EC2, หรือไฟล์ Config ทำให้การจัดการ Target จำนวนมากทำได้ง่ายขึ้น

PromQL: ภาษาสอบถามข้อมูลที่ทรงพลัง

PromQL (Prometheus Query Language) เป็นภาษาที่ใช้ในการสอบถามข้อมูล Metric จาก Prometheus TSDB ครับ มันเป็นภาษาที่มีความยืดหยุ่นและทรงพลังอย่างมาก สามารถใช้ในการ:

  • เลือก Metric โดยใช้ชื่อและ Label
  • กรองข้อมูลด้วยเงื่อนไขต่าง ๆ
  • รวมข้อมูล (Aggregation) เช่น รวมค่าเฉลี่ย, ค่าสูงสุด, ค่าต่ำสุด
  • คำนวณอัตราการเปลี่ยนแปลง (Rate), ผลรวมสะสม (Sum), เปอร์เซ็นต์ไทล์ (Quantile)
  • เปรียบเทียบข้อมูลย้อนหลัง

ตัวอย่างการใช้งาน PromQL

  • แสดง CPU Usage ทั้งหมดของเครื่อง:
    100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

    อธิบาย: คำนวณเปอร์เซ็นต์ CPU ที่ใช้งานอยู่ โดยใช้ค่าเฉลี่ยของอัตราการเปลี่ยนแปลงของ CPU ในโหมด “idle” ในช่วง 5 นาทีที่ผ่านมา แล้วนำไปลบออกจาก 100 ครับ

  • แสดง Free Memory เป็นเปอร์เซ็นต์:
    (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

    อธิบาย: นำหน่วยความจำที่เหลืออยู่ (MemAvailable) หารด้วยหน่วยความจำทั้งหมด (MemTotal) แล้วคูณด้วย 100 เพื่อให้ได้เป็นเปอร์เซ็นต์ครับ

  • แสดงจำนวน Connection ของ Nginx ในสถานะ Active:
    nginx_connections_active

    อธิบาย: เป็น Metric ที่มาจาก Nginx Exporter แสดงจำนวน Connection ที่ Active อยู่ในปัจจุบันครับ

PromQL เป็นหัวใจสำคัญในการดึงประสิทธิภาพสูงสุดจาก Prometheus ครับ ยิ่งคุณเข้าใจ PromQL มากเท่าไหร่ คุณก็จะยิ่งสร้าง Dashboard และ Alert ได้มีประสิทธิภาพมากขึ้นเท่านั้น

ทำความรู้จักกับ Grafana: สุดยอด Dashboard สำหรับ Visualization

เมื่อ Prometheus ทำหน้าที่เป็นผู้รวบรวมและจัดเก็บข้อมูล Metric อย่างขยันขันแข็ง Grafana ก็คือเครื่องมือที่จะนำข้อมูลเหล่านั้นมาแปลงให้กลายเป็นภาพที่สวยงาม เข้าใจง่าย และทรงพลัง ช่วยให้เราสามารถมองเห็น “สุขภาพ” ของระบบได้อย่างชัดเจนครับ

Grafana คืออะไร?

Grafana เป็นแพลตฟอร์ม Open Source สำหรับการวิเคราะห์ข้อมูล การสร้าง Dashboard และการ Monitoring ครับ มันถูกออกแบบมาเพื่อเชื่อมต่อกับ Data Source ที่หลากหลาย (ไม่ใช่แค่ Prometheus เท่านั้น แต่รวมถึง Graphite, InfluxDB, Elasticsearch, PostgreSQL, MySQL และอื่น ๆ อีกมากมาย) และนำเสนอข้อมูลเหล่านั้นในรูปแบบกราฟ แผนภูมิ หรือตารางที่ปรับแต่งได้ตามต้องการ

Grafana ไม่ได้จัดเก็บข้อมูล Metric ด้วยตัวเองครับ แต่ทำหน้าที่เป็น “หน้าต่าง” ที่ดึงข้อมูลจาก Data Source ต่าง ๆ มาแสดงผล ทำให้มันเป็นเครื่องมือที่ยืดหยุ่นและเป็นที่นิยมอย่างมากในชุมชน IT ครับ

คุณสมบัติเด่นของ Grafana

  • รองรับ Data Source หลากหลาย: เชื่อมต่อกับฐานข้อมูลและระบบ Monitoring ได้หลายประเภท
  • Dashboard ที่ปรับแต่งได้สูง: สร้าง Dashboard ที่ตอบโจทย์ความต้องการเฉพาะของคุณได้อย่างอิสระ ด้วย Panel ประเภทต่าง ๆ
  • กราฟและ Visualization ที่สวยงาม: นำเสนอข้อมูลในรูปแบบที่เข้าใจง่ายและสวยงาม
  • Alerting: Grafana มีระบบ Alerting ในตัวที่สามารถสร้างเงื่อนไขการแจ้งเตือนจากข้อมูลที่แสดงบน Dashboard ได้ (แม้ว่าโดยทั่วไปจะแนะนำให้ใช้ Prometheus Alertmanager สำหรับ Prometheus Metrics ก็ตาม)
  • Templating และ Variables: สร้าง Dashboard ที่สามารถนำไปใช้ซ้ำได้กับ Server หรือ Application ที่คล้ายกัน เพียงแค่เปลี่ยนค่า Variable
  • Annotations: เพิ่มข้อความลงบนกราฟเพื่อระบุเหตุการณ์สำคัญ เช่น การ Deploy ระบบ หรือการเกิด Downtime
  • Playlist: สร้าง Playlist ของ Dashboard เพื่อสลับสับเปลี่ยนไปมาอัตโนมัติ เหมาะสำหรับการแสดงผลบนจอขนาดใหญ่ในห้อง NOC (Network Operations Center)
  • User Management และ Permissions: จัดการผู้ใช้งานและกำหนดสิทธิ์การเข้าถึง Dashboard ได้

Data Source (เชื่อมต่อ Prometheus)

การเชื่อมต่อ Grafana กับ Prometheus นั้นทำได้ง่ายมากครับ Grafana จะทำหน้าที่ส่ง PromQL Query ไปยัง Prometheus Server และรับข้อมูลผลลัพธ์กลับมาแสดงผล

เมื่อคุณติดตั้ง Grafana และ Prometheus แล้ว ขั้นตอนแรกคือการเพิ่ม Prometheus เป็น Data Source ใน Grafana ครับ ซึ่งจะระบุ URL ของ Prometheus Server ให้ Grafana รู้ว่าจะไปดึงข้อมูลจากที่ไหน


# ตัวอย่างการตั้งค่า Data Source ใน Grafana (UI)
# Name: Prometheus
# Type: Prometheus
# URL: http://localhost:9090 (หรือ IP/Hostname ของ Prometheus Server)
# Access: Server (Default)

สร้าง Dashboard และ Panel (Graph, Stat, Table)

หลังจากเชื่อมต่อ Data Source แล้ว คุณก็พร้อมที่จะสร้าง Dashboard ครับ Dashboard ประกอบด้วย “Panel” หลาย ๆ อัน ซึ่งแต่ละ Panel จะแสดงข้อมูลในรูปแบบที่แตกต่างกันไป

  • Graph Panel: แสดงข้อมูลในรูปแบบกราฟเส้น ซึ่งเหมาะสำหรับการดูแนวโน้มและการเปลี่ยนแปลงของ Metric ตลอดช่วงเวลา
  • Stat Panel: แสดงตัวเลขสถิติปัจจุบันของ Metric นั้น ๆ พร้อมกับกราฟเล็ก ๆ แสดงแนวโน้ม
  • Table Panel: แสดงข้อมูลในรูปแบบตาราง เหมาะสำหรับการแสดง Metric ที่มี Label แตกต่างกันจำนวนมาก
  • Gauge Panel: แสดงค่าปัจจุบันในรูปแบบมาตรวัด เหมาะสำหรับ Metric ที่มีค่าสูงสุด/ต่ำสุดที่กำหนดได้
  • Heatmap Panel: แสดงความหนาแน่นของข้อมูลในช่วงเวลาหนึ่ง เหมาะสำหรับ Latency หรือ Response Time
  • และอื่น ๆ อีกมากมาย!

ในแต่ละ Panel คุณจะเขียน PromQL Query เพื่อดึงข้อมูลจาก Prometheus และ Grafana จะเป็นผู้ render ข้อมูลนั้นออกมาเป็นภาพให้ครับ

การผสมผสาน Prometheus ที่แข็งแกร่งในการเก็บ Metric และ PromQL ที่ทรงพลัง กับ Grafana ที่มีความยืดหยุ่นในการสร้าง Visualization ทำให้การ Monitoring ระบบ Server แบบ Pro เป็นเรื่องที่ง่ายและมีประสิทธิภาพอย่างไม่น่าเชื่อครับ

อ่านเพิ่มเติมเกี่ยวกับ Grafana

ลงมือติดตั้ง Prometheus และ Grafana บน Server ของคุณ (Step-by-Step)

ถึงเวลาที่เราจะลงมือติดตั้ง Prometheus และ Grafana บน Server จริง ๆ แล้วครับ ในส่วนนี้ เราจะเน้นไปที่การติดตั้งบนระบบปฏิบัติการ Linux (Ubuntu/Debian) ซึ่งเป็นที่นิยมใน Server Environment ครับ

ข้อกำหนดเบื้องต้น

  • Server ที่ใช้ระบบปฏิบัติการ Linux (เช่น Ubuntu 20.04 LTS หรือ CentOS 7/8)
  • สิทธิ์ Root หรือผู้ใช้ที่มีสิทธิ์ sudo
  • มี Firewall เปิดพอร์ตที่จำเป็น (Prometheus: 9090, Node Exporter: 9100, Grafana: 3000)
  • มีเครื่องมือ wget หรือ curl สำหรับดาวน์โหลดไฟล์

ติดตั้ง Prometheus Server

เราจะติดตั้ง Prometheus ด้วยการดาวน์โหลด Binary โดยตรงจากเว็บไซต์ทางการครับ

1. ดาวน์โหลดและแตกไฟล์


# สร้างไดเรกทอรีสำหรับ Prometheus
sudo mkdir -p /etc/prometheus /var/lib/prometheus

# ดาวน์โหลด Prometheus (ตรวจสอบเวอร์ชันล่าสุดได้จาก prometheus.io)
# ตัวอย่างนี้ใช้เวอร์ชัน 2.45.0
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz

# แตกไฟล์
tar xvfz prometheus-2.45.0.linux-amd64.tar.gz

# ย้าย Binary ไปยัง /usr/local/bin
sudo mv prometheus-2.45.0.linux-amd64/prometheus /usr/local/bin/
sudo mv prometheus-2.45.0.linux-amd64/promtool /usr/local/bin/

# ย้ายไฟล์ตั้งค่าและ Libraries
sudo mv prometheus-2.45.0.linux-amd64/consoles /etc/prometheus/
sudo mv prometheus-2.45.0.linux-amd64/console_libraries /etc/prometheus/

# ลบไฟล์ที่ดาวน์โหลดและไดเรกทอรีชั่วคราว
rm -rf prometheus-2.45.0.linux-amd64.tar.gz prometheus-2.45.0.linux-amd64

# สร้าง User สำหรับ Prometheus เพื่อความปลอดภัย
sudo useradd --no-create-home --shell /bin/false prometheus

# กำหนดสิทธิ์ให้ Prometheus user
sudo chown -R prometheus:prometheus /etc/prometheus
sudo chown -R prometheus:prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool

2. ไฟล์ตั้งค่า `prometheus.yml`

สร้างไฟล์ตั้งค่าหลักของ Prometheus ที่ /etc/prometheus/prometheus.yml


# /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s # ดึงข้อมูลทุกๆ 15 วินาที
  evaluation_interval: 15s # ประเมิน Rule ทุกๆ 15 วินาที

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - localhost:9093 # Uncomment หากจะใช้ Alertmanager

rule_files:
  # - "/etc/prometheus/alert.rules.yml" # Uncomment หากมี Alert rules

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"] # Monitoring ตัว Prometheus เอง

  # จะเพิ่ม Node Exporter เข้ามาในภายหลัง

3. สร้าง Systemd Service

เพื่อให้ Prometheus Server สามารถรันเป็น Service และจัดการได้ง่ายขึ้น เราจะสร้างไฟล์ Systemd Service ที่ /etc/systemd/system/prometheus.service


# /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
    --config.file /etc/prometheus/prometheus.yml \
    --storage.tsdb.path /var/lib/prometheus \
    --web.console.templates=/etc/prometheus/consoles \
    --web.console.libraries=/etc/prometheus/console_libraries \
    --web.listen-address="0.0.0.0:9090"

SyslogIdentifier=prometheus
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

4. ทดสอบการทำงาน

โหลด Service ใหม่, เปิดใช้งาน, และตรวจสอบสถานะ


sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
sudo systemctl status prometheus

หากทุกอย่างถูกต้อง คุณควรเห็นสถานะ “active (running)” ครับ และสามารถเข้าถึง Web UI ของ Prometheus ได้ที่ http://<your_server_ip>:9090

ติดตั้ง Node Exporter (สำหรับ Monitoring Linux Server)

Node Exporter เป็น Exporter ยอดนิยมสำหรับการเก็บ Metric พื้นฐานของ Server Linux เช่น CPU, Memory, Disk I/O, Network I/O และอื่น ๆ ครับ

1. ดาวน์โหลดและแตกไฟล์


# ดาวน์โหลด Node Exporter (ตรวจสอบเวอร์ชันล่าสุดได้จาก github.com/prometheus/node_exporter)
# ตัวอย่างนี้ใช้เวอร์ชัน 1.6.1
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz

# แตกไฟล์
tar xvfz node_exporter-1.6.1.linux-amd64.tar.gz

# ย้าย Binary ไปยัง /usr/local/bin
sudo mv node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/

# ลบไฟล์ที่ดาวน์โหลดและไดเรกทอรีชั่วคราว
rm -rf node_exporter-1.6.1.linux-amd64.tar.gz node_exporter-1.6.1.linux-amd64

# สร้าง User สำหรับ Node Exporter
sudo useradd --no-create-home --shell /bin/false node_exporter

# กำหนดสิทธิ์
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter

2. สร้าง Systemd Service

สร้างไฟล์ Systemd Service ที่ /etc/systemd/system/node_exporter.service


# /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
    --web.listen-address="0.0.0.0:9100" # Node Exporter จะเปิดพอร์ต 9100

SyslogIdentifier=node_exporter
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

3. เพิ่ม Node Exporter ใน `prometheus.yml`

แก้ไขไฟล์ /etc/prometheus/prometheus.yml เพื่อเพิ่ม Node Exporter เป็น Target


# /etc/prometheus/prometheus.yml (เพิ่มส่วนนี้เข้าไป)
scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "node_exporter"
    static_configs:
      - targets: ["localhost:9100"] # หรือ IP/Hostname ของ Server ที่รัน Node Exporter

4. ทดสอบการทำงาน


sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
sudo systemctl status node_exporter

# รีสตาร์ท Prometheus เพื่อให้โหลด config ใหม่
sudo systemctl restart prometheus

ตรวจสอบที่ Web UI ของ Prometheus (http://<your_server_ip>:9090) ไปที่เมนู “Status” -> “Targets” คุณควรเห็น “node_exporter” ขึ้นสถานะ “UP” ครับ

ติดตั้ง Grafana

เราจะติดตั้ง Grafana โดยใช้ APT Package Manager (สำหรับ Ubuntu/Debian) ซึ่งเป็นวิธีที่ง่ายที่สุดครับ


# ติดตั้ง dependencies
sudo apt-get install -y apt-transport-https software-properties-common wget

# เพิ่ม GPG key ของ Grafana
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -

# เพิ่ม Grafana repository (สำหรับเวอร์ชัน Open Source)
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

# อัปเดต package list และติดตั้ง Grafana
sudo apt-get update
sudo apt-get install grafana

# เริ่มต้นและเปิดใช้งาน Grafana service
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
sudo systemctl status grafana-server

Grafana จะรันบนพอร์ต 3000 โดยค่าเริ่มต้นครับ คุณสามารถเข้าถึง Web UI ได้ที่ http://<your_server_ip>:3000

Default Login: username: admin, password: admin (ระบบจะบังคับให้เปลี่ยนรหัสผ่านเมื่อ Login ครั้งแรก)

เพิ่ม Prometheus เป็น Data Source ใน Grafana

  1. Login เข้า Grafana ด้วย User admin
  2. คลิกที่ไอคอน ⚙️ (Configuration) ทางซ้ายมือ
  3. เลือก “Data Sources”
  4. คลิก “Add data source”
  5. เลือก “Prometheus”
  6. ตั้งค่า:

    • Name: Prometheus (หรือชื่ออื่นที่คุณต้องการ)
    • URL: http://localhost:9090 (ถ้า Grafana และ Prometheus อยู่บน Server เดียวกัน) หรือ http://<Prometheus_Server_IP>:9090
    • ค่าอื่น ๆ ปล่อยเป็น Default ได้
  7. คลิก “Save & Test” คุณควรเห็นข้อความ “Data source is working” ครับ

เพียงเท่านี้ คุณก็มีระบบ Monitoring พื้นฐานด้วย Prometheus และ Grafana พร้อมใช้งานแล้วครับ! ในส่วนถัดไป เราจะมาสร้าง Dashboard สวย ๆ กันครับ

การสร้าง Dashboard Monitoring ที่มีประสิทธิภาพด้วย Grafana

เมื่อ Prometheus เริ่มเก็บข้อมูล Metric และ Grafana สามารถเชื่อมต่อกับ Prometheus ได้แล้ว ขั้นตอนต่อไปคือการสร้าง Dashboard เพื่อแสดงผลข้อมูลเหล่านั้นให้เห็นภาพชัดเจนและเข้าใจง่ายครับ

Import Dashboard สำเร็จรูป

Grafana มีคลัง Dashboard สำเร็จรูปที่ชุมชนสร้างและแบ่งปันกันอย่างมากมาย ซึ่งเป็นวิธีที่รวดเร็วและง่ายที่สุดในการเริ่มต้นใช้งานครับ Dashboard เหล่านี้มักจะถูกสร้างมาอย่างดีและครอบคลุม Metric สำคัญ ๆ อยู่แล้ว

คุณสามารถค้นหา Dashboard ได้ที่ Grafana Dashboards ครับ

ตัวอย่าง Dashboard ID ยอดนิยมสำหรับ Node Exporter:

  • Node Exporter Full: ID 1860 หรือ 11074 (สำหรับเวอร์ชันใหม่ ๆ) – Dashboard นี้ครอบคลุม Metric ส่วนใหญ่จาก Node Exporter อย่างละเอียด
  • Prometheus Stats: ID 2 – สำหรับ Monitoring ตัว Prometheus Server เอง

ขั้นตอนการ Import Dashboard:

  1. เข้าสู่ระบบ Grafana
  2. คลิกที่ไอคอน ➕ (Create) ทางซ้ายมือ
  3. เลือก “Import”
  4. ในช่อง “Import via grafana.com” ให้ใส่ ID ของ Dashboard ที่คุณต้องการ (เช่น 1860) แล้วคลิก “Load”
  5. Grafana จะแสดงข้อมูลของ Dashboard นั้นขึ้นมา คุณสามารถเลือก “Prometheus” เป็น Data Source ที่จะใช้ (ซึ่งเราได้ตั้งค่าไว้แล้ว) และอาจเปลี่ยนชื่อ Dashboard ได้
  6. คลิก “Import”

เท่านี้คุณก็จะได้ Dashboard ที่พร้อมใช้งานทันทีครับ! ลองสำรวจดูข้อมูลต่าง ๆ ที่ปรากฏบน Dashboard นั้น ๆ ดูนะครับ

สร้าง Dashboard ด้วยตัวเอง

การสร้าง Dashboard ด้วยตัวเองช่วยให้คุณปรับแต่งได้ตามความต้องการเฉพาะของระบบคุณครับ เราจะลองสร้าง Panel พื้นฐานบางส่วนกัน

ขั้นตอนการสร้าง Dashboard ใหม่:

  1. เข้าสู่ระบบ Grafana
  2. คลิกที่ไอคอน ➕ (Create) ทางซ้ายมือ
  3. เลือก “Dashboard”
  4. คลิก “Add new panel”

ตัวอย่างการสร้าง Panel:

1. เพิ่ม Panel: Graph (CPU Usage)
  • เลือก Visualization Type เป็น “Graph”
  • ในส่วน “Query” (A)
    • เลือก Data source เป็น “Prometheus”
    • ใส่ PromQL Query:
      100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
    • คลิก “Run queries” เพื่อดูผลลัพธ์
  • ในส่วน “Panel options”
    • Title: CPU Usage
    • Unit: percent (0-100)
    • อาจปรับแต่งสี, Legend, หรือ Tooltip ตามต้องการ
  • คลิก “Apply”
2. เพิ่ม Panel: Stat (Current Load Average)
  • คลิก “Add new panel” บน Dashboard เดิม
  • เลือก Visualization Type เป็น “Stat”
  • ในส่วน “Query” (A)
    • เลือก Data source เป็น “Prometheus”
    • ใส่ PromQL Query:
      node_load1
  • ในส่วน “Panel options”
    • Title: Load Average (1 min)
    • Unit: short
  • คลิก “Apply”
3. เพิ่ม Panel: Table (Disk Usage)
  • คลิก “Add new panel”
  • เลือก Visualization Type เป็น “Table”
  • ในส่วน “Query” (A)
    • เลือก Data source เป็น “Prometheus”
    • ใส่ PromQL Query:
      
                      100 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100)
                      

      (Query นี้แสดง Disk Usage เป็นเปอร์เซ็นต์ของ Mountpoint /)

    • คุณสามารถเพิ่ม Label เพื่อแยก Drive หรือ Mountpoint ได้ด้วย PromQL ที่ซับซ้อนขึ้น
  • ในส่วน “Panel options”
    • Title: Disk Usage
    • Unit: percent (0-100)
  • คลิก “Apply”

การใช้ Variables เพื่อ Dashboard ที่ยืดหยุ่น

Variables ช่วยให้ Dashboard ของคุณมีความยืดหยุ่นสูง สามารถเลือกดูข้อมูลของ Server หรือ Service ต่าง ๆ ได้โดยไม่ต้องสร้าง Dashboard ใหม่ทั้งหมด

  1. บน Dashboard ของคุณ คลิกที่ไอคอนรูปเฟือง ⚙️ (Dashboard settings) ที่มุมขวาบน
  2. เลือก “Variables”
  3. คลิก “Add variable”
  4. ตั้งค่า Variable (เช่น สำหรับเลือก Instance ของ Node Exporter):

    • Name: instance
    • Type: Query
    • Data source: Prometheus
    • Query: label_values(node_uname_info, instance) (จะดึงค่า Label “instance” ที่มีอยู่ใน Metric node_uname_info)
    • Selection options: เลือก “Multi-value” และ “Include All option” เพื่อให้เลือกได้หลายตัวหรือทั้งหมด
  5. คลิก “Add” และ “Save dashboard”

หลังจากสร้าง Variable แล้ว คุณสามารถนำไปใช้ใน PromQL Query ในแต่ละ Panel ได้ โดยการเปลี่ยน instance="localhost:9100" (หรือ instance="server_ip:9100") เป็น instance="$instance" ครับ

เช่น Query CPU Usage จะกลายเป็น:


100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle", instance=~"$instance"}[5m])) * 100)

ด้วยการใช้ Variables คุณสามารถสร้าง Dashboard เดียวที่ใช้ Monitoring Server หลาย ๆ ตัวได้ ทำให้การจัดการง่ายขึ้นมากครับ

การสร้าง Dashboard เป็นศิลปะและวิทยาศาสตร์ผสมผสานกันครับ ลองทดลองกับ PromQL Query และ Visualization Type ต่าง ๆ เพื่อหาการแสดงผลที่เหมาะสมและให้ข้อมูลเชิงลึกที่สุดสำหรับระบบของคุณครับ

การตั้งค่า Alerting ด้วย Prometheus Alertmanager

การ Monitoring ที่ดีไม่ได้เป็นเพียงแค่การแสดงข้อมูลบน Dashboard เท่านั้นครับ แต่ยังต้องสามารถแจ้งเตือน (Alert) เราได้ทันทีเมื่อเกิดเหตุการณ์ผิดปกติ เพื่อให้เราสามารถตอบสนองและแก้ไขปัญหาได้อย่างรวดเร็ว ในระบบ Prometheus สิ่งนี้จัดการโดย Prometheus Alertmanager ครับ

หลักการทำงานของ Alertmanager

Prometheus Server จะประเมิน “Alerting Rules” ที่เรากำหนดไว้เป็นระยะ ๆ หากเงื่อนไขของ Rule เป็นจริง Prometheus จะสร้าง “Alert” ขึ้นมา และส่ง Alert เหล่านั้นไปยัง Alertmanager

Alertmanager จะรับ Alert ที่เข้ามา จัดการกับมันด้วยฟังก์ชันต่าง ๆ ดังนี้:

  • Grouping: จัดกลุ่ม Alert ที่มีลักษณะคล้ายกันเข้าด้วยกัน เพื่อลดจำนวนการแจ้งเตือนที่ซ้ำซ้อน
  • Inhibition: ระงับการแจ้งเตือนบางอย่าง หากมี Alert ที่สำคัญกว่าเกิดขึ้น (เช่น ถ้า Server ล่มทั้งหมด ไม่ต้องส่ง Alert ว่าแต่ละ Service ล่ม)
  • Silencing: ปิดการแจ้งเตือนชั่วคราวในช่วงเวลาที่เรากำลังซ่อมบำรุงระบบ
  • Routing: ส่ง Alert ไปยังปลายทางที่เหมาะสม (เช่น แจ้งเตือนทีม A ไป Slack, แจ้งเตือนทีม B ไป Email)

จากนั้น Alertmanager จะส่งการแจ้งเตือนไปยังช่องทางต่าง ๆ ที่เรากำหนดไว้ เช่น Email, Slack, PagerDuty, Webhook (สำหรับ Line Notify หรือระบบอื่น ๆ)

ตั้งค่า Prometheus Rule File (`alert.rules.yml`)

เราจะสร้างไฟล์ Rule สำหรับ Prometheus เพื่อกำหนดเงื่อนไขการแจ้งเตือน โดยจะเก็บไว้ที่ /etc/prometheus/alert.rules.yml


# /etc/prometheus/alert.rules.yml
groups:
  - name: General
    rules:
    - alert: InstanceDown
      expr: up == 0
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "Instance {{ $labels.instance }} is down"
        description: "{{ $labels.instance }} has been down for more than 1 minute."

    - alert: HighCPUUsage
      expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "High CPU usage on {{ $labels.instance }}"
        description: "{{ $labels.instance }} CPU usage is above 80% for 5 minutes (current: {{ $value | humanize }}%)."

    - alert: LowDiskSpace
      expr: node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100 < 20
      for: 10m
      labels:
        severity: warning
      annotations:
        summary: "Low disk space on {{ $labels.instance }} (Mountpoint: {{ $labels.mountpoint }})"
        description: "{{ $labels.instance }} has less than 20% disk space left on {{ $labels.mountpoint }} (current: {{ $value | humanize }}% available)."

อธิบาย Rule:

  • `InstanceDown`: แจ้งเตือนเมื่อ Target ใด ๆ ไม่สามารถ Scrape ได้ (up == 0) เป็นเวลา 1 นาที
  • `HighCPUUsage`: แจ้งเตือนเมื่อ CPU Usage เกิน 80% เป็นเวลา 5 นาที
  • `LowDiskSpace`: แจ้งเตือนเมื่อพื้นที่ดิสก์ที่ Mountpoint / เหลือต่ำกว่า 20% เป็นเวลา 10 นาที

หลังจากสร้างไฟล์นี้แล้ว คุณต้องแก้ไข /etc/prometheus/prometheus.yml เพื่อให้ Prometheus โหลด Rule file นี้:


# /etc/prometheus/prometheus.yml
rule_files:
  - "/etc/prometheus/alert.rules.yml" # Uncomment หรือเพิ่มบรรทัดนี้

และรีสตาร์ท Prometheus Server:


sudo systemctl restart prometheus

ตั้งค่า Alertmanager (`alertmanager.yml`)

เราจะติดตั้ง Alertmanager แยกออกมาเป็นอีกหนึ่ง Service ครับ คล้ายกับการติดตั้ง Prometheus และ Node Exporter

1. ดาวน์โหลดและแตกไฟล์ Alertmanager


# สร้างไดเรกทอรีสำหรับ Alertmanager
sudo mkdir -p /etc/alertmanager /var/lib/alertmanager

# ดาวน์โหลด Alertmanager (ตรวจสอบเวอร์ชันล่าสุดจาก github.com/prometheus/alertmanager)
# ตัวอย่างนี้ใช้เวอร์ชัน 0.25.0
wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz

# แตกไฟล์
tar xvfz alertmanager-0.25.0.linux-amd64.tar.gz

# ย้าย Binary ไปยัง /usr/local/bin
sudo mv alertmanager-0.25.0.linux-amd64/alertmanager /usr/local/bin/
sudo mv alertmanager-0.25.0.linux-amd64/amtool /usr/local/bin/

# ลบไฟล์ที่ดาวน์โหลดและไดเรกทอรีชั่วคราว
rm -rf alertmanager-0.25.0.linux-amd64.tar.gz alertmanager-0.25.0.linux-amd64

# สร้าง User สำหรับ Alertmanager
sudo useradd --no-create-home --shell /bin/false alertmanager

# กำหนดสิทธิ์
sudo chown -R alertmanager:alertmanager /etc/alertmanager
sudo chown -R alertmanager:alertmanager /var/lib/alertmanager
sudo chown alertmanager:alertmanager /usr/local/bin/alertmanager
sudo chown alertmanager:alertmanager /usr/local/bin/amtool

2. สร้างไฟล์ตั้งค่า `alertmanager.yml`

สร้างไฟล์ตั้งค่าหลักของ Alertmanager ที่ /etc/alertmanager/alertmanager.yml


# /etc/alertmanager/alertmanager.yml
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'instance']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 1h
  receiver: 'default-receiver' # กำหนด receiver หลัก

  routes:
  - match:
      severity: 'critical'
    receiver: 'critical-receiver'
  - match:
      severity: 'warning'
    receiver: 'warning-receiver'

receivers:
  - name: 'default-receiver'
    # สามารถเพิ่มการตั้งค่าสำหรับ email หรือ slack ได้ที่นี่
    # ตัวอย่างเช่น:
    # email_configs:
    #   - to: '[email protected]'
    #     send_resolved: true
    #     from: '[email protected]'
    #     smarthost: 'smtp.example.com:587'
    #     auth_username: 'user'
    #     auth_password: 'password'
    #     auth_secret: 'secret'
    #     headers:
    #       Subject: 'Prometheus Alert - {{ .GroupLabels.alertname }}'
    webhook_configs:
      - url: 'http://localhost:8080/webhook' # ตัวอย่าง Webhook ปลอม
        send_resolved: true

  - name: 'critical-receiver'
    # ตั้งค่าสำหรับ Critical alerts
    # slack_configs:
    #   - channel: '#critical-alerts'
    #     api_url: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX'
    #     send_resolved: true

  - name: 'warning-receiver'
    # ตั้งค่าสำหรับ Warning alerts
    # email_configs:
    #   - to: '[email protected]'
    #     send_resolved: true

การแจ้งเตือนผ่าน Email, Slack, Line Notify:

  • Email: ยกเลิก comment ในส่วน email_configs และกรอกข้อมูล SMTP ของคุณครับ
  • Slack: ยกเลิก comment ในส่วน slack_configs และใส่ Slack Webhook URL ของคุณ (สร้างได้จาก Slack App) ครับ
  • Line Notify: Line Notify ไม่มี Integration โดยตรงกับ Alertmanager แต่สามารถทำได้ผ่าน Webhook ครับ คุณจะต้องสร้าง Script หรือ Service เล็ก ๆ ที่รับ Webhook จาก Alertmanager แล้วส่งต่อไปยัง Line Notify API อีกทีครับ
    
            # ตัวอย่าง receiver สำหรับ Line Notify (ต้องมี proxy script มารับ webhook)
            receivers:
              - name: 'line-notify'
                webhook_configs:
                  - url: 'http://<your_webhook_proxy_server>:<port>/line-notify'
                    send_resolved: true
            

    (ต้องเขียนโปรแกรมเล็กๆ เพื่อรับ webhook จาก Alertmanager แล้วไปยิง Line Notify API อีกทีครับ)

3. สร้าง Systemd Service สำหรับ Alertmanager

สร้างไฟล์ Systemd Service ที่ /etc/systemd/system/alertmanager.service


# /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager
Wants=network-online.target
After=network-online.target

[Service]
User=alertmanager
Group=alertmanager
Type=simple
ExecStart=/usr/local/bin/alertmanager \
    --config.file /etc/alertmanager/alertmanager.yml \
    --storage.path /var/lib/alertmanager \
    --web.listen-address="0.0.0.0:9093" # Alertmanager จะเปิดพอร์ต 9093

SyslogIdentifier=alertmanager
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

4. ทดสอบการทำงาน


sudo systemctl daemon-reload
sudo systemctl enable alertmanager
sudo systemctl start alertmanager
sudo systemctl status alertmanager

ตรวจสอบที่ Web UI ของ Alertmanager (http://<your_server_ip>:9093) คุณจะเห็นหน้า Overview ของ Alertmanager ครับ

สุดท้าย ต้องกลับไปแก้ไข /etc/prometheus/prometheus.yml เพื่อบอก Prometheus ว่าจะส่ง Alert ไปหา Alertmanager ที่ไหน:


# /etc/prometheus/prometheus.yml
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - localhost:9093 # หรือ IP/Hostname ของ Alertmanager

แล้วรีสตาร์ท Prometheus อีกครั้ง:


sudo systemctl restart prometheus

ทดสอบ Alerting

เพื่อให้มั่นใจว่าระบบ Alerting ทำงานได้จริง คุณสามารถทดสอบได้หลายวิธี:

  • จำลองสถานการณ์: เช่น หยุด Service ของ Node Exporter (sudo systemctl stop node_exporter) คุณควรได้รับ Alert InstanceDown หลังจาก 1 นาที
  • ใช้ amtool: Alertmanager มี Command-line tool ชื่อ amtool ที่ใช้ในการจัดการและสร้าง Alert ชั่วคราวได้
    
            amtool alert fire --alertmanager.url=http://localhost:9093 InstanceTest --label severity=warning --annotation summary="This is a test alert"
            

    คำสั่งนี้จะส่ง Alert ชื่อ InstanceTest ไปยัง Alertmanager โดยตรงครับ

การตั้งค่า Alerting ที่ถูกต้องและมีประสิทธิภาพเป็นสิ่งสำคัญอย่างยิ่งในการรักษาความพร้อมใช้งานของระบบครับ ใช้เวลาในการปรับแต่ง Rule และ Receiver ต่าง ๆ ให้เหมาะสมกับความต้องการของทีมและองค์กรของคุณนะครับ

เทคนิคขั้นสูงสำหรับการ Monitoring ระบบขนาดใหญ่

สำหรับองค์กรที่มีระบบ Server และ Application ขนาดใหญ่ การใช้งาน Prometheus และ Grafana อาจต้องพิจารณาเทคนิคขั้นสูงเพิ่มเติม เพื่อให้ระบบ Monitoring มีประสิทธิภาพ เสถียร และรองรับการเติบโตในอนาคตครับ

Service Discovery (Consul, Kubernetes)

ในสภาพแวดล้อมที่มี Server หรือ Container เกิดขึ้นและหายไปบ่อย ๆ (Dynamic Environment) การกำหนด static_configs ใน prometheus.yml อาจไม่เหมาะสมครับ Prometheus มีความสามารถในการเชื่อมต่อกับระบบ Service Discovery ต่าง ๆ เพื่อค้นหา Target ที่จะ Scrape ได้โดยอัตโนมัติ

  • Kubernetes Service Discovery: Prometheus สามารถเชื่อมต่อกับ Kubernetes API Server เพื่อค้นหา Pods, Services, Endpoints ที่มี Annotation หรือ Label ที่กำหนดไว้ ทำให้การ Monitoring Containerized Application เป็นไปอย่างราบรื่น
  • Consul Service Discovery: Consul เป็น Service Mesh และ Service Discovery ที่นิยมใช้ใน Microservices Architecture Prometheus สามารถ Query Consul API เพื่อค้นหา Service Instances ที่ลงทะเบียนไว้
  • AWS EC2, GCE Service Discovery: สำหรับ Infrastructure บน Cloud Prometheus สามารถค้นหา Instances ที่มี Tag หรือ Label ที่กำหนดไว้ได้
  • File-based Service Discovery: สำหรับกรณีที่ไม่มี Service Discovery โดยเฉพาะ คุณสามารถสร้างไฟล์ JSON/YAML ที่ Prometheus จะอ่านเพื่อค้นหา Target ได้

การใช้ Service Discovery ช่วยลดภาระในการจัดการ Configuration ของ Prometheus และทำให้ระบบ Monitoring ปรับตัวเข้ากับการเปลี่ยนแปลงของ Infrastructure ได้โดยอัตโนมัติครับ

Federation (สำหรับ Prometheus หลายตัว)

ในบางกรณี คุณอาจมี Prometheus Server หลายตัวที่รับผิดชอบการ Monitoring ในแต่ละ Datacenter, Region, หรือ Environment ที่แตกต่างกันครับ การใช้ Prometheus Federation ช่วยให้ Prometheus Server ตัวหลัก (Global Prometheus) สามารถดึงข้อมูล Metric จาก Prometheus Server ตัวอื่น ๆ (Federated Prometheus) ได้

ข้อดีคือ:

  • รวมข้อมูลภาพรวม: Global Prometheus สามารถแสดง Dashboard ที่รวมข้อมูลจากทุกส่วนของระบบได้
  • ลดภาระ Global Prometheus: Global Prometheus ไม่จำเป็นต้อง Scrape ทุก Target ด้วยตัวเอง เพียงแค่ดึงข้อมูลสรุปจาก Federated Prometheus
  • แยกขอบเขตการทำงาน: แต่ละ Federated Prometheus ยังคงทำหน้าที่ Monitoring ในขอบเขตของตัวเองได้อย่างอิสระ

# ตัวอย่างการตั้งค่า Federation ใน prometheus.yml ของ Global Prometheus
scrape_configs:
  - job_name: 'federate'
    scrape_interval: 15s

    honor_labels: true
    metrics_path: '/federate'

    params:
      'match[]':
        - '{job="node_exporter"}' # ดึง Metric จาก job "node_exporter"
        - '{__name__=~"job:.*"}' # ดึง Metric จาก Rule-based aggregations

    static_configs:
      - targets:
        - 'federated-prometheus-1:9090' # Prometheus Server ตัวที่ 1
        - 'federated-prometheus-2:9090' # Prometheus Server ตัวที่ 2

High Availability (HA) สำหรับ Prometheus และ Alertmanager

หาก Prometheus Server หรือ Alertmanager ล่มไป ระบบ Monitoring ก็จะหยุดชะงักและไม่สามารถแจ้งเตือนได้ครับ เพื่อป้องกันปัญหานี้ การตั้งค่า High Availability (HA) จึงเป็นสิ่งสำคัญ

  • Prometheus HA: โดยทั่วไป Prometheus Server จะถูกรันแบบ Active-Passive หรือ Active-Active (สำหรับ Long-Term Storage Solution) โดยมี Prometheus Server สองตัว (หรือมากกว่า) Scrape Target เดียวกัน เพื่อให้มีตัวสำรองหากตัวใดตัวหนึ่งล่ม
  • Alertmanager HA: Alertmanager ถูกออกแบบมาให้สามารถรันในโหมด Cluster ได้ง่าย ๆ ครับ เพียงแค่ชี้ Alertmanager แต่ละ Instance ไปยัง Peer อื่น ๆ ใน Cluster มันก็จะทำงานร่วมกันเพื่อป้องกันการส่ง Alert ซ้ำซ้อน และยังคงทำงานได้แม้บาง Instance จะล่มไป
  • 
        # ตัวอย่างการรัน Alertmanager ในโหมด Cluster
        execStart=/usr/local/bin/alertmanager \
            --config.file /etc/alertmanager/alertmanager.yml \
            --storage.path /var/lib/alertmanager \
            --web.listen-address="0.0.0.0:9093" \
            --cluster.listen-address="0.0.0.0:9094" \
            --cluster.peer="alertmanager-peer-1:9094" \
            --cluster.peer="alertmanager-peer-2:9094"
        

Long-Term Storage (Thanos, Cortex)

Prometheus โดยค่าเริ่มต้นถูกออกแบบมาเพื่อเก็บข้อมูล Metric แบบระยะสั้นถึงปานกลาง (ประมาณ 15-30 วัน) ครับ หากคุณต้องการเก็บข้อมูลย้อนหลังเป็นระยะเวลานานหลายเดือนหรือหลายปี เพื่อการวิเคราะห์แนวโน้ม หรือ Compliance คุณจะต้องพึ่งพาโซลูชัน Long-Term Storage:

  • Thanos: เป็นโซลูชัน Open Source ที่ขยายความสามารถของ Prometheus ให้รองรับ Long-Term Storage และ Global Query View โดยทำงานร่วมกับ Object Storage (เช่น S3, GCS)
  • Cortex: เป็นอีกหนึ่งโซลูชัน Open Source ที่ออกแบบมาสำหรับ Multi-tenant, Highly Available, Long-Term Storage สำหรับ Prometheus Metrics โดยเฉพาะ เหมาะสำหรับผู้ให้บริการ Monitoring-as-a-Service หรือองค์กรขนาดใหญ่ที่มีหลายทีม

โซลูชันเหล่านี้ช่วยให้คุณสามารถเก็บข้อมูล Metric ได้นานขึ้น โดยไม่ต้องเพิ่มขนาดดิสก์ของ Prometheus Server มากเกินไป และยังสามารถ Query ข้อมูลจาก Prometheus Server หลายตัวพร้อมกันได้ผ่าน Single API Endpoint ครับ

Monitoring Application (JMX Exporter, cAdvisor, Blackbox Exporter)

นอกจากการ Monitoring OS Metrics ด้วย Node Exporter แล้ว เรายังสามารถ Monitoring Application เฉพาะทางได้ด้วย Exporter ที่หลากหลาย:

  • JMX Exporter: สำหรับ Java Application ที่ใช้ JMX (Java Management Extensions) เพื่อเปิดเผย Metric ภายใน JVM (Java Virtual Machine) เช่น Memory Pools, Garbage Collection, Thread Counts
  • cAdvisor: (Container Advisor) สำหรับ Monitoring Container Metrics โดยเฉพาะ (CPU, Memory, Network, Disk I/O ของแต่ละ Container) ซึ่งมักจะถูกใช้งานร่วมกับ Kubernetes
  • Blackbox Exporter: สำหรับ Probing Endpoints ต่าง ๆ (HTTP, HTTPS, TCP, ICMP) จากภายนอก เพื่อตรวจสอบความพร้อมใช้งาน (Uptime) และ Latency ของบริการจากมุมมองของผู้ใช้
  • 
        # ตัวอย่างการตั้งค่า Blackbox Exporter ใน prometheus.yml
        - job_name: 'blackbox'
          metrics_path: /probe
          params:
            module: [http_2xx]  # Module ใน blackbox.yml ที่ใช้ตรวจสอบ HTTP 200 OK
          static_configs:
            - targets:
              - http://www.google.com
              - http://your-application.com
          relabel_configs:
            - source_labels: [__address__]
              target_label: __param_target
            - source_labels: [__param_target]
              target_label: instance
            - target_label: __address__
              replacement: blackbox-exporter:9115 # ชี้ไปที่ Blackbox Exporter
        

การใช้ Exporter ที่เหมาะสมจะช่วยให้คุณได้รับข้อมูล Metric ที่ละเอียดและตรงจุดกับ Application ของคุณ ทำให้การแก้ไขปัญหาและปรับปรุงประสิทธิภาพทำได้ง่ายขึ้นครับ

อ่านเพิ่มเติมเกี่ยวกับ Exporter ยอดนิยม

เปรียบเทียบ Prometheus/Grafana กับระบบ Monitoring แบบดั้งเดิม

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

จัดส่งรวดเร็วส่งด่วนทั่วประเทศ
รับประกันสินค้าเคลมง่าย มีใบรับประกัน
ผ่อนชำระได้บัตรเครดิต 0% สูงสุด 10 เดือน
สะสมแต้ม รับส่วนลดส่วนลดและคะแนนสะสม

© 2026 SiamLancard — จำหน่ายการ์ดแลน อุปกรณ์ Server และเครื่องพิมพ์ใบเสร็จ

SiamLancard
Logo
Shopping cart
คุณสมบัติ Prometheus / Grafana (Modern Monitoring) Zabbix / Nagios (Traditional Monitoring)
สถาปัตยกรรมหลัก Pull-based (Prometheus ดึงข้อมูลจาก Target) Push-based / Agent-based (Agent บน Target ส่งข้อมูลไปยัง Server)
รูปแบบข้อมูล Time Series Metrics พร้อม Label ที่ยืดหยุ่นสูง Item/Check-based Metrics, Key-value pairs
การประมวลผล Query PromQL: ภาษา Query ที่ทรงพลังและยืดหยุ่นสูง รองรับ Aggregation, Rate, Function ทางคณิตศาสตร์ Filter, Function พื้นฐาน, SQL-like Query
Visualization Grafana: Dashboard สวยงาม, ยืดหยุ่น, รองรับ Data Source หลากหลาย, Community Dashboard จำนวนมาก Dashboard ภายในระบบ, อาจมีข้อจำกัดในการปรับแต่งและการแสดงผล
การจัดการ Alert Alertmanager: Grouping, Inhibition, Silencing, Routing ที่ซับซ้อนและยืดหยุ่น Alert Actions, Escalations, Dependencies