Xin chào ! Nếu đây là lần đầu tiên bạn đến với diễn đàn, xin vui lòng danh ra một phút bấm vào đây để đăng kí và tham gia thảo luận cùng VnPro.
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • ⚡📧 Tự động hóa cảnh báo lỗi với Grafana Webhook – Không còn phải mở Grafana lúc 3h sáng

    ⚡📧 Tự động hóa cảnh báo lỗi với Grafana Webhook – Không còn phải mở Grafana lúc 3h sáng

    Câu chuyện có thật của một anh IT.
    😤 Bạn Có Đang Gặp Vấn Đề Này?
    ☑️ Email cảnh báo từ Grafana chỉ có: "Error detected on server-01"
    ☑️ Không biết lỗi gì, phải mò vào Grafana xem log
    ☑️ Đêm khuya buồn ngủ, đăng nhập Grafana còn lâu hơn sửa lỗi
    ☑️ Sếp hỏi : "Lỗi gì mà lâu thế?" → Không biết đâu mà trả lời 😓

    Stop right there! Hôm nay mình chia sẻ cách nhận email có 15 dòng log lỗi chi tiết ngay trong email. Không cần đăng nhập, không cần VPN, chỉ cần đọc email là biết ngay vấn đề!

    Click image for larger version

Name:	ảnh.png
Views:	33
Size:	36.8 KB
ID:	437832
    🎯 So Sánh: Trước vs Sau
    TRƯỚC (Email từ Grafana thông thường):
    Subject: Alert: Server Error
    Server server-01 has errors.
    Please check Grafana for details.
    Result: Phải mở laptop → VPN → Login Grafana → Tìm log → Mất 5 phút
    SAU (Email có log content):
    Subject: 🚨 [LOG ERROR] server-01
    📊 Thiết bị: server-01
    2025-12-05 03:15:30
    ================================================== ==========
    📝 LOG LỖI:
    ================================================== ==========
    [03:10:15] ERROR: Database connection timeout
    [03:10:18] CRITICAL: Max retries exceeded
    ================================================== ==========
    Result: Đọc email → Biết ngay lỗi DB timeout → Xử lý ngay! Chỉ 30 giây!
    💡 Ý Tưởng: Làm Sao Để Grafana Gửi Log?
    Spoiler: Grafana KHÔNG THỂ gửi log content! 😱
    Grafana Alerting chỉ làm việc với metrics (số), không phải logs (text). Đây là giới hạn kỹ thuật của Grafana.
    Nhưng... chúng ta có thể "hack" bằng cách:
    Grafana phát hiện lỗi à Gửi webhook đến Python script à Script tự động query Loki API lấy logs à Format đẹp và gửi email à perfect
    🛠️ Triển Khai: 15 Phút Là Xong!
    Bước 1: Code Python Script (5 phút)
    sudo mkdir -p /opt/log-alert && cd /opt/log-alert
    sudo nano webhook.py
    Copy paste đoạn code này (đã test production, chạy ổn định):
    #!/usr/bin/env python3
    from flask import Flask, request
    import requests, smtplib
    from email.mime.text import MIMEText
    from datetime import datetime, timedelta

    app = Flask(__name__)

    # ⚠️ SỬA 3 DÒNG NÀY THÔI!
    SMTP_USER = "your-email@gmail.com" # Email gửi
    SMTP_PASS = "your-app-password" # Gmail App Password
    EMAIL_TO = "admin@company.com" # Email nhận

    LOKI_URL = "http://localhost:3100"
    SMTP_SERVER = "smtp.gmail.com"
    SMTP_PORT = 587

    @app.route('/alert', methods=['POST'])
    def alert():
    try:
    for alert in request.json.get('alerts', []):
    if alert['status'] == 'firing':
    job = alert['labels'].get('job', 'unknown')
    logs = get_logs(job)
    send_email(job, logs)
    return 'OK', 200
    except Exception as e:
    print(f"Error: {e}")
    return 'Error', 500

    def get_logs(job):
    """Query Loki để lấy 15 dòng log ERROR gần nhất"""
    now = datetime.now()
    start = now - timedelta(minutes=10)

    params = {
    'query': f'{{job="{job}"}} |~ "(?i)(emergency|alert|critical|error)" != "warn"',
    'limit': 15,
    'start': int(start.timestamp() * 1e9),
    'end': int(now.timestamp() * 1e9)
    }

    try:
    resp = requests.get(f"{LOKI_URL}/loki/api/v1/query_range", params=params, timeout=5)
    lines = []
    for stream in resp.json().get('data', {}).get('result', []):
    for val in stream.get('values', [])[:15]:
    ts = datetime.fromtimestamp(int(val[0]) / 1e9)
    lines.append(f"[{ts:%H:%M:%S}] {val[1]}")
    return lines if lines else ["⚠️ Không tìm thấy logs"]
    except:
    return [" Lỗi kết nối Loki"]

    def send_email(job, logs):
    body = f"""🚨 CẢNH BÁO LOG LỖI

    📊 Thiết bị: {job}
    {datetime.now():%Y-%m-%d %H:%M:%S}

    {'='*60}
    📝 LOG LỖI CHI TIẾT:
    {'='*60}
    {chr(10).join(logs)}
    {'='*60}

    Hành động: Kiểm tra và xử lý ngay!"""

    msg = MIMEText(body, 'plain', 'utf-8')
    msg['Subject'] = f"🚨 [LOG ERROR] {job}"
    msg['From'] = SMTP_USER
    msg['To'] = EMAIL_TO

    try:
    s = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
    s.starttls()
    s.login(SMTP_USER, SMTP_PASS)
    s.send_message(msg)
    s.quit()
    print(f" Email sent to {EMAIL_TO}")
    except Exception as e:
    print(f" Failed: {e}")

    if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
    💡 Pro Tip: Gmail App Password tạo tại https://myaccount.google.com/apppasswords (phải bật 2FA trước)
    Bước 2: Setup Systemd Service (3 phút)
    # Cài Flask
    pip3 install flask requests

    # Tạo service tự động chạy
    sudo tee /etc/systemd/system/log-alert.service > /dev/null <<EOF
    [Unit]
    Description=Log Alert Webhook
    After=network.target

    [Service]
    Type=simple
    User=root
    WorkingDirectory=/opt/log-alert
    ExecStart=/usr/bin/python3 /opt/log-alert/webhook.py
    Restart=always

    [Install]
    WantedBy=multi-user.target
    EOF

    # Start!
    sudo systemctl daemon-reload
    sudo systemctl enable --now log-alert
    sudo systemctl status log-alert
    Thấy active (running) là OK!
    Bước 3: Cấu Hình Grafana (5 phút)
    3.1. Tạo Webhook Contact Point
    Grafana → AlertingContact points+ Create3.2. Tạo Alert Rule
    AlertingAlert rules+ Create
    Query (quan trọng nhất!):
    sum(count_over_time({job=~".+-syslog"} |~ "(?i)(emergency|alert|critical|error)" != "warning" [5m])) by (job) > 0
    Settings:
    • Rule name: 🚨 Critical Errors - All Devices
    • Folder: Production Alerts
    • Evaluation interval: 1m
    • Contact point: webhook-logs
    • Save
    Bước 4: Test & Celebrate! 🎉
    Đợi 1 phút → Check email → BOOM! 💥
    🐛 Troubleshooting
    Email không đến?
    # Xem logs webhook
    sudo journalctl -u log-alert -f

    # Kiểm tra SMTP
    python3 -c "import smtplib; s=smtplib.SMTP('smtp.gmail.com',587); s.starttls(); s.login('user','pass'); print('OK')"
    Alert không fire?
    • Vào Grafana Explore, test query có logs không
    • Kiểm tra pending period có quá dài không
    • Xem Alert Rules có status "Firing" không
    Quá nhiều email?
    • Tăng threshold: > 0 → > 20
    • Tăng pending: 1m → 5m
    • Setup grouping trong Notification Policy
    🏆 Kết Quả Thực Tế
    Trước khi dùng:
    • MTTR (Mean Time To Resolve): ~15 phút
    • Cần: Laptop + VPN + Login Grafana
    • Stress level: 😰😰😰
    Sau khi dùng:
    • MTTR: ~2 phút
    • Cần: Chỉ smartphone
    • Stress level: 😎
    🎯 Tổng Kết
    Giải pháp này đã giúp team mình:
    • Giảm 80% thời gian xử lý sự cố đêm khuya
    • Không cần đăng nhập hệ thống khi on-call
    • Boss hài lòng vì response nhanh hơn
    • Quan trọng nhất: NGỦ NGON HƠN! 😴
    Chi phí: $0 (open source)
    Thời gian setup: 15 phút
    Giá trị: VÔ GIÁ! 💎

    💬 Bạn đã thử chưa? Comment bên dưới nếu có câu hỏi hoặc chia sẻ cách tối ưu của bạn!
    👍 Like nếu bài viết hữu ích
    🔄 Share cho đồng nghiệp đang khổ sở với alerts
    Star GitHub repo nếu có

    Happy monitoring! 🚀

    Attached Files
Working...
X