เก็บเมตริกเซิร์ฟเวอร์ด้วย Prometheus และ Node Exporter
Prometheus เป็นมาตรฐานที่ใช้กันแพร่หลายที่สุดสำหรับการเก็บเมตริกของเซิร์ฟเวอร์ จุดแข็งคือรูปแบบข้อมูลที่ค้นย้อนหลังได้ด้วยภาษา PromQL และระบบแจ้งเตือนที่เขียนเงื่อนไขซับซ้อนได้ ต่างจากระบบที่ดูได้อย่างเดียว
คู่มือนี้ติดตั้งสองส่วน คือ Node Exporter ที่ติดบนทุกเครื่องที่ต้องการวัดผล และ Prometheus ที่ทำหน้าที่ดึงข้อมูลมาเก็บ จากนั้นเขียนกฎแจ้งเตือนพื้นฐานที่ควรมีทุกระบบ
สิ่งที่ต้องเตรียม
- เซิร์ฟเวอร์อย่างน้อยหนึ่งเครื่องสำหรับรัน Prometheus และเครื่องที่ต้องการเฝ้าดู
- สิทธิ์
sudoและเครือข่ายภายในที่เครื่อง Prometheus เข้าถึงเครื่องอื่นได้ - พื้นที่ดิสก์สำหรับเก็บข้อมูล ประมาณ 2-3 GB ต่อเครื่องต่อเดือนที่ความถี่ 15 วินาที
ขั้นตอนที่ 1: ติดตั้ง Node Exporter บนเครื่องที่ต้องการวัด
cd /tmp
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xzf node_exporter-1.8.2.linux-amd64.tar.gz
sudo mv node_exporter-1.8.2.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /usr/sbin/nologin node_exporter
สร้าง service
sudo nano /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address=10.0.0.11:9100 \
--collector.systemd \
--collector.processes
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
curl -s http://10.0.0.11:9100/metrics | head -20
ระบุ IP ภายในใน --web.listen-address เสมอ อย่าปล่อยให้ฟังทุกการ์ดเครือข่าย เพราะหน้านี้เปิดเผยข้อมูลของเครื่องโดยไม่มีการยืนยันตัวตน
ปิดกั้นเพิ่มด้วย Firewall ให้เข้าได้เฉพาะจากเครื่อง Prometheus
sudo ufw allow from 10.0.0.5 to any port 9100 proto tcp
ขั้นตอนที่ 2: ติดตั้ง Prometheus
cd /tmp
curl -LO https://github.com/prometheus/prometheus/releases/download/v2.53.1/prometheus-2.53.1.linux-amd64.tar.gz
tar xzf prometheus-2.53.1.linux-amd64.tar.gz
cd prometheus-2.53.1.linux-amd64
sudo useradd --no-create-home --shell /usr/sbin/nologin prometheus
sudo mkdir -p /etc/prometheus /var/lib/prometheus
sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus /var/lib/prometheus
ขั้นตอนที่ 3: ตั้งค่าว่าจะดึงข้อมูลจากที่ไหน
sudo nano /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
- /etc/prometheus/rules/*.yml
scrape_configs:
- job_name: prometheus
static_configs:
- targets: ['127.0.0.1:9090']
- job_name: node
static_configs:
- targets:
- '10.0.0.11:9100'
- '10.0.0.12:9100'
labels:
env: production
- targets:
- '10.0.0.21:9100'
labels:
env: staging
ตรวจไวยากรณ์ก่อนเสมอ
promtool check config /etc/prometheus/prometheus.yml
ขั้นตอนที่ 4: สร้าง service ของ Prometheus
sudo nano /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus
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/ \
--storage.tsdb.retention.time=90d \
--web.listen-address=127.0.0.1:9090
Restart=on-failure
[Install]
WantedBy=multi-user.target
sudo mkdir -p /etc/prometheus/rules
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
sudo systemctl status prometheus --no-pager
เข้าหน้าเว็บผ่าน SSH Tunnel
ssh -L 9090:127.0.0.1:9090 [email protected] -N
เปิด http://127.0.0.1:9090/targets ทุกเป้าหมายควรขึ้นสถานะ UP
ขั้นตอนที่ 5: คำสั่ง PromQL ที่ใช้บ่อย
ลองพิมพ์ในช่องค้นหาของหน้าเว็บ
# การใช้งาน CPU เป็นเปอร์เซ็นต์
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# หน่วยความจำที่ใช้ไปเป็นเปอร์เซ็นต์
100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)
# พื้นที่ดิสก์ที่เหลือเป็นเปอร์เซ็นต์
100 * node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}
# ทราฟฟิกขาเข้าเป็น Mbps
rate(node_network_receive_bytes_total{device!="lo"}[5m]) * 8 / 1000000
# เวลาที่เครื่องทำงานต่อเนื่อง
(time() - node_boot_time_seconds) / 86400
จุดที่ต้องเข้าใจคือ rate() ใช้กับตัวนับที่เพิ่มขึ้นเรื่อย ๆ เท่านั้น ไม่ใช้กับค่าที่ขึ้นลงได้ เช่น หน่วยความจำ
ขั้นตอนที่ 6: เขียนกฎแจ้งเตือนพื้นฐาน
sudo nano /etc/prometheus/rules/node.yml
groups:
- name: node
rules:
- alert: InstanceDown
expr: up{job="node"} == 0
for: 3m
labels:
severity: critical
annotations:
summary: "เครื่อง {{ $labels.instance }} ไม่ตอบสนอง"
- alert: DiskWillFillIn24Hours
expr: predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 24*3600) < 0
for: 30m
labels:
severity: warning
annotations:
summary: "ดิสก์ของ {{ $labels.instance }} จะเต็มภายใน 24 ชั่วโมง"
- alert: HighMemoryUsage
expr: 100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) > 90
for: 10m
labels:
severity: warning
annotations:
summary: "หน่วยความจำของ {{ $labels.instance }} เกิน 90%"
promtool check rules /etc/prometheus/rules/node.yml
sudo systemctl reload prometheus
กฎ predict_linear คือสิ่งที่ระบบเฝ้าดูแบบเดิมทำไม่ได้ มันคาดการณ์จากแนวโน้ม 6 ชั่วโมงที่ผ่านมาว่าอีก 24 ชั่วโมงดิสก์จะเต็มหรือไม่ ทำให้มีเวลาแก้ก่อนเกิดปัญหาจริง
ขั้นตอนที่ 7: ต่อกับ Grafana
Prometheus แสดงกราฟได้พื้นฐานเท่านั้น สำหรับ Dashboard ที่ดูจริงจังให้ต่อกับ Grafana แล้วนำเข้า Dashboard สำเร็จรูปหมายเลข 1860 ซึ่งออกแบบมาสำหรับ Node Exporter โดยเฉพาะ ดูขั้นตอนได้ในคู่มือเรื่องการติดตั้ง Grafana
ปัญหาที่พบบ่อย
เป้าหมายขึ้นสถานะ DOWN พร้อมข้อความ connection refused
ตรวจว่า Node Exporter ฟังที่ IP ที่เข้าถึงได้จริงด้วย sudo ss -tlnp | grep 9100 และตรวจ Firewall ทั้งสองฝั่ง
ข้อมูลหายเป็นช่วง
มักเกิดจาก Prometheus ดึงข้อมูลไม่ทันเพราะเป้าหมายตอบช้า เพิ่ม scrape_timeout หรือลดความถี่ลง และดูที่หน้า Targets ว่าค่า Last Scrape Duration สูงผิดปกติหรือไม่
ดิสก์เต็มเพราะข้อมูลเมตริก
ลด --storage.tsdb.retention.time ลง หรือกำหนดเพดานด้วย --storage.tsdb.retention.size=50GB ตรวจขนาดจริงด้วย sudo du -sh /var/lib/prometheus
Query ช้ามากเมื่อเลือกช่วงเวลากว้าง
หลีกเลี่ยงการใช้ rate() กับช่วงสั้นบนข้อมูลย้อนหลังหลายเดือน ใช้ Recording Rule สร้างเมตริกที่คำนวณไว้ล่วงหน้าแทน
ต้องการวางระบบเฝ้าระวังแบบครบวงจรพร้อมทีมดูแล ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/
- Categories:
- Cloud
- Tags:
- Cloud
- Cloud Server
หมวดหมู่ที่น่าสนใจ
- Account Settings
- AD Server
- AI
- Alibaba Cloud
- Anti-Spam Gateway
- AWS Amazon Web Services
- Campaign
- CentOS/AlmaLinux
- Cloud
- Cloud Backup
- Cloud Communication
- Cloud Migration
- Cloud Security
- Cloud Server Management
- Cloud Solution
- Cloud Solution for Government
- Cloud Solutions by Industry
- Cloud Storage
- Cloud VPS App Plus +
- Cloud VPS DirectAdmin
- Cloud VPS Plesk
- CSR
- Cyber Security
- Cybersecurity
- Data Sovereignty
- Database Server
- DDoS
- Digital Tranformation
- Digital Transformation
- Direct Mail
- Directadmin
- Domainname
- Ecommerce
- ERP
- Generative AI
- Getting Started
- Google Cloud
- Google G Suite
- Huawei Cloud
- IT News
- Linux Server
- Managed Cloud Services
- Managed Service Provider
- Manual
- Microsoft
- Microsoft 365
- Microsoft Azure
- News
- On-premise
- Private Mail Server
- Promotion
- Recommend Solution (Enterprise)
- Server
- Sovereign Cloud
- THAI DATA CLOUD Platform
- Ubuntu
- Ubuntu
- Uncategorized
- VMware
- VPS Server
- Web Design
- Web Hosting
- Web Hosting (DirectAdmin)
- Web Hosting (Plesk)
- Web Technologies
- Windows Server
- Wordpress
- Zimbra
- เรื่องราวความประทับใจ
- โซลูชันสำหรับธุรกิจการผลิตและยานยนต์
- โซลูชันสำหรับธุรกิจการศึกษา
- โซลูชันสำหรับธุรกิจการเงิน
- โซลูชันสำหรับธุรกิจขนส่งและกระจายสินค้า
- โซลูชันสำหรับธุรกิจค้าปลีก
- โซลูชันสำหรับธุรกิจท่องเที่ยว
- โซลูชันสำหรับธุรกิจบริการสุขภาพและโรงพยาบาล
- โซลูชันสำหรับธุรกิจประกันภัย
- โซลูชันสำหรับธุรกิจพลังงานและสาธารณูปโภค
- โซลูชันสำหรับธุรกิจสื่อสารมวลชนและเอ็นเตอร์เทนเมนท์
- โซลูชันสำหรับธุรกิจอสังหาริมทรัพย์
- โซลูชันสำหรับธุรกิจเทคโนโลยี








