
ในโลกดิจิทัลที่ขับเคลื่อนด้วยข้อมูลและความเร็ว การทำงานของระบบ Server ที่มีเสถียรภาพและประสิทธิภาพสูงสุดไม่ใช่เพียงแค่ความปรารถนาอีกต่อไป แต่เป็นปัจจัยสำคัญที่ชี้วัดความสำเร็จของธุรกิจเลยก็ว่าได้ครับ การหยุดชะงักเพียงชั่วขณะอาจนำมาซึ่งความเสียหายมหาศาล ทั้งในด้านรายได้ ชื่อเสียง และความพึงพอใจของลูกค้า ด้วยเหตุนี้ การมีระบบ Monitoring ที่แข็งแกร่ง แม่นยำ และสามารถคาดการณ์ปัญหาล่วงหน้าได้ จึงเป็นหัวใจสำคัญที่องค์กรยุคใหม่ไม่อาจมองข้ามได้เลยครับ
บทความนี้จะพาคุณเจาะลึกถึงวิธีการสร้างระบบ Monitoring ระบบ Server แบบมืออาชีพ ด้วยสองเครื่องมือ Open Source ที่ทรงพลังและได้รับความนิยมอย่างกว้างขวาง นั่นคือ Prometheus สำหรับการเก็บรวบรวมข้อมูล Metrics และ Grafana สำหรับการสร้าง Dashboard แสดงผลข้อมูลที่สวยงาม เข้าใจง่าย และสามารถแจ้งเตือนได้อย่างทันท่วงที เราจะพาคุณไปสำรวจตั้งแต่แนวคิดพื้นฐาน สถาปัตยกรรม การติดตั้ง ไปจนถึงการตั้งค่าขั้นสูง และ Best Practices ต่างๆ เพื่อให้คุณสามารถนำความรู้ไปประยุกต์ใช้ในการดูแลระบบ Server ของคุณได้อย่างเต็มประสิทธิภาพ มาร่วมยกระดับการ Monitoring สู่ขั้นสูงสุดไปพร้อมกันนะครับ!
สารบัญ
- ทำไมการ Monitoring ระบบ Server จึงสำคัญในยุคปัจจุบัน?
- รู้จักกับ Prometheus: หัวใจสำคัญของการเก็บข้อมูล
- เจาะลึก Grafana: สร้าง Visualization ที่สวยงามและทรงพลัง
- เริ่มต้นติดตั้งและตั้งค่า Prometheus Server แบบ Pro
- การติดตั้งและตั้งค่า Exporter ยอดนิยม: Node Exporter
- การติดตั้งและตั้งค่า Grafana
- PromQL: ภาษา Query อันทรงพลังของ Prometheus
- Exporters ยอดนิยมอื่นๆ สำหรับการ Monitoring ที่หลากหลาย
- การตั้งค่า Alerting ด้วย Prometheus Alertmanager
- Advanced Tips และ Best Practices สำหรับ Prometheus Grafana Monitoring
- เปรียบเทียบ Prometheus Grafana กับเครื่องมือ Monitoring อื่นๆ
- Case Study (สมมติ): การนำไปใช้จริงในองค์กร
- FAQ (คำถามที่พบบ่อย)
- สรุปและก้าวต่อไปสู่การ Monitoring ระดับมืออาชีพ
ทำไมการ Monitoring ระบบ Server จึงสำคัญในยุคปัจจุบัน?
ในยุคที่ธุรกิจพึ่งพาเทคโนโลยีสารสนเทศเป็นหลัก การทำงานของระบบ Server เปรียบเสมือนหัวใจสำคัญที่ขับเคลื่อนทุกกิจกรรมครับ ไม่ว่าจะเป็นเว็บไซต์ แอปพลิเคชัน ฐานข้อมูล หรือบริการต่างๆ ล้วนต้องอาศัย Server ที่ทำงานได้อย่างราบรื่นและมีประสิทธิภาพ การละเลยการ Monitoring อาจนำมาซึ่งผลลัพธ์ที่ร้ายแรงเกินกว่าจะประเมินได้ครับ
- ป้องกันการหยุดชะงัก (Downtime Prevention): การ Monitoring ช่วยให้เราสามารถตรวจจับปัญหาที่อาจเกิดขึ้นได้ล่วงหน้า เช่น การใช้ CPU ที่สูงผิดปกติ, หน่วยความจำใกล้เต็ม, หรือพื้นที่ดิสก์เหลือน้อย ซึ่งเป็นสัญญาณเตือนว่าระบบอาจเกิดปัญหาในอนาคต หากปล่อยไว้ อาจนำไปสู่การหยุดทำงานของระบบ (Downtime) ซึ่งส่งผลกระทบโดยตรงต่อรายได้ ความน่าเชื่อถือ และภาพลักษณ์ขององค์กรครับ
- ปรับปรุงประสิทธิภาพ (Performance Optimization): ข้อมูล Metrics ที่ได้จากการ Monitoring ช่วยให้ทีมงานสามารถระบุคอขวด (Bottlenecks) ของระบบได้อย่างแม่นยำ ไม่ว่าจะเป็นส่วนของ Hardware, Software, หรือ Network ทำให้สามารถปรับแต่งหรือขยายทรัพยากรได้อย่างเหมาะสม ช่วยให้ระบบทำงานได้รวดเร็วและมีประสิทธิภาพสูงสุดอยู่เสมอครับ
- แก้ไขปัญหาอย่างรวดเร็ว (Faster Incident Resolution): เมื่อเกิดปัญหาขึ้นจริง ข้อมูลจากระบบ Monitoring จะเป็นหลักฐานสำคัญที่ช่วยให้ทีมงานสามารถวิเคราะห์สาเหตุและแก้ไขปัญหาได้อย่างรวดเร็ว ลดเวลาที่ระบบหยุดชะงักให้น้อยที่สุดครับ
- การวางแผนทรัพยากร (Capacity Planning): ด้วยข้อมูลประวัติการใช้งานทรัพยากร Server ที่แม่นยำ เราสามารถนำมาวิเคราะห์แนวโน้มการเติบโต และวางแผนการจัดสรรทรัพยากรในอนาคตได้อย่างมีประสิทธิภาพ เช่น การคาดการณ์ว่าเมื่อไหร่ควรจะเพิ่ม RAM, CPU หรือพื้นที่จัดเก็บข้อมูล เพื่อรองรับการขยายตัวของธุรกิจครับ
- ปฏิบัติตามข้อกำหนดและมาตรฐาน (Compliance and Auditing): ในบางอุตสาหกรรม การเก็บข้อมูลประสิทธิภาพและการทำงานของระบบเป็นข้อกำหนดสำคัญเพื่อการปฏิบัติตามมาตรฐาน (Compliance) หรือเพื่อวัตถุประสงค์ในการตรวจสอบ (Auditing) ซึ่งระบบ Monitoring สามารถช่วยตอบโจทย์ตรงนี้ได้เป็นอย่างดีครับ
จะเห็นได้ว่า การลงทุนในระบบ Monitoring ที่ดี ไม่ใช่แค่การแก้ปัญหาเมื่อเกิดขึ้น แต่เป็นการลงทุนเพื่อป้องกันปัญหา สร้างความเสถียร และเป็นรากฐานสำคัญในการขับเคลื่อนธุรกิจให้เติบโตอย่างยั่งยืนในระยะยาวเลยทีเดียวครับ
รู้จักกับ Prometheus: หัวใจสำคัญของการเก็บข้อมูล
Prometheus คืออะไร?
Prometheus คือระบบ Open Source Monitoring และ Alerting ที่ถูกพัฒนาขึ้นครั้งแรกโดย SoundCloud ในปี 2012 และได้ถูกบริจาคให้ Cloud Native Computing Foundation (CNCF) เป็นโครงการที่สองรองจาก Kubernetes ครับ Prometheus ได้รับการออกแบบมาเพื่อเก็บข้อมูลแบบ Time-Series Data ซึ่งหมายถึงข้อมูลที่ถูกเก็บรวบรวม ณ ช่วงเวลาต่างๆ อย่างต่อเนื่อง ทำให้เหมาะสำหรับการ Monitoring ระบบ Server, Microservices, หรือแอปพลิเคชันที่ต้องการข้อมูลประสิทธิภาพแบบ Real-time ครับ
จุดเด่นของ Prometheus คือการทำงานแบบ “Pull Model” คือตัว Prometheus Server จะเป็นฝ่าย “ดึง” ข้อมูล (scrape) จาก Endpoints ที่เรียกว่า “Exporters” ที่รันอยู่บน Server หรือแอปพลิเคชันที่เราต้องการ Monitoring ซึ่งแตกต่างจากระบบ Monitoring แบบเก่าที่มักจะใช้ “Push Model” (Agent บน Server เป็นฝ่ายส่งข้อมูลไปหา Central Server) ครับ
สถาปัตยกรรมและส่วนประกอบหลักของ Prometheus
Prometheus ประกอบด้วยส่วนประกอบหลักหลายอย่างที่ทำงานร่วมกัน เพื่อให้ระบบ Monitoring ทำงานได้อย่างสมบูรณ์แบบ:
- Prometheus Server:
- Scraper: ทำหน้าที่ดึงข้อมูล Metrics จาก Exporters หรือ Services ที่กำหนดไว้ตามช่วงเวลาที่ตั้งค่า
- Time-Series Database (TSDB): เก็บข้อมูล Metrics ที่ถูก Scrape มา โดยจัดเก็บเป็น Time-Series Data ซึ่งมีประสิทธิภาพสูงในการจัดเก็บและ Query ข้อมูลประเภทนี้
- HTTP Server: ให้บริการสำหรับ PromQL Query และแสดงผล UI พื้นฐาน
- Exporters: โปรแกรมขนาดเล็กที่รันอยู่บน Server หรือภายในแอปพลิเคชัน ทำหน้าที่แปลง Metrics ภายในระบบนั้นๆ ให้อยู่ในรูปแบบที่ Prometheus สามารถเข้าใจและ Scrape ไปได้ ตัวอย่างเช่น Node Exporter สำหรับ Server OS Metrics, MySQL Exporter สำหรับฐานข้อมูล MySQL ครับ
- Pushgateway: สำหรับกรณีที่ไม่สามารถใช้ Pull Model ได้ เช่น งาน Batch Job ที่ทำงานเพียงชั่วครู่แล้วจบลง Pushgateway จะทำหน้าที่เป็นตัวกลางให้ Batch Job ส่ง (Push) Metrics มาเก็บไว้ที่นี่ และ Prometheus Server จะมา Pull ข้อมูลจาก Pushgateway อีกทีครับ
- Alertmanager: ส่วนประกอบแยกต่างหากที่รับ Alerts จาก Prometheus Server มาประมวลผล เช่น จัดกลุ่ม Alerts, กำหนดเงื่อนไขการส่งแจ้งเตือน (Routing), และส่ง Alerts ไปยังช่องทางต่างๆ เช่น Email, Slack, PagerDuty ครับ
- Client Libraries: ชุดไลบรารีสำหรับภาษาโปรแกรมต่างๆ (เช่น Go, Java, Python, Ruby) ที่ช่วยให้นักพัฒนาสามารถ Instruments แอปพลิเคชันของตนเอง เพื่อให้แอปพลิเคชันสามารถ Expose Metrics ในรูปแบบที่ Prometheus เข้าใจได้ครับ
สถาปัตยกรรมแบบนี้ทำให้ Prometheus มีความยืดหยุ่นสูง สามารถ Monitoring ได้หลากหลายประเภท และจัดการกับระบบที่มีขนาดใหญ่และซับซ้อนได้อย่างมีประสิทธิภาพครับ
Metric Types ใน Prometheus
Prometheus มี Metric Type พื้นฐาน 4 ชนิด ที่ช่วยให้เราสามารถแสดงข้อมูลในรูปแบบที่แตกต่างกันได้อย่างเหมาะสม:
- Counter: เป็นตัวนับที่เพิ่มขึ้นเรื่อยๆ เท่านั้น ไม่มีการลดลง ค่าจะถูกรีเซ็ตเมื่อแอปพลิเคชันรีสตาร์ท เหมาะสำหรับ Metrics ที่เป็นจำนวนสะสม เช่น จำนวนคำขอทั้งหมด, จำนวนข้อผิดพลาดทั้งหมดครับ
- Gauge: เป็นค่าที่สามารถเพิ่มขึ้นหรือลดลงได้ตามเวลา เหมาะสำหรับ Metrics ที่แสดงสถานะปัจจุบัน เช่น อุณหภูมิ, จำนวนผู้ใช้งานปัจจุบัน, การใช้ CPU, หน่วยความจำที่เหลืออยู่ครับ
- Histogram: ใช้สำหรับเก็บข้อมูลตัวอย่าง (Observations) เช่น ระยะเวลาการตอบสนองของคำขอ หรือขนาดของคำขอ และจะนำข้อมูลเหล่านี้มาแบ่งเป็น Bucket (ช่วงของค่า) เพื่อคำนวณ Quantiles (เช่น p99 latency) และค่ารวมทั้งหมด (Sum) รวมถึงจำนวน Observations ทั้งหมด (Count) ช่วยให้เราเข้าใจการกระจายตัวของข้อมูลได้ดีครับ
- Summary: คล้ายกับ Histogram แต่จะทำการคำนวณ Quantiles ฝั่ง Client Side และส่งค่า Quantiles ที่คำนวณได้มาให้ Prometheus โดยตรง เหมาะสำหรับกรณีที่ต้องการ Quantiles ที่แม่นยำกว่า แต่มีข้อจำกัดเรื่องการรวมข้อมูลจากหลายๆ Instance ครับ
การเลือกใช้ Metric Type ที่เหมาะสมจะช่วยให้เราสามารถ Query และแสดงผลข้อมูลได้อย่างถูกต้องและมีประสิทธิภาพครับ
ข้อดีและข้อจำกัดของ Prometheus
ข้อดี:
- ประสิทธิภาพสูง: Time-Series Database ที่มีประสิทธิภาพสูงในการจัดเก็บและ Query ข้อมูลประเภท Time-Series
- โมเดลแบบ Pull: ง่ายต่อการจัดการและค้นหา Target ใหม่ๆ ในสภาพแวดล้อมแบบ Dynamic เช่น Kubernetes
- ภาษา PromQL ที่ทรงพลัง: สามารถ Query ข้อมูลที่ซับซ้อนและรวม Metrics ได้หลากหลายรูปแบบ
- ระบบ Alerting ที่ยืดหยุ่น: Alertmanager สามารถจัดการการแจ้งเตือนได้อย่างชาญฉลาด
- Open Source และชุมชนขนาดใหญ่: มีการพัฒนาอย่างต่อเนื่อง มี Exporters และเครื่องมือสนับสนุนจำนวนมาก
- เข้ากันได้ดีกับ Cloud Native: เป็นส่วนหนึ่งของ CNCF และทำงานได้ดีกับ Kubernetes
ข้อจำกัด:
- ขาด Long-Term Storage ในตัว: Prometheus Server ถูกออกแบบมาเพื่อเก็บข้อมูลในระยะสั้นถึงปานกลาง (ประมาณ 1-2 สัปดาห์ หรือมากกว่านั้นขึ้นอยู่กับพื้นที่ดิสก์) หากต้องการเก็บข้อมูลระยะยาวต้องใช้โซลูชันเสริม เช่น Thanos หรือ Cortex ครับ
- ไม่มี Dashboard ในตัวที่ดี: UI ของ Prometheus เน้นการ Query และ Debug เป็นหลัก ไม่ได้ออกแบบมาเพื่อแสดงผล Dashboard ที่สวยงามและครบครัน (แต่ทำงานร่วมกับ Grafana ได้ดีเยี่ยม)
- ไม่เหมาะกับการเก็บ Logs: Prometheus เน้นการเก็บ Metrics ไม่ใช่ Logs
- การทำ High Availability (HA) ค่อนข้างซับซ้อน: การทำ HA แบบ Native ค่อนข้างจำกัด ต้องพึ่งพาโซลูชันเสริมเช่นเดียวกันครับ
เจาะลึก Grafana: สร้าง Visualization ที่สวยงามและทรงพลัง
Grafana คืออะไร?
Grafana คือแพลตฟอร์ม Open Source สำหรับการวิเคราะห์และแสดงผลข้อมูล (Data Visualization) ที่ได้รับความนิยมอย่างสูงครับ Grafana ไม่ได้ทำหน้าที่เก็บข้อมูลเอง แต่จะเชื่อมต่อกับ Data Sources ต่างๆ (เช่น Prometheus, InfluxDB, Elasticsearch, MySQL, PostgreSQL) แล้วดึงข้อมูลมาแสดงผลในรูปแบบของ Dashboard ที่สวยงามและเข้าใจง่าย ช่วยให้ผู้ใช้งานสามารถมองเห็นแนวโน้ม ประสิทธิภาพ และปัญหาที่เกิดขึ้นในระบบได้อย่างรวดเร็วครับ
Grafana เป็นส่วนสำคัญที่เติมเต็มจุดอ่อนของ Prometheus ในด้านการแสดงผล ทำให้ทั้งสองเครื่องมือทำงานร่วมกันได้อย่างลงตัวและทรงพลัง กลายเป็นคู่หู (Stack) ที่นิยมใช้กันมากที่สุดสำหรับการ Monitoring ระบบในปัจจุบันครับ
คุณสมบัติเด่นของ Grafana
- รองรับ Data Sources ที่หลากหลาย: Grafana สามารถเชื่อมต่อกับ Data Sources ได้มากมาย ไม่ใช่แค่ Prometheus เท่านั้น แต่ยังรวมถึงฐานข้อมูล Time-Series อื่นๆ, SQL Databases, Log Aggregators, และ Cloud Monitoring Services ต่างๆ ครับ
- Dashboard ที่ปรับแต่งได้สูง: ผู้ใช้สามารถสร้าง Dashboard ที่มี Panel ประเภทต่างๆ เช่น Graphs, Stats, Tables, Heatmaps, Gauge, Text, ฯลฯ ได้อย่างอิสระ สามารถลากและวาง (Drag-and-drop) ปรับขนาด และปรับแต่งสีสันได้ตามต้องการ เพื่อให้ข้อมูลถูกนำเสนอในรูปแบบที่เหมาะสมที่สุดครับ
- Templating และ Variables: ช่วยให้สร้าง Dashboard ที่มีความยืดหยุ่นสูง สามารถเลือกดูข้อมูลของ Server หรือ Application ต่างๆ ได้จาก Dropdown โดยไม่ต้องสร้าง Dashboard แยกกันหลายอัน
- Alerting: นอกจากจะแสดงผลข้อมูลแล้ว Grafana ยังมีความสามารถในการตั้งค่า Alert Rules โดยตรงจาก Dashboard และส่งแจ้งเตือนไปยังช่องทางต่างๆ ได้ เช่น Email, Slack, PagerDuty, Webhooks ครับ (แม้ว่า Prometheus Alertmanager จะมีความสามารถด้าน Alerting ที่ซับซ้อนกว่า แต่ Grafana ก็มีประโยชน์ในกรณีที่ต้องการ Alert จาก Data Sources อื่นๆ หรือต้องการความง่ายในการตั้งค่าเบื้องต้น)
- Annotations: ช่วยให้สามารถเพิ่มโน้ตหรือเหตุการณ์สำคัญลงบนกราฟได้ เพื่อระบุว่าเกิดอะไรขึ้น ณ ช่วงเวลาใด เช่น การ Deploy เวอร์ชั่นใหม่, การปรับปรุงระบบ ซึ่งเป็นประโยชน์ในการวิเคราะห์สาเหตุของปัญหาครับ
- Row/Panel Linking: สามารถสร้างลิงก์จาก Panel หนึ่งไปยัง Dashboard อื่นๆ หรือ URL ภายนอกได้ ทำให้การนำทางและเจาะลึกข้อมูลเป็นไปอย่างราบรื่น
- Snapshot Sharing: สามารถแชร์ Dashboard ที่กำลังดูอยู่ไปยังผู้อื่นได้ง่ายๆ โดยการสร้าง Snapshot ที่มีข้อมูล ณ ช่วงเวลานั้นๆ
- Authentication และ Authorization: รองรับการจัดการผู้ใช้งานและสิทธิ์การเข้าถึง Dashboard อย่างละเอียด
ข้อดีและข้อจำกัดของ Grafana
ข้อดี:
- Visualization ที่ยอดเยี่ยม: สร้าง Dashboard ที่สวยงาม เข้าใจง่าย และปรับแต่งได้สูง
- รองรับ Data Sources หลากหลาย: เป็น Universal Visualization Tool ที่สามารถรวมข้อมูลจากหลายแหล่งเข้าด้วยกันได้
- ใช้งานง่าย: มี UI ที่เป็นมิตรและใช้งานง่าย ทำให้การสร้าง Dashboard ไม่ซับซ้อน
- Open Source และชุมชนขนาดใหญ่: มี Plugins และ Templates Dashboard ที่พัฒนาโดยชุมชนจำนวนมาก
- Alerting ในตัว: สามารถตั้งค่าการแจ้งเตือนได้โดยตรงจาก Dashboard
ข้อจำกัด:
- ไม่ได้เก็บข้อมูลเอง: ต้องพึ่งพา Data Source ภายนอกในการเก็บข้อมูล
- ไม่ได้ทำ Data Collection: ไม่ได้ทำหน้าที่ Scrape หรือ Push Metrics
- Alerting ไม่ซับซ้อนเท่า Alertmanager: สำหรับการจัดการ Alerts ที่ซับซ้อน เช่น การจัดกลุ่ม, การ Silence Alerts, การกำหนด Routing ตามเงื่อนไข Alertmanager จะทำได้ดีกว่าครับ
เริ่มต้นติดตั้งและตั้งค่า Prometheus Server แบบ Pro
ในส่วนนี้ เราจะมาดูขั้นตอนการติดตั้ง Prometheus Server บนระบบ Linux (เช่น Ubuntu/Debian) กันครับ โดยจะเน้นการติดตั้งแบบ Binary และการตั้งค่าพื้นฐานที่สำคัญ
เตรียมความพร้อมของ Server
ก่อนเริ่มต้นติดตั้ง ควรเตรียม Server ที่มีคุณสมบัติดังนี้ครับ:
- ระบบปฏิบัติการ: Linux (แนะนำ Ubuntu Server หรือ CentOS)
- RAM: อย่างน้อย 2GB (แนะนำ 4GB ขึ้นไปสำหรับระบบขนาดกลาง)
- CPU: 2 Cores ขึ้นไป
- พื้นที่ดิสก์: อย่างน้อย 20GB (Prometheus ใช้พื้นที่ดิสก์ในการเก็บข้อมูล Time-Series Data ซึ่งจะเพิ่มขึ้นเรื่อยๆ ตามจำนวน Metrics และระยะเวลาการเก็บข้อมูล ควรใช้ SSD เพื่อประสิทธิภาพที่ดีที่สุด)
- สิทธิ์: ผู้ใช้งานที่มีสิทธิ์
sudoหรือroot
ตรวจสอบให้แน่ใจว่า Server ของคุณมีการอัปเดตแพ็กเกจล่าสุดและติดตั้งโปรแกรมพื้นฐานที่จำเป็น:
sudo apt update
sudo apt upgrade -y
sudo apt install -y wget curl systemd
การติดตั้ง Prometheus Server
เราจะติดตั้ง Prometheus จาก Binary Package ซึ่งเป็นวิธีที่ได้รับความนิยมและง่ายต่อการอัปเดตครับ
- สร้างผู้ใช้งาน Prometheus และ Directory:
เพื่อความปลอดภัย ควรสร้างผู้ใช้งานและกลุ่มเฉพาะสำหรับ Prometheus โดยไม่มีสิทธิ์ Shell access ครับ
sudo useradd --no-create-home --shell /bin/false prometheus sudo mkdir /etc/prometheus sudo mkdir /var/lib/prometheus - ดาวน์โหลดและแตกไฟล์ Prometheus:
ไปที่หน้า Download Prometheus เพื่อดูเวอร์ชันล่าสุด ในตัวอย่างนี้จะใช้เวอร์ชันที่ ณ ปัจจุบัน (อาจมีการเปลี่ยนแปลงในอนาคตครับ)
# ตรวจสอบเวอร์ชันล่าสุดจากเว็บไซต์ wget https://github.com/prometheus/prometheus/releases/download/v2.50.1/prometheus-2.50.1.linux-amd64.tar.gz tar -xvf prometheus-2.50.1.linux-amd64.tar.gz cd prometheus-2.50.1.linux-amd64 - ย้ายไฟล์ Binary ไปยัง Path ที่ถูกต้อง:
sudo mv prometheus /usr/local/bin/ sudo mv promtool /usr/local/bin/ - ย้ายไฟล์ Configuration และ Libraries:
sudo mv consoles /etc/prometheus sudo mv console_libraries /etc/prometheusหลังจากย้ายไฟล์แล้ว กลับไปยัง Home Directory ครับ
cd .. - ตั้งค่า Ownership:
กำหนดสิทธิ์การเข้าถึงไฟล์และ Directory ให้กับผู้ใช้งาน
prometheussudo 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
การตั้งค่าไฟล์ prometheus.yml เบื้องต้น
ไฟล์ prometheus.yml คือหัวใจของการตั้งค่า Prometheus ครับ เราจะสร้างไฟล์นี้และกำหนด Job ให้ Prometheus ไป Scrape ข้อมูลจากตัวมันเองเป็นอันดับแรก
- สร้างไฟล์
prometheus.yml:sudo nano /etc/prometheus/prometheus.yml - เพิ่มเนื้อหาต่อไปนี้ลงในไฟล์:
global: scrape_interval: 15s # Scrape targets every 15 seconds. evaluation_interval: 15s # Evaluate rules every 15 seconds. # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # Uncomment and replace with your Alertmanager address # Load rules once and periodically evaluate them against the currently ingested data. rule_files: # - "first_rules.yml" # - "second_rules.yml" # A list of scrape configurations. scrape_configs: # The job name is added as a label `job=<job_name>` to all metrics scraped from this config. - job_name: "prometheus" # metrics_path defaults to /metrics # scheme defaults to http. static_configs: - targets: ["localhost:9090"] # Prometheus Server itself - ตรวจสอบความถูกต้องของไฟล์ Configuration:
promtool check config /etc/prometheus/prometheus.ymlหากไม่มีข้อผิดพลาด จะแสดงข้อความว่า
Configuration file is valid.ครับ
ตอนนี้ Prometheus Server พร้อมแล้วที่จะทำงาน แต่เราจะตั้งค่าให้มันรันเป็น Systemd Service เพื่อให้ทำงานอัตโนมัติและจัดการได้ง่ายขึ้นครับ
- สร้างไฟล์ Systemd Service:
sudo nano /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=:9090 \ --web.enable-remote-write-receiver [Install] WantedBy=multi-user.target - โหลด Systemd ใหม่และ Start Prometheus:
sudo systemctl daemon-reload sudo systemctl start prometheus sudo systemctl enable prometheus - ตรวจสอบสถานะ:
sudo systemctl status prometheusควรจะเห็นสถานะ
active (running)ครับ
ตอนนี้ Prometheus Server ของคุณกำลังทำงานอยู่ และกำลัง Scrape ข้อมูลจากตัวมันเองแล้วครับ คุณสามารถเข้าถึง Prometheus UI ได้ที่ http://<your_server_ip>:9090 ครับ
การติดตั้งและตั้งค่า Exporter ยอดนิยม: Node Exporter
หลังจากติดตั้ง Prometheus Server แล้ว ขั้นตอนต่อไปคือการติดตั้ง Exporter เพื่อดึงข้อมูล Metrics จาก Server ที่เราต้องการ Monitoring ครับ Node Exporter เป็น Exporter ยอดนิยมที่ใช้สำหรับดึงข้อมูลพื้นฐานของระบบปฏิบัติการ Linux
Node Exporter คืออะไร?
Node Exporter คือโปรแกรมที่รันอยู่บน Server ที่เราต้องการ Monitoring ทำหน้าที่รวบรวม Metrics ต่างๆ เกี่ยวกับ Hardware และ OS เช่น CPU Usage, Memory Usage, Disk I/O, Network Statistics, Disk Space, System Load Average, และอื่นๆ อีกมากมาย แล้วแปลงให้อยู่ในรูปแบบที่ Prometheus Server สามารถ Scrape ไปได้ครับ
การติดตั้ง Node Exporter
เราจะติดตั้ง Node Exporter บน Server เดียวกันกับ Prometheus Server เพื่อความง่ายในการเริ่มต้น แต่ในระบบจริง คุณจะติดตั้ง Node Exporter บน Server ทุกเครื่องที่คุณต้องการ Monitoring ครับ
- สร้างผู้ใช้งาน Node Exporter และ Directory:
sudo useradd --no-create-home --shell /bin/false node_exporter - ดาวน์โหลดและแตกไฟล์ Node Exporter:
ไปที่หน้า Node Exporter Releases เพื่อดูเวอร์ชันล่าสุด
# ตรวจสอบเวอร์ชันล่าสุดจากเว็บไซต์ wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz tar -xvf node_exporter-1.7.0.linux-amd64.tar.gz cd node_exporter-1.7.0.linux-amd64 - ย้ายไฟล์ Binary ไปยัง Path ที่ถูกต้อง:
sudo mv node_exporter /usr/local/bin/กลับไปยัง Home Directory
cd .. - ตั้งค่า Ownership:
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter - สร้างไฟล์ Systemd Service สำหรับ Node Exporter:
sudo nano /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=":9100" \ --collector.textfile.directory="/var/lib/node_exporter/textfile_collector" # Optional: for custom metrics [Install] WantedBy=multi-user.target - โหลด Systemd ใหม่และ Start Node Exporter:
sudo systemctl daemon-reload sudo systemctl start node_exporter sudo systemctl enable node_exporter - ตรวจสอบสถานะ:
sudo systemctl status node_exporterควรจะเห็นสถานะ
active (running)ครับ
ตอนนี้ Node Exporter กำลังทำงานอยู่บนพอร์ต 9100 คุณสามารถเข้าถึง Metrics ได้ที่ http://<your_server_ip>:9100/metrics ครับ
การเพิ่ม Node Exporter เป็น Target ใน Prometheus
เมื่อ Node Exporter ทำงานแล้ว เราต้องบอกให้ Prometheus Server รู้ว่าจะไป Scrape ข้อมูลจากที่ไหนครับ
- แก้ไขไฟล์
prometheus.yml:sudo nano /etc/prometheus/prometheus.yml - เพิ่ม Job สำหรับ Node Exporter ในส่วน
scrape_configs:scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: "node_exporter" # ชื่อ Job static_configs: - targets: ["localhost:9100"] # IP และ Port ของ Node Exporterในกรณีที่คุณมี Node Exporter รันอยู่บน Server อื่น ให้เปลี่ยน
localhostเป็น IP Address ของ Server นั้นๆ ครับ - ตรวจสอบความถูกต้องของไฟล์ Configuration:
promtool check config /etc/prometheus/prometheus.yml - รีโหลด Prometheus Server:
sudo systemctl reload prometheusคุณสามารถตรวจสอบ Target ที่ Prometheus กำลัง Scrape ได้ที่ Prometheus UI โดยไปที่เมนู
Status->Targetsครับ ควรจะเห็นprometheusและnode_exporterเป็นสถานะUPครับ
เยี่ยมมากครับ! ตอนนี้ Prometheus Server ของคุณกำลัง Scrape ข้อมูลทั้งจากตัวมันเองและจาก Node Exporter แล้วครับ ขั้นตอนต่อไปคือการติดตั้ง Grafana เพื่อนำข้อมูลเหล่านี้มาแสดงผลในรูปแบบ Dashboard ที่สวยงามครับ
การติดตั้งและตั้งค่า Grafana
Grafana คือส่วนสำคัญที่จะเปลี่ยนข้อมูลตัวเลขดิบๆ ให้กลายเป็น Dashboard ที่มีชีวิตชีวาและเข้าใจง่ายครับ มาเริ่มติดตั้ง Grafana กันเลย
การติดตั้ง Grafana
เราจะติดตั้ง Grafana โดยใช้ APT Package Manager ซึ่งเป็นวิธีที่แนะนำสำหรับ Debian/Ubuntu ครับ
- ติดตั้ง Package ที่จำเป็น:
sudo apt install -y apt-transport-https software-properties-common wget - เพิ่ม GPG Key ของ Grafana:
wget -q -O - https://apt.grafana.com/gpg.key | sudo gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null - เพิ่ม Repository ของ Grafana:
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list - อัปเดต Package List และติดตั้ง Grafana:
sudo apt update sudo apt install grafana -y - เริ่มและเปิดใช้งาน Grafana Service:
sudo systemctl daemon-reload sudo systemctl start grafana-server sudo systemctl enable grafana-server - ตรวจสอบสถานะ:
sudo systemctl status grafana-serverควรจะเห็นสถานะ
active (running)ครับ
Grafana จะรันบนพอร์ต 3000 โดยค่าเริ่มต้น คุณสามารถเข้าถึง Grafana UI ได้ที่ http://<your_server_ip>:3000 ครับ
ข้อมูลเข้าสู่ระบบเริ่มต้น:
- Username:
admin - Password:
admin
เมื่อเข้าสู่ระบบครั้งแรก Grafana จะขอให้คุณเปลี่ยนรหัสผ่านเพื่อความปลอดภัยครับ
การเพิ่ม Prometheus เป็น Data Source ใน Grafana
หลังจากติดตั้ง Grafana แล้ว ขั้นตอนต่อไปคือการเชื่อมต่อ Grafana เข้ากับ Prometheus Server ของเรา เพื่อให้ Grafana สามารถดึงข้อมูล Metrics มาแสดงผลได้ครับ
- เข้าสู่ระบบ Grafana: ไปที่
http://<your_server_ip>:3000และเข้าสู่ระบบด้วยadmin/admin(แล้วเปลี่ยนรหัสผ่าน) - เพิ่ม Data Source:
- ที่เมนูด้านซ้ายมือ คลิกที่ไอคอน
Connections(รูปปลั๊กไฟ) หรือAdministration(รูปเฟือง) >Data sources - คลิกปุ่ม
Add new data source - เลือก
Prometheus
- ที่เมนูด้านซ้ายมือ คลิกที่ไอคอน
- ตั้งค่า Prometheus Data Source:
- Name: ตั้งชื่อ Data Source ของคุณ เช่น
Prometheus_Local - URL: ใส่ URL ของ Prometheus Server ของคุณ ในกรณีนี้คือ
http://localhost:9090(ถ้า Grafana รันอยู่บน Server เดียวกันกับ Prometheus) หรือhttp://<prometheus_server_ip>:9090 - Access: เลือก
Server (default) - ตั้งค่าอื่นๆ ตามความเหมาะสม (ส่วนใหญ่ค่าเริ่มต้นก็เพียงพอครับ)
- คลิกปุ่ม
Save & testหากการเชื่อมต่อสำเร็จ จะเห็นข้อความData source is workingครับ
- Name: ตั้งชื่อ Data Source ของคุณ เช่น
ตอนนี้ Grafana ของคุณเชื่อมต่อกับ Prometheus Server เรียบร้อยแล้ว พร้อมที่จะสร้าง Dashboard แล้วครับ!
สร้าง Dashboard แรกของคุณด้วย Grafana
มาสร้าง Dashboard ง่ายๆ เพื่อแสดงผล Metrics จาก Node Exporter กันครับ
- สร้าง Dashboard ใหม่:
- ที่เมนูด้านซ้ายมือ คลิกที่ไอคอน
Dashboards(รูปสี่เหลี่ยม) >New dashboard - คลิก
Add visualization
- ที่เมนูด้านซ้ายมือ คลิกที่ไอคอน
- เลือก Data Source และ Query Metrics:
- ในหน้า Panel Editor ที่เปิดขึ้นมา ให้เลือก Data Source เป็น
Prometheus_Local(ชื่อ Data Source ที่คุณตั้งไว้) - ในช่อง
Query(A) เราจะใส่ PromQL เพื่อดึงข้อมูล CPU Usage ตัวอย่าง: - CPU Usage (Idle):
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)หรือถ้าต้องการ CPU Usage รวม (Busy):
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)อธิบาย PromQL:
node_cpu_seconds_total: Metric ที่นับจำนวนวินาทีที่ CPU ทำงานในแต่ละโหมด{mode="idle"}: เลือกเฉพาะ CPU ที่อยู่ในโหมด Idle[5m]: คำนวณ Rate ในช่วง 5 นาทีที่ผ่านมาrate(...): คำนวณอัตราการเปลี่ยนแปลงต่อวินาทีavg by (instance): หาค่าเฉลี่ยของแต่ละ Instance (Server)100 - (...) * 100: แปลงค่าเป็นเปอร์เซ็นต์ของ CPU Usage
- Memory Usage:
100 - ((node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100)อธิบาย PromQL:
node_memory_MemAvailable_bytes: หน่วยความจำที่พร้อมใช้งานnode_memory_MemTotal_bytes: หน่วยความจำทั้งหมด(MemAvailable / MemTotal) * 100: คำนวณเปอร์เซ็นต์หน่วยความจำที่พร้อมใช้งาน แล้วนำ 100 มาลบเพื่อให้ได้เปอร์เซ็นต์ที่ใช้ไป
- Disk Space Usage (Root Partition):
100 - (node_filesystem_avail_bytes{fstype="ext4", mountpoint="/"} / node_filesystem_size_bytes{fstype="ext4", mountpoint="/"}) * 100อธิบาย PromQL:
node_filesystem_avail_bytes: พื้นที่ดิสก์ที่เหลืออยู่node_filesystem_size_bytes: พื้นที่ดิสก์ทั้งหมด{fstype="ext4", mountpoint="/"}: กรองเฉพาะ File System ประเภท ext4 และ Mount Point เป็น root (/)
- ในหน้า Panel Editor ที่เปิดขึ้นมา ให้เลือก Data Source เป็น
- ปรับแต่ง Panel:
- เลือกประเภท Panel ที่ต้องการ (เช่น Graph, Stat, Gauge)
- ตั้งชื่อ Panel ในช่อง
Title - ในแท็บ
Panel optionsหรือField(ขึ้นอยู่กับ Grafana version) สามารถปรับแต่ง Unit, Min/Max values, Thresholds, Colors ได้ครับ - คลิก
Applyที่มุมขวาบน
- บันทึก Dashboard:
- เมื่อพอใจกับ Dashboard แล้ว คลิกปุ่ม
Save dashboard(รูปแผ่นดิสก์) ที่ด้านบน - ตั้งชื่อ Dashboard ของคุณ เช่น
Server Overview - คลิก
Save
- เมื่อพอใจกับ Dashboard แล้ว คลิกปุ่ม
คุณสามารถเพิ่ม Panel อื่นๆ ได้อีกมากมาย เพื่อสร้าง Dashboard ที่สมบูรณ์แบบสำหรับ Monitoring Server ของคุณครับ สำหรับผู้เริ่มต้น การใช้ Dashboard Template ที่มีอยู่แล้วจาก Grafana Labs ก็เป็นวิธีที่ดีในการเริ่มต้นครับ เพียงแค่ Import Dashboard ID เข้ามาใช้งานได้เลย
PromQL: ภาษา Query อันทรงพลังของ Prometheus
PromQL (Prometheus Query Language) คือภาษาที่ใช้ในการ Query ข้อมูลจาก Prometheus Time-Series Database ครับ เป็นภาษาที่ยืดหยุ่นและทรงพลัง สามารถดึงข้อมูล ดำเนินการทางคณิตศาสตร์ กรองข้อมูล และรวมข้อมูล Metrics ได้หลากหลายรูปแบบ ทำให้เราสามารถสร้าง Queries ที่ซับซ้อนเพื่อวิเคราะห์ประสิทธิภาพของระบบได้อย่างลึกซึ้งครับ
โครงสร้างพื้นฐานของ PromQL
PromQL Query พื้นฐานประกอบด้วย:
- Metric Name: ชื่อของ Metric ที่ต้องการ Query เช่น
node_cpu_seconds_total - Label Selectors: ใช้ในการกรองข้อมูลโดยใช้ Label/Value Pairs ที่แนบมากับ Metric นั้นๆ โดยใช้เครื่องหมาย
{}เช่น{job="node_exporter", instance="localhost:9100"} - Range Vector Selector (Optional): ใช้สำหรับเลือกข้อมูลในช่วงเวลาที่ผ่านมา โดยใช้เครื่องหมาย
[]เช่น[5m]สำหรับ 5 นาที,[1h]สำหรับ 1 ชั่วโมง
ตัวอย่าง:
node_cpu_seconds_total{mode="idle", instance="localhost:9100"}[5m]
Query นี้จะเลือก Metric node_cpu_seconds_total ที่มี Label mode เป็น idle และ instance เป็น localhost:9100 ในช่วง 5 นาทีที่ผ่านมา
Operators และ Functions ที่สำคัญ
PromQL มี Operators และ Functions มากมายที่ช่วยให้เราสามารถประมวลผลข้อมูลได้:
- Arithmetic Operators:
+,-,*,/,%,^ - Comparison Operators:
==,!=,>,>=,<,<= - Logical Operators:
and,or,unless - Aggregation Operators:
sum(),avg(),count(),min(),max(),stddev(),stdvar(),group(),topk(),bottomk() - Functions:
rate(),irate(): คำนวณอัตราการเปลี่ยนแปลงต่อวินาทีของ Counterincrease(): คำนวณการเพิ่มขึ้นทั้งหมดของ Counter ในช่วงเวลาที่กำหนดdelta(): คำนวณการเปลี่ยนแปลงของ Gaugederiv(): คำนวณอนุพันธ์เชิงเส้นของ Gaugehistogram_quantile(): คำนวณ Quantiles จาก Histogram Metricssum by (...),avg by (...): รวมข้อมูลตาม Label ที่กำหนดlabel_replace(): แก้ไขหรือเพิ่ม Labeltime(): ได้ค่า Unix timestamp ปัจจุบันabsent(): ตรวจสอบว่า Metric ไม่มีอยู่
ตัวอย่าง PromQL สำหรับการ Monitoring ระบบ Server
นี่คือตัวอย่าง PromQL ที่ใช้งานได้จริงและเป็นประโยชน์สำหรับการ Monitoring Server ครับ
1. CPU Usage (Top 5 Server ที่ใช้ CPU สูงสุด):
topk(5, 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100))
คำอธิบาย: คล้ายกับตัวอย่างก่อนหน้า แต่ใช้ topk(5, ...) เพื่อแสดง 5 Server ที่มี CPU Usage สูงสุดครับ
2. Memory Usage (Percent):
100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes))
คำอธิบาย: คำนวณเปอร์เซ็นต์ของหน่วยความจำที่ใช้งานอยู่
3. Disk Space Usage (Root Partition, Percent):
100 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100
คำอธิบาย: คำนวณเปอร์เซ็นต์พื้นที่ดิสก์ที่ใช้ไปของ Partition Root
4. Network Traffic (Incoming Bytes per second):
sum by (instance, device) (rate(node_network_receive_bytes_total[5m]))
คำอธิบาย: คำนวณอัตราการรับข้อมูลเข้า (Incoming) เป็น bytes ต่อวินาที โดยแยกตาม instance และ device (interface) ครับ
5. Number of Running Processes:
node_processes_running
คำอธิบาย: แสดงจำนวน Process ที่กำลังทำงานอยู่
6. Load Average (1-minute):
node_load1
คำอธิบาย: แสดงค่า Load Average ใน 1 นาที
7. Uptime ของ Server (เป็นวินาที):
node_boot_time_seconds
คำอธิบาย: แสดง Unix timestamp ที่ Server เริ่มทำงาน คุณสามารถใช้ time() - node_boot_time_seconds เพื่อหา Uptime เป็นวินาทีได้
การเรียนรู้ PromQL เป็นสิ่งสำคัญมากในการใช้งาน Prometheus และ Grafana ให้เกิดประโยชน์สูงสุดครับ ยิ่งคุณเข้าใจ PromQL มากเท่าไหร่ คุณก็จะสามารถสร้าง Dashboard และ Alert ที่ตอบโจทย์ความต้องการได้อย่างแม่นยำมากขึ้นเท่านั้นครับ อ่านเพิ่มเติมเกี่ยวกับ PromQL
Exporters ยอดนิยมอื่นๆ สำหรับการ Monitoring ที่หลากหลาย
Prometheus Ecosystem มี Exporters จำนวนมากที่พัฒนาโดยชุมชน ทำให้เราสามารถ Monitoring ได้เกือบทุกอย่างครับ นอกจาก Node Exporter แล้ว ยังมี Exporters ยอดนิยมอื่นๆ ที่ควรทราบ:
cAdvisor (Container Advisor)
- วัตถุประสงค์: ใช้สำหรับ Monitoring ทรัพยากรและประสิทธิภาพของ Docker Containers
- Metrics ที่เก็บ: CPU, Memory, Network, Disk I/O ของแต่ละ Container
- การใช้งาน: มักจะรันเป็น Container เอง และ Expose Metrics บนพอร์ต 8080 หรือ 9000
- เหมาะสำหรับ: ระบบที่ใช้ Docker หรือ Kubernetes เป็นอย่างยิ่ง
# ตัวอย่างการรัน cAdvisor ด้วย Docker
sudo docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:rw \
--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/cadvisor/cadvisor:latest
Blackbox Exporter
- วัตถุประสงค์: ใช้สำหรับ Probing (ตรวจสอบ) Endpoints ผ่านโปรโตคอลต่างๆ เช่น HTTP, HTTPS, TCP, ICMP เพื่อตรวจสอบสถานะการทำงานและความพร้อมใช้งานจากภายนอก
- Metrics ที่เก็บ: เวลาในการตอบสนอง, สถานะ HTTP Code, การเชื่อมต่อ TCP สำเร็จหรือไม่
- การใช้งาน: Prometheus Scrape Blackbox Exporter และส่ง Target ที่ต้องการ Probe ไปให้ Blackbox Exporter ทำงานแทน
- เหมาะสำหรับ: ตรวจสอบว่าเว็บไซต์หรือบริการภายนอกทำงานได้ปกติหรือไม่, ตรวจสอบ Cert หมดอายุ
# ตัวอย่างการตั้งค่า Blackbox Exporter ใน prometheus.yml
scrape_configs:
- job_name: "blackbox"
metrics_path: /probe
params:
module: [http_2xx] # กำหนด module ที่ใช้ในการ probe (เช่น http_2xx, tcp_connect)
static_configs:
- targets:
- "http://siamlancard.com"
- "https://google.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
Database Exporters (MySQL, PostgreSQL)
- วัตถุประสงค์: เก็บ Metrics จากฐานข้อมูลต่างๆ
- Metrics ที่เก็บ: จำนวนการเชื่อมต่อ, Queries per second, Locked tables, Replication lag, etc.
- การใช้งาน: ติดตั้ง Exporter บน Server เดียวกันกับฐานข้อมูล หรือบน Server อื่นที่สามารถเชื่อมต่อฐานข้อมูลได้
- เหมาะสำหรับ: Monitoring ประสิทธิภาพและความเสถียรของฐานข้อมูล
# ตัวอย่างการรัน MySQL Exporter ด้วย Docker
sudo docker run -d \
--name mysql-exporter \
-p 9104:9104 \
-e DATA_SOURCE_NAME="user:password@(host:port)/" \
prom/mysqld-exporter
หมายเหตุ: ต้องสร้างผู้ใช้งานฐานข้อมูลที่มีสิทธิ์ READ-ONLY สำหรับ Exporter เพื่อความปลอดภัยครับ
Custom Exporters
หากไม่มี Exporter ที่ตรงกับความต้องการ คุณสามารถเขียน Custom Exporter ของคุณเองได้ครับ โดยใช้ Client Libraries ที่ Prometheus มีให้สำหรับภาษาโปรแกรมต่างๆ (Go, Python, Java, Ruby, Node.js) เพื่อ Expose Metrics ในรูปแบบที่ Prometheus เข้าใจได้บน HTTP Endpoint ของคุณเองครับ
การมี Exporter ที่หลากหลายทำให้ Prometheus Grafana Stack สามารถครอบคลุมการ Monitoring ได้ทุกส่วนของระบบ ตั้งแต่ระดับ Hardware, OS, Container, แอปพลิเคชัน, ไปจนถึงบริการภายนอกเลยครับ
การตั้งค่า Alerting ด้วย Prometheus Alertmanager
การ Monitoring จะไม่สมบูรณ์หากไม่มีระบบแจ้งเตือนที่ดีครับ Prometheus Alertmanager คือส่วนประกอบที่แยกออกมาจาก Prometheus Server โดยเฉพาะสำหรับจัดการ Alerts ครับ
หลักการทำงานของ Alertmanager
Prometheus Server จะประเมิน Alert Rules ที่กำหนดไว้ หากเงื่อนไขของ Alert เป็นจริง Prometheus จะส่ง Alerts ไปยัง Alertmanager ครับ
Alertmanager จะทำหน้าที่:
- Grouping: จัดกลุ่ม Alerts ที่คล้ายกันให้เป็น Alert เดียว เพื่อลดจำนวนการแจ้งเตือน (เช่น ถ้ามี Server 10 เครื่อง CPU สูงพร้อมกัน จะส่งแค่ Alert เดียว)
- Inhibition: ระงับการส่ง Alert ที่ไม่จำเป็น (เช่น ถ้า Server ดาวน์ ไม่ต้องส่ง Alert ว่า Disk เต็ม)
- Silences: ผู้ใช้สามารถตั้งค่าเพื่อปิดการแจ้งเตือนชั่วคราวได้ (เช่น ช่วง Maintenance)
- Routing: กำหนดว่าจะส่ง Alert ไปยัง Receiver (ช่องทางแจ้งเตือน) ใด โดยใช้เงื่อนไขจาก Label ของ Alerts
- Sending: ส่ง Alerts ไปยังช่องทางที่กำหนด เช่น Email, Slack, PagerDuty, Webhooks ครับ
การติดตั้งและตั้งค่า Alertmanager
การติดตั้ง Alertmanager จะคล้ายกับการติดตั้ง Prometheus Server ครับ
- สร้างผู้ใช้งาน Alertmanager และ Directory:
sudo useradd --no-create-home --shell /bin/false alertmanager sudo mkdir /etc/alertmanager sudo mkdir /var/lib/alertmanager - ดาวน์โหลดและแตกไฟล์ Alertmanager:
ไปที่หน้า Download Alertmanager เพื่อดูเวอร์ชันล่าสุด
wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz tar -xvf alertmanager-0.27.0.linux-amd64.tar.gz cd alertmanager-0.27.0.linux-amd64 - ย้ายไฟล์ Binary:
sudo mv alertmanager /usr/local/bin/ sudo mv amtool /usr/local/bin/กลับไปยัง Home Directory
cd .. - ตั้งค่า Ownership:
sudo chown alertmanager:alertmanager /usr/local/bin/alertmanager sudo chown alertmanager:alertmanager /usr/local/bin/amtool - สร้างไฟล์
alertmanager.yml:นี่คือไฟล์ Configuration หลักสำหรับ Alertmanager ครับ
sudo nano /etc/alertmanager/alertmanager.yml - เพิ่มเนื้อหาต่อไปนี้ลงในไฟล์ (ตัวอย่างการส่งแจ้งเตือนไป Slack):
global: resolve_timeout: 5m route: group_by: ['alertname', 'cluster', 'service'] group_wait: 30s group_interval: 5m repeat_interval: 1h receiver: 'default-receiver' receivers: - name: 'default-receiver' email_configs: - to: '[email protected]' # เปลี่ยนเป็นอีเมลของคุณ send_resolved: true slack_configs: - api_url: 'https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX' # เปลี่ยนเป็น Slack Webhook URL ของคุณ channel: '#alerts' # เปลี่ยนเป็นชื่อ Channel ของ Slack send_resolved: true title: '{{ .CommonLabels.alertname }}' text: '{{ .CommonAnnotations.summary }}\n{{ .CommonAnnotations.description }}' # username: 'Alertmanager' # icon_emoji: ':warning:' # inhibition_rules: # - target_match: # severity: 'critical' # source_match: # severity: 'warning' # equal: ['alertname', 'instance']สำคัญ: คุณต้องเปลี่ยน
api_urlของ Slack เป็น Webhook URL จริงๆ ของคุณ และtoเป็นอีเมลของคุณครับ - สร้างไฟล์ Systemd Service สำหรับ Alertmanager:
sudo nano /etc/systemd/system/alertmanager.service - เพิ่มเนื้อหาต่อไปนี้ลงในไฟล์:
[Unit] Description=Prometheus 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=:9093 [Install] WantedBy=multi-user.target - โหลด Systemd ใหม่และ Start Alertmanager:
sudo systemctl daemon-reload sudo systemctl start alertmanager sudo systemctl enable alertmanager - ตรวจสอบสถานะ:
sudo systemctl status alertmanagerควรจะเห็นสถานะ
active (running)ครับ
คุณสามารถเข้าถึง Alertmanager UI ได้ที่ http://<your_server_ip>:9093 ครับ
การกำหนด Alert Rules ใน Prometheus
Alert Rules จะถูกกำหนดในไฟล์แยกต่างหากใน Prometheus Server ครับ
- สร้าง Directory สำหรับ Rules:
sudo mkdir /etc/prometheus/rules - สร้างไฟล์ Rule:
sudo nano /etc/prometheus/rules/server_alerts.yml - เพิ่ม Alert Rules (ตัวอย่าง CPU Usage สูง และ Disk Space ต่ำ):
groups:
- name: server_alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "CPU Usage is high on instance {{ $labels.instance }}"
description: "CPU usage on {{ $labels.instance }} has been over 80% for the last 5 minutes."- alert: DiskSpaceLow
expr: (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 10 for: 10m labels: severity: critical annotations: summary: "Disk space is low on instance {{ $labels.instance }}" description: "Disk space on {{ $labels.instance }} (mountpoint: {{ $labels.mountpoint }}) is less than 10