Series Grafana:
- Cài bộ Grafana – Prometheus trên docker (Portainer) Phần 3: Hướng Dẫn Cài Grafana – Prometheus giám sát hệ thống trên portainer
- Cài bộ Grafana – Prometheus trên VM Linux (none Docker): Hướng dẫn cài đặt Prometheus và Grafana trên Linux chi tiết (2025)
- Cách lên dashboard Grafana: Phần 16: Tạo Dashboard Giám Sát Server với Grafana, Prometheus và Node Exporter
- Cách tạo alerts qua telegram: Bài hôm nay 😀
Giới Thiệu
Grafana Alert là tính năng giám sát chủ động giúp bạn phát hiện sự cố hệ thống ngay lập tức thông qua thông báo Telegram. Trong bài viết này, chúng ta sẽ tìm hiểu cách thiết lập alert hoàn chỉnh, đảm bảo mỗi bước đều hoạt động trước khi chuyển sang bước tiếp theo. Từ cấu hình contact point Telegram, tạo alert rule từ dashboard có sẵn, test ngay từng bước cho đến khi có alert hoàn chỉnh.

Phần 1: Tạo và Test Contact Point Telegram
1.1. Chuẩn Bị Telegram Bot
Bước 1: Tạo Bot với BotFather
- Mở Telegram, tìm @BotFather

- Gửi lệnh
/newbot - Đặt tên bot (ví dụ: “Home Lab Alerts”)
- Đặt username (ví dụ: “adteklabs_alerts_bot”)
- BotFather trả về Bot Token dạng:
8466230000:AAEZFoZwQrjDKWdIr6iEorvi9NjPncjC_99(nhớ dùng token bạn đã tạo nhé, token này là ví dụ không dùng được) - Lưu token này lại

Bước 2: Lấy Chat ID
Tạo Group chat (khuyên dùng)
- Tạo group Telegram mới
- Thêm bot vừa tạo và @myidbot vào group

- Gửi tin nhắn trong group: /getid@myidbot để lấy ID Bot hoặc /getgroupid@myidbot để lấy ID group mà bot đang có mặt. (chỉ cần gõ / là tele nó tự gợi ý rồi)
- Chat ID của group thường là số âm (ví dụ:
-987654321)

Tại sao nên dùng group thay vì dùng chat trực tiếp cho cá nhân?
- Dùng group, chỉ cần tạo 1 con bot và dùng cho nhiều mục đích khác nhau, phân biệt bằng cách tạo nhiều group (đặt tên group theo từng mục đích) và add bot chung vào. Giảm số lượng bot rác khó quản lý
- Dùng alert gửi thẳng cho các nhân, buộc phải map 1 phiên chat 1 bot, phải tạo rất nhiều bot cho nhiều mục đích khác nhau, vừa rác bot vừa tốn thời gian suy nghĩ tạo bot, đặt tên bot,…
- Nếu muốn lấy ID telegram cá nhân thì chat riêng với con bot này nhé @myidbot – chỉ cần gõ / nó sẽ gợi ý.
Tới đây là mình đã có 1 con bot xịn xò, 1 group chat cho mục đích nhận alert, giờ vào phần chính nhé!
1.2. Tạo Contact Point Trên Grafana
Vào Alerting → Contact points → Add contact point:

- Name:
telegram-production(đặt tên rõ ràng theo môi trường) - Integration: Chọn Telegram
- Bot Token: Dán token từ BotFather
- Chat ID: Nhập chat ID vừa lấy (nhớ giữ dấu
-nếu là group) - Message: Để mặc định hoặc custom (xem phần 3)
1.3. TEST NGAY – Bước Quan Trọng Nhất
Không save gì cả, test trước đã!
- Click nút Test màu xanh dương ngay trong form
- Grafana sẽ gửi 1 test notification
- Kiểm tra Telegram ngay:
- ✅ Thành công: Nhận được message từ bot
- ❌ Thất bại: Check lại token hoặc chat ID

Nếu test thành công:
- Click Save contact point
- Contact point đã sẵn sàng sử dụng
Nếu test thất bại:
- Lỗi “Chat not found”: Chat ID sai hoặc bot chưa được thêm vào group
- Lỗi “Unauthorized”: Bot token sai
- Không thấy message: Check lại chat ID, có thể đang nhầm chat
Pro tip: Tạo nhiều contact point cho các mục đích khác nhau:
telegram-production-critical: Group cho alert nghiêm trọngtelegram-dev-team: Group team devtelegram-personal: Chat cá nhân để test
Phần 2: Tạo Alert Rule Từ Dashboard
Xem thêm cách lên dashboard Grafana: Phần 16: Tạo Dashboard Giám Sát Server với Grafana, Prometheus và Node Exporter
2.1. Chọn Dashboard và Panel Để Tạo Alert
Bước 1: Mở Dashboard Có Sẵn (Tham khảo thêm mẫu Dashboard: https://grafana.com/grafana/dashboards/
Ví dụ bạn đang có dashboard Node Exporter giám sát phần cứng server:
- Vào dashboard bạn muốn thêm alert, ở đây mình sẽ chọn dashboard monitor server của mình
- Tìm panel Battery Charge, bấm nút 3 bấm bên phải pannel, chọn “More” > New alert rule

(Option ) Bước 2: Vào Chế Độ Edit Panel (thường nếu chọn alert rule tại pannel như hình thì nó sẽ load được promQL này luôn, nhưng trường hợp ko load được thì bạn chọn edit pannel để copy rồi quay lại chọn new alert nhé.)
- Click vào title của panel (chữ “Battery Charge“)
- Chọn Edit từ menu dropdown
- Bạn sẽ thấy query PromQL đang chạy, ví dụ:
node_power_supply_capacity{instance=~"172.20.10.144:9100"}
2.2. Tạo Alert Rule Từ Panel
Bước 1: Enter alert rule name
Sau khi bấm bưowsc 1 mục 2.1, sẽ ra được giao diện như sau, nhập tên alert:

Grafana tự động:
- Copy query PromQL từ panel
- Giữ nguyên datasource (Prometheus)
Bước 2: Define query and alert condition

- Alert condition: tại bài này mình cần monitor pin dưới 20% sẽ cảnh báo, mình sẽ chọn promQL trả về % pin, nếu dưới 20% sẽ cảnh báo, hiện tại nó đang 95% nên trạn thái cảnh báo là Normal (không cảnh báo)
- Input: Alert condition
- Condition:
IS BELOW - Value: 20 (% Pin < 20%)
Bước 3: Add folder and labels

- Alert rule name:
critical-high-cpu-production(Đặt tên rõ ràng: severity + metric + environment, khuyến cáo) - Folder: Chọn hoặc tạo mới (ví dụ:
Production/Infrastructure)
Bước 4: Set Evaluation Behavior

Khi cấu hình xong, bạn sẽ thấy 2 trạng thái:
- Pending period:
- 👉 Thời gian chờ trước khi bắn alert
- Điều kiện cảnh báo phải vi phạm liên tục trong khoảng thời gian này thì alert mới FIRING
None→ vi phạm là báo ngay- Ví dụ:
1m→ pin thấp liên tục 1 phút mới báo
- Keep firing for:
- 👉 Thời gian giữ alert sau khi hết lỗi
- Khi điều kiện đã hết vi phạm, alert vẫn tiếp tục FIRING trong khoảng thời gian này
None / 0s→ hết lỗi là tắt alert ngay- Dùng để tránh alert bật/tắt liên tục (flapping)
Bước 5: Configure notifications
Chọn Contact point Teklegram đã tạo trước đó

Bước 6: Configure notification message (tạm thời bỏ qua, chưa dùng đến)
Bấm save để lưu cấu hình.
2.3. TEST NGAY – Điều Chỉnh Threshold Để Alert Fire
Bước quan trọng: Test trước khi production!
Phương pháp: Giảm threshold tạm thời
Thay vì threshold IS ABOVE 20, hãy set:
- Threshold:
IS BELOW 100(% Pin dưới 100% thì cảnh báo)

Save Rule
- Click Save rule and exit
Vì threshold đang là 95%, alert sẽ fire ngay
- Đợi 1-2 phút (theo
Evaluate every) - Check Telegram xem có nhận được message không
- Message phải chứa:
- ✅ Tên server (instance)
- ✅ Thông tin từ annotation
Nếu nhận được message thành công:
- Alert rule hoạt động đúng!
- Giờ quay lại chỉnh threshold về production
Nếu không nhận được:
- Check lại contact point có đúng không
- Check labels và notification policy (nếu có)
- Xem logs của alert rule
2.4. Chỉnh Lại Threshold Production
Bước 1: Edit Alert Rule
- Vào Alerting → Alert rules
- Tìm rule
critical-high-cpu-production - Click Edit

Bước 14: Đổi Threshold Về Mức Chuẩn
- Threshold: Đổi từ
IS BELOW 100→IS BELOW 20 - Save rule and exit
Bước 15: Verify Alert Resolved
- Sau vài phút, alert sẽ chuyển sang trạng thái Resolved
- Telegram nhận message “Alert resolved”
- Giờ alert chỉ fire khi PIN thực sự < 20%
Phần 3: Custom Template Telegram (Option)
Vào Alerting > Contact points, chọn Telegram > Edit


Chọn edit Message

Khi tạo contact point Telegram, trong phần Message, paste template này:
Mẫu 1:
{{ if eq .Status "firing" }}
🔴 **CẢNH BÁO**
{{ else }}
✅ **ĐÃ HẾT**
{{ end }}
**Alert**: {{ .CommonLabels.alertname }}
**Severity**: {{ .CommonLabels.severity }}
**Server**: {{ .CommonLabels.instance }}
**Status**: {{ .Status }}
{{ range .Alerts }}
**Value**: {{ .ValueString }}
**Started**: {{ .StartsAt.Format "15:04 02/01/2006" }}
{{ end }}
[Xem Dashboard]({{ .ExternalURL }})
Mẫu 2:
{{ if eq .Status "firing" }}
🔥🔥🔥 **CRITICAL ALERT** 🔥🔥🔥
{{ else }}
✅ **Alert Resolved** ✅
{{ end }}
━━━━━━━━━━━━━━━━━━━━
📋 **{{ .CommonLabels.alertname }}**
━━━━━━━━━━━━━━━━━━━━
🏷️ **Severity**: {{ .CommonLabels.severity | toUpper }}
🖥️ **Instance**: `{{ .CommonLabels.instance }}`
⚠️ **Status**: {{ .Status }}
🌍 **Environment**: {{ .CommonLabels.environment }}
{{ range .Alerts }}
📊 **Current Value**: {{ .ValueString }}
⏰ **Started At**: {{ .StartsAt.Format "15:04:05 - 02/01/2006" }}
⏱️ **Duration**: {{ .ActiveFor }}
{{ end }}
🔗 [View Dashboard]({{ .ExternalURL }})
━━━━━━━━━━━━━━━━━━━━
Chọn save, sau đó chọn Test để thử template mới:

Thành quả:

Sau khi sửa template:
- Click Test trong form edit contact point
- Check Telegram xem format có đẹp không
- Kiểm tra:
- ✅ Emoji hiển thị đúng
- ✅ Markdown format đúng
- ✅ Link click được
- ✅ Thông tin đầy đủ
Nếu sai format:
- Sửa lại template
- Test lại cho đến khi ưng ý
- Mới Save contact point
Phần 4: Workflow Test Hoàn Chỉnh
4.1. Quy Trình “Làm – Test – Fix – Repeat”
Level 1: Test Contact Point
- Tạo contact point
- TEST → check Telegram
- Nếu fail → fix token/chat ID
- TEST lại → đến khi OK mới save
Level 2: Test Template
- Sửa message template
- TEST → check format trong Telegram
- Nếu sai → fix template
- TEST lại → OK mới save
Level 3: Test Alert Rule
- Tạo alert với threshold thấp (1% thay vì 80%)
- Save và đợi alert fire
- Check Telegram nhận message
- Nếu OK → edit lại threshold production (80%)
- Verify alert resolved
Level 4: Test Alert Thực Tế
- Chờ alert fire tự nhiên khi CPU thực sự cao
- Check message có đúng không
- Check link dashboard
- Nếu cần tweak → lặp lại từ Level 3
4.2. Checklist Trước Khi Production
✅ Contact Point:
- Đã test và nhận được message
- Template hiển thị đúng format
- Link dashboard hoạt động
✅ Alert Rule:
- Query trả về data chính xác
- Threshold hợp lý (đã test với threshold thấp)
- Evaluate time và For duration phù hợp
- Đã test firing và nhận notification
✅ Organization:
- Tên alert rule rõ ràng
- Folder đúng category
- Labels đầy đủ
- Documentation đã ghi chú
Phần 5: Quản Lý Alert Chuyên Nghiệp
5.1. Convention Đặt Tên
Format: [severity]-[metric]-[resource]-[environment]
Ví dụ:
critical-high-cpu-web-server-productionwarning-low-disk-space-database-staginginfo-high-request-rate-api-production
5.2. Cấu Trúc Folder
Production/
├── Infrastructure/
│ ├── CPU-Memory
│ ├── Disk-Network
│ └── System-Health
├── Application/
│ ├── API-Backend
│ ├── Web-Frontend
│ └── Background-Jobs
└── Database/
├── MySQL
├── PostgreSQL
└── Redis
Staging/
└── All-Services
Development/
└── Testing-Alerts
5.3. Labels Quan Trọng
severity: critical | warning | info
team: devops | backend | frontend | dba
environment: production | staging | dev
service: api | web | database | cache
priority: p1 | p2 | p3
5.4. Notification Policy Routing
Vào Alerting → Notification policies:
Root policy: telegram-production (mặc định)
Specific matchers:
severity = critical+environment = production→telegram-oncallteam = backend→telegram-backend-teamenvironment = staging→telegram-dev-team
Điều này giúp route alert đúng team tự động.
Phần 6: Troubleshooting Thường Gặp
6.1. Không Nhận Được Alert Trên Telegram
Kiểm tra theo thứ tự:
- Contact Point test: Click Test trong contact point → có nhận không?
- Nếu không → fix token/chat ID
- Alert có firing không: Vào Alert rules → check status
- Nếu không firing → threshold chưa đạt
- Notification policy: Check routing có đúng không
- Labels có match với policy không
6.2. Alert Fire Liên Tục (Spam)
Nguyên nhân:
- Threshold quá thấp
Forduration quá ngắn- Metric fluctuate liên tục
Fix:
- Tăng threshold lên mức hợp lý
- Tăng
Fortừ 1m lên 5m-10m - Dùng
avg_over_time()trong query để smooth data
6.3. Miss Critical Alert
Nguyên nhân:
- Query sai
- Threshold quá cao
Forduration quá dài
Fix:
- Test query trên Explore trước
- Giảm threshold xuống mức hợp lý
- Giảm
Forcho critical alert (1-2 phút)
Kết Luận
Cấu hình alert hiệu quả không phải là làm xong xuôi rồi mới test, mà là test ngay từng bước. Phương pháp này giúp phát hiện lỗi sớm, tiết kiệm thời gian debug và đảm bảo alert hoạt động đúng trước khi đưa vào production.
Quy trình vàng:
- Tạo contact point → TEST → Save
- Tạo alert rule với threshold thấp → Đợi firing → Check Telegram
- Chỉnh threshold production → Verify resolved
- Sửa template → TEST → Save
Hãy luôn test, test và test nữa. Một alert setup đúng sẽ là người bạn đồng hành đáng tin cậy trong việc giám sát hệ thống 24/7.