ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

ทำ Dashboard เฝ้าดูเซิร์ฟเวอร์ด้วย Grafana และ Prometheus
Home ทำ Dashboard เฝ้าดูเซิร์ฟเวอร์ด้วย Grafana และ Prometheus

ทำ Dashboard เฝ้าดูเซิร์ฟเวอร์ด้วย Grafana และ Prometheus

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

คู่มือนี้ต่อยอดจากการติดตั้ง Prometheus และ Node Exporter โดยเพิ่ม Grafana นำเข้า Dashboard สำเร็จรูปที่ชุมชนทำไว้แล้ว และตั้งการแจ้งเตือน

สิ่งที่ต้องเตรียม

  • Prometheus ที่ทำงานอยู่แล้วและเก็บข้อมูลจาก Node Exporter
  • Docker และโดเมนย่อยสำหรับเข้าหน้าจอ
curl -s http://127.0.0.1:9090/-/healthy

ขั้นตอนที่ 1: ติดตั้ง Grafana

sudo mkdir -p /opt/grafana/data
sudo chown -R 472:472 /opt/grafana/data
cd /opt/grafana
sudo nano docker-compose.yml
services:
  grafana:
    image: grafana/grafana-oss:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - ./data:/var/lib/grafana
      - ./provisioning:/etc/grafana/provisioning
    environment:
      GF_SECURITY_ADMIN_USER: admin
      GF_SECURITY_ADMIN_PASSWORD: รหัสผ่านที่แข็งแรง
      GF_SERVER_ROOT_URL: https://grafana.example.com
      GF_USERS_ALLOW_SIGN_UP: "false"
      GF_ANALYTICS_REPORTING_ENABLED: "false"
      TZ: Asia/Bangkok
    extra_hosts:
      - "host.docker.internal:host-gateway"
sudo docker compose up -d
sudo docker compose logs -f grafana

บรรทัด extra_hosts ทำให้คอนเทนเนอร์เรียก Prometheus ที่รันบนเครื่องแม่ได้ผ่านชื่อ host.docker.internal

ขั้นตอนที่ 2: ตั้ง Data Source อัตโนมัติ

แทนที่จะคลิกตั้งเองในหน้าเว็บ ให้เขียนเป็นไฟล์ ซึ่งทำให้สร้างเครื่องใหม่ได้เหมือนเดิมทุกครั้ง

sudo mkdir -p /opt/grafana/provisioning/datasources
sudo nano /opt/grafana/provisioning/datasources/prometheus.yml
apiVersion: 1

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://host.docker.internal:9090
    isDefault: true
    editable: false
    jsonData:
      timeInterval: 15s
sudo docker compose restart grafana

ขั้นตอนที่ 3: ตั้ง Nginx และ SSL

sudo nano /etc/nginx/sites-available/grafana
server {
    listen 80;
    server_name grafana.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade    $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}
sudo ln -s /etc/nginx/sites-available/grafana /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d grafana.example.com --agree-tos -m [email protected] --redirect

ขั้นตอนที่ 4: นำเข้า Dashboard สำเร็จรูป

เข้าหน้าเว็บแล้วไปที่ Dashboards แล้ว New แล้ว Import ใส่หมายเลขแล้วกด Load เลือก Data Source เป็น Prometheus

  • 1860 Node Exporter Full ครอบคลุมทุกเมตริกของเซิร์ฟเวอร์ เป็นตัวที่ควรมีก่อนอื่น
  • 7362 MySQL Overview
  • 9628 PostgreSQL Database
  • 12708 Nginx
  • 193 Docker และ Container

Dashboard 1860 มีกราฟกว่าร้อยแผง ซึ่งอาจมากเกินไปสำหรับการดูประจำวัน แนะนำให้สร้าง Dashboard ของตัวเองที่มีเฉพาะสิ่งที่ดูจริง แล้วใช้ 1860 เมื่อต้องเจาะลึก

ขั้นตอนที่ 5: สร้างกราฟเอง

กด New Dashboard แล้ว Add visualization เลือก Prometheus แล้วใส่คำสั่ง 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="/"}

# ทราฟฟิกเครือข่าย
rate(node_network_receive_bytes_total{device!="lo"}[5m]) * 8

ตั้งหน่วยให้ถูกต้องในแท็บ Standard options เช่น percent (0-100) สำหรับเปอร์เซ็นต์ และ bits/sec สำหรับเครือข่าย ไม่เช่นนั้นตัวเลขจะอ่านยาก

ใช้ตัวแปรเพื่อให้เลือกเซิร์ฟเวอร์จากรายการดรอปดาวน์ได้ ในหน้า Dashboard settings แล้ว Variables เพิ่มตัวแปรชนิด Query

label_values(node_uname_info, instance)

แล้วอ้างถึงในคำสั่งด้วย {instance="$instance"}

ขั้นตอนที่ 6: ตั้งการแจ้งเตือน

ไปที่ Alerting แล้ว Alert rules แล้ว New alert rule

  • ตั้งคำสั่ง เช่น 100 * (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) > 85
  • ตั้งเงื่อนไขว่าค่าต้องเกินเกณฑ์ติดต่อกันกี่นาทีจึงแจ้ง เช่น 5 นาที ลดการแจ้งเตือนจากค่าที่พุ่งชั่วคราว
  • เลือก Contact point ที่จะส่งไป

ตั้ง Contact point ที่ Alerting แล้ว Contact points รองรับอีเมล Telegram Slack และ Webhook ซึ่งใช้ส่งเข้า LINE Notify ได้

URL: https://notify-api.line.me/api/notify
HTTP Method: POST
Authorization Header: Bearer <LINE_NOTIFY_TOKEN>

ขั้นตอนที่ 7: สำรองและย้ายเครื่อง

sudo tar czf /var/backups/grafana-$(date +%F).tar.gz -C /opt/grafana data provisioning

ส่งออก Dashboard เป็น JSON เก็บใน Git ด้วย ที่หน้า Dashboard settings แล้ว JSON Model ทำให้กู้คืนและทำซ้ำบนเครื่องอื่นได้

ปัญหาที่พบบ่อย

Data Source ทดสอบแล้วเชื่อมต่อไม่ได้

ตรวจว่าใช้ host.docker.internal ไม่ใช่ localhost เพราะ localhost ในคอนเทนเนอร์คือตัวคอนเทนเนอร์เอง และตรวจว่า Prometheus ฟังที่ IP ที่เข้าถึงได้

กราฟว่างเปล่า

ทดสอบคำสั่งใน Prometheus โดยตรงที่ http://127.0.0.1:9090/graph ก่อน หากที่นั่นก็ว่าง แปลว่าปัญหาอยู่ที่การเก็บข้อมูล ไม่ใช่ Grafana

เข้าหน้าเว็บแล้ว CSS เพี้ยน

ตั้ง GF_SERVER_ROOT_URL ให้ตรงกับที่อยู่จริง และตรวจว่า Nginx ส่ง X-Forwarded-Proto มาให้

ลืมรหัสผ่าน admin

sudo docker compose exec grafana grafana-cli admin reset-admin-password ใหม่

ต้องการระบบเฝ้าระวังพร้อม Dashboard ที่ออกแบบให้เหมาะกับระบบของคุณ ติดต่อ THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security