Tự chế hệ thống giám sát Server bằng Python và Discord Webhook

Python tutorial - IT technology blog
Python tutorial - IT technology blog

Nỗi ám ảnh mang tên “Server sập lúc nửa đêm”

Bạn quản lý vài con VPS chạy web app hoặc bot? Chắc hẳn bạn đã từng nếm trải cảm giác sáng ngủ dậy thấy dịch vụ chết ngóm. Khách hàng phàn nàn, sếp réo tên, và nguyên nhân hóa ra lại cực kỳ lãng xẹt: đầy ổ cứng hoặc một process nào đó ngốn sạch RAM gây treo máy.

Cảm giác thức dậy với hàng chục thông báo lỗi thực sự là một cơn ác mộng. Thực tế, chúng ta hoàn toàn có thể chặn đứng chuyện này nếu biết trước tình trạng tài nguyên. Thay vì phải SSH vào server gõ top hay df -h mỗi giờ một cách thủ công, mình chọn cách để Python làm thay việc đó. Chỉ cần 15 phút setup, bạn sẽ có ngay một “người gác đền” mẫn cán, sẵn sàng nhắn tin vào Discord mỗi khi hệ thống có biến.

Khi nào dùng hàng “khủng”, khi nào dùng Python?

Trước khi bắt tay vào code, hãy cùng nhìn qua các giải pháp monitoring hiện nay. Việc chọn đúng công cụ sẽ giúp bạn tiết kiệm cả thời gian lẫn tiền bạc.

So sánh các phương pháp phổ biến

  • Công cụ chuyên dụng (Prometheus, Zabbix): Đây là những “quái vật” thực thụ. Chúng mạnh mẽ, biểu đồ đẹp nhưng cực kỳ ngốn tài nguyên. Một con VPS 1GB RAM mà gánh thêm bộ Prometheus + Grafana (thường chiếm 200-400MB RAM) thì chẳng khác nào tự làm khó mình.
  • Dịch vụ Cloud (Datadog, New Relic): Tính năng rất xịn xò. Tuy nhiên, chi phí hàng tháng có khi còn đắt hơn cả tiền thuê server.
  • Script Python tự viết: Lựa chọn tối ưu cho startup hoặc server cá nhân. Nó siêu nhẹ (chỉ tốn khoảng 15-20MB RAM), tùy biến 100% và hoàn toàn miễn phí.

Bảng so sánh nhanh dưới đây sẽ giúp bạn dễ đưa ra quyết định hơn:

Tiêu chí Zabbix/Prometheus Python Script
RAM tiêu thụ ~300MB+ < 20MB
Triển khai Phức tạp Rất nhanh
Chi phí Miễn phí/Trả phí 0 VNĐ

Tại sao lại là Discord Webhook?

Email thì chậm và dễ bay vào hòm thư spam. Telegram đôi khi lại gặp vấn đề về kết nối ở một số khu vực. Trong khi đó, Discord cung cấp cơ chế Webhook cực kỳ linh hoạt. Bạn chỉ cần gửi một request POST kèm JSON đến một URL định sẵn là xong. Tin nhắn sẽ hiện ra ngay lập tức với định dạng Rich Embed chuyên nghiệp, giúp bạn phân biệt rõ mức độ nghiêm trọng của cảnh báo qua màu sắc.

Triển khai script giám sát trong 3 bước

Để bắt đầu, server của bạn cần có Python 3. Chúng ta sẽ dùng psutil để đọc thông số hệ thống và requests để bắn dữ liệu về Discord.

Bước 1: Cài đặt thư viện

Chạy lệnh sau trên terminal của server:

pip install psutil requests

Bước 2: Lấy Webhook URL

  1. Mở Discord, vào Server Settings -> Integrations.
  2. Chọn Webhooks -> New Webhook.
  3. Đặt tên cho bot (ví dụ: “Sentry Bot”) và copy URL. Hãy giữ kín URL này nhé!

Bước 3: Viết logic xử lý

Script dưới đây sẽ kiểm tra CPU, RAM và Disk. Nếu bất kỳ chỉ số nào vượt ngưỡng an toàn, nó sẽ kích hoạt còi báo động.

import psutil
import requests
import socket
from datetime import datetime

# Cấu hình ngưỡng cảnh báo
DISCORD_WEBHOOK_URL = "YOUR_WEBHOOK_URL_HERE"
CPU_THRESHOLD = 80  # Cảnh báo nếu CPU > 80%
RAM_THRESHOLD = 85  # Cảnh báo nếu RAM > 85%
DISK_THRESHOLD = 90 # Cảnh báo nếu Disk > 90%

def get_system_status():
    hostname = socket.gethostname()
    # Lấy trung bình CPU trong 1 giây để có con số chính xác
    cpu_usage = psutil.cpu_percent(interval=1)
    ram_usage = psutil.virtual_memory().percent
    disk_usage = psutil.disk_usage('/').percent
    return hostname, cpu_usage, ram_usage, disk_usage

def send_discord_alert(hostname, cpu, ram, disk):
    payload = {
        "embeds": [{
            "title": f"🚨 Cảnh báo tài nguyên: {hostname}",
            "color": 15158332, # Màu đỏ
            "fields": [
                {"name": "CPU", "value": f"{cpu}%", "inline": True},
                {"name": "RAM", "value": f"{ram}%", "inline": True},
                {"name": "Disk", "value": f"{disk}%", "inline": True},
            ],
            "footer": {"text": f"Ghi nhận lúc: {datetime.now().strftime('%H:%M:%S %d-%m-%Y')}"}
        }]
    }
    requests.post(DISCORD_WEBHOOK_URL, json=payload)

def main():
    hostname, cpu, ram, disk = get_system_status()
    if cpu > CPU_THRESHOLD or ram > RAM_THRESHOLD or disk > DISK_THRESHOLD:
        send_discord_alert(hostname, cpu, ram, disk)
    else:
        print(f"Hệ thống ổn: CPU {cpu}% | RAM {ram}% | Disk {disk}%")

if __name__ == "__main__":
    main()

Tự động hóa với Crontab

Script viết xong rồi, nhưng chẳng lẽ lại ngồi gõ lệnh chạy tay? Để nó tự động chạy 5 phút một lần, chúng ta dùng Crontab. Đây là công cụ lập lịch kinh điển trên Linux.

crontab -e và thêm dòng này vào cuối file:

*/5 * * * * /usr/bin/python3 /home/user/monitor.py >> /var/log/monitor.log 2>&1

Lưu ý nhỏ: Bạn nên dùng đường dẫn tuyệt đối (ví dụ /usr/bin/python3) để tránh lỗi môi trường khi Cron thực thi.

Kinh nghiệm thực tế để script “khôn” hơn

Sau một thời gian vận hành trên các cụm server thực tế, mình có vài lời khuyên cho bạn:

  1. Chống Spam: Nếu CPU bị treo ở 90% liên tục, Discord của bạn sẽ nổ tung vì thông báo. Hãy sửa code để chỉ gửi tin nhắn khi trạng thái thay đổi từ “Bình thường” sang “Cảnh báo”.
  2. Theo dõi OOM Killer: RAM đầy thường dẫn đến việc Linux tự sát các process nặng (như MySQL). Bạn có thể thêm check psutil.process_iter() để xem các service quan trọng còn sống hay không.
  3. Log lại mọi thứ: Luôn ghi log ra file. Khi server sập thật, những dòng log này là manh mối duy nhất để bạn biết chuyện gì đã xảy ra lúc 2 giờ sáng.

Tự xây dựng công cụ giám sát không chỉ giúp bạn yên tâm hơn mà còn là cách rèn luyện tư duy DevOps rất tốt. Chúc các bạn có những đêm ngon giấc mà không lo server “đột quỵ” bất ngờ!

Share: