⚡📧 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 đề!
🎯 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):
💡 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)
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 → Alerting → Contact points → + Create
Alerting → Alert rules → + Create
Query (quan trọng nhất!):
Settings:
Đợi 1 phút → Check email → BOOM! 💥
🐛 Troubleshooting
Email không đến?
Alert không fire?
Trước khi dùng:
Giải pháp này đã giúp team mình:
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! 🚀
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 đề!
🎯 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) |
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 |
Bước 3: Cấu Hình Grafana (5 phút)
3.1. Tạo Webhook Contact Point
Grafana → Alerting → Contact points → + Create
- Name: webhook-logs
- Integration: Webhook
- URL: http://localhost:5000/alert
- Method: POST
- Click Test → Kiểm tra email → Save
Alerting → Alert rules → + Create
Query (quan trọng nhất!):
| sum(count_over_time({job=~".+-syslog"} |~ "(?i)(emergency|alert|critical|error)" != "warning" [5m])) by (job) > 0 |
- Rule name: 🚨 Critical Errors - All Devices
- Folder: Production Alerts
- Evaluation interval: 1m
- Contact point: webhook-logs
- Save
Đợ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')" |
- 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
- Tăng threshold: > 0 → > 20
- Tăng pending: 1m → 5m
- Setup grouping trong Notification Policy
Trước khi dùng:
- MTTR (Mean Time To Resolve): ~15 phút
- Cần: Laptop + VPN + Login Grafana
- Stress level: 😰😰😰
- MTTR: ~2 phút
- Cần: Chỉ smartphone
- Stress level: 😎
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! 😴
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! 🚀