Giới thiệu vấn đề
Hệ thống IT của bạn có thể vận hành trơn tru mỗi ngày, nhưng chuyện gì sẽ xảy ra khi sự cố ập đến? Một server đột ngột ngừng hoạt động, một dịch vụ thiết yếu gặp lỗi, hay tài nguyên hệ thống chạm mức nguy hiểm. Nếu không có hệ thống cảnh báo đáng tin cậy, bạn có thể chỉ phát hiện vấn đề khi người dùng đã bắt đầu than phiền. Đến lúc đó, hậu quả có thể đã rất nghiêm trọng.
Giám sát (monitoring) là bước đầu tiên và thiết yếu để duy trì hệ thống ổn định. Tuy nhiên, chỉ giám sát thôi chưa đủ. Bạn cần một hệ thống cảnh báo hiệu quả, giúp nhận thông báo tức thì, mọi lúc mọi nơi. Bài viết này hướng dẫn bạn cách cấu hình Alertmanager – một thành phần cốt lõi của Prometheus – để gửi cảnh báo qua SMS và Telegram. Đây là hai kênh thông báo nhanh chóng và đáng tin cậy, rất phù hợp cho quản trị viên.
Khi mới bắt đầu thiết lập monitoring, tôi cũng từng trải qua tình trạng ‘alert fatigue’ – quá tải bởi vô số cảnh báo không quan trọng. Điều này khiến tôi suýt bỏ lỡ những sự cố thực sự nghiêm trọng. Tôi đã mất nhiều thời gian để điều chỉnh các ngưỡng (threshold) và cấu hình Alertmanager. Mục tiêu là tạo ra một hệ thống cảnh báo cân bằng, chỉ thông báo khi thật sự cần thiết. Vì vậy, ngoài hướng dẫn cấu hình cơ bản, tôi cũng sẽ chia sẻ kinh nghiệm giúp bạn tránh ‘alert fatigue’ ngay từ đầu.
Khái niệm cốt lõi
Để cài đặt cảnh báo hiệu quả, trước hết, cần nắm rõ các thành phần chính tham gia vào quá trình này.
Prometheus: Trái tim của hệ thống giám sát
Dù bài viết tập trung vào Alertmanager, chúng ta không thể bỏ qua Prometheus. Đây là hệ thống giám sát và cảnh báo mã nguồn mở, chuyên thu thập số liệu (metrics) từ các mục tiêu đã cấu hình. Khi một số liệu vượt ngưỡng, Prometheus sẽ tạo ra cảnh báo (alert). Tuy nhiên, nó không trực tiếp gửi đi mà chuyển tiếp đến Alertmanager.
Alertmanager: Bộ não xử lý cảnh báo
Alertmanager là một thành phần độc lập. Nó nhận cảnh báo từ Prometheus (hoặc các nguồn khác), sau đó xử lý dựa trên các quy tắc đã thiết lập sẵn. Các chức năng chính của Alertmanager bao gồm:
- Grouping (Nhóm): Gộp nhiều cảnh báo tương tự thành một thông báo duy nhất. Ví dụ, nếu 10 server đồng thời báo lỗi disk space, Alertmanager sẽ gửi một thông báo chung thay vì 10 tin nhắn riêng lẻ.
- Inhibition (Ngăn chặn): Chặn các cảnh báo phụ thuộc khi một cảnh báo chính được kích hoạt. Chẳng hạn, nếu server chính đã báo mất kết nối, Alertmanager sẽ tự động ngăn chặn cảnh báo về các dịch vụ đang chạy trên server đó.
- Silencing (Tắt tiếng): Cho phép tạm thời tắt cảnh báo trong một khoảng thời gian cụ thể (ví dụ: khi đang bảo trì hệ thống).
- Routing (Định tuyến): Gửi cảnh báo tới các receiver (người nhận) khác nhau, dựa vào nhãn (labels) của cảnh báo. Receiver có thể là email, Slack, PagerDuty, webhook. Bài viết này sẽ tập trung vào Telegram và SMS.
Tại sao là SMS và Telegram?
Trong môi trường hệ thống hiện đại, việc nhận cảnh báo kịp thời là yếu tố then chốt.
- Telegram: Là ứng dụng nhắn tin phổ biến, Telegram cung cấp API bot linh hoạt, giúp dễ dàng tích hợp để gửi thông báo. Ưu điểm nổi bật: hoàn toàn miễn phí, có thể gửi nhiều thông tin hơn email, và thông báo gần như tức thì. Đây là công cụ rất tiện lợi cho đội ngũ kỹ thuật.
- SMS: Dù có vẻ ‘cổ điển’, SMS vẫn là kênh thông báo cực kỳ đáng tin cậy. Đặc biệt trong các tình huống khẩn cấp, khi không có kết nối internet hoặc ứng dụng nhắn tin gặp sự cố, SMS vẫn hoạt động. Nó có mặt trên mọi điện thoại di động và không yêu cầu ứng dụng đặc biệt. SMS chính là kênh dự phòng (fallback) quan trọng cho những cảnh báo nghiêm trọng nhất.
Thực hành chi tiết: Cấu hình cảnh báo với Alertmanager
Để bắt đầu, tôi sẽ giả định bạn đã có Prometheus và Alertmanager đang hoạt động. Nếu chưa, bạn có thể tham khảo các bài viết hướng dẫn cài đặt Prometheus và Grafana trên itfromzero.com, hoặc dùng Docker để khởi tạo nhanh chóng.
1. Cấu hình Telegram Notification
Telegram là một kênh cảnh báo phổ biến nhờ tính linh hoạt và hoàn toàn miễn phí.
Bước 1: Tạo Telegram Bot và lấy Bot Token
- Mở ứng dụng Telegram, tìm kiếm
@BotFather. - Bắt đầu cuộc trò chuyện với
@BotFathervà gõ/newbot. - Làm theo hướng dẫn để đặt tên cho bot của bạn (ví dụ:
itfromzero_alert_bot) và một username duy nhất (ví dụ:itfromzero_alert_bot). - Sau khi hoàn tất,
@BotFathersẽ cung cấpHTTP API Token. Hãy lưu trữ token này thật cẩn thận, ví dụ:123456789:ABCDEFGH-IJKLMN_OPQRSTUVXYZ.
Bước 2: Lấy Chat ID của nhóm hoặc người dùng
Alertmanager cần biết gửi tin nhắn đến đâu. Đây có thể là một cá nhân hoặc một nhóm.
- Tìm kiếm bot của bạn trên Telegram và bắt đầu một cuộc trò chuyện với nó, hoặc thêm bot vào một nhóm chat bạn muốn nhận cảnh báo.
- Gửi một tin nhắn bất kỳ đến bot hoặc trong nhóm chat có bot.
- Mở trình duyệt và truy cập URL sau (thay
<BOT_TOKEN>bằng token của bạn):https://api.telegram.org/bot<BOT_TOKEN>/getUpdates - Bạn sẽ nhận được một phản hồi JSON. Tìm kiếm trường
chatvàid. Đây chính làchat_idbạn cần. Nếu là nhóm, ID sẽ là một số âm (ví dụ:-123456789).
Bước 3: Chỉnh sửa cấu hình Alertmanager (alertmanager.yaml)
Thêm hoặc chỉnh sửa phần receivers và routes trong file alertmanager.yaml của bạn.
# alertmanager.yaml
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'default-receiver' # Cấu hình receiver mặc định
routes:
- match:
severity: 'critical' # Cảnh báo có độ nghiêm trọng 'critical'
receiver: 'telegram-critical'
- match:
severity: 'warning' # Cảnh báo có độ nghiêm trọng 'warning'
receiver: 'telegram-warning'
# Bạn có thể thêm các rule khác ở đây
receivers:
- name: 'default-receiver'
# Bạn có thể cấu hình một receiver mặc định nào đó hoặc bỏ trống nếu không muốn cảnh báo mặc định.
# telegram_configs:
# - chat_id: '<CHAT_ID_DEFAULT>'
# parse_mode: 'HTML'
- name: 'telegram-critical'
telegram_configs:
- bot_token: '<BOT_TOKEN_CUA_BAN>'
chat_id: '<CHAT_ID_NHOM_CRITICAL>' # Chat ID của nhóm/người dùng nhận cảnh báo critical
parse_mode: 'HTML'
send_resolved: true # Gửi thông báo khi cảnh báo được giải quyết
- name: 'telegram-warning'
telegram_configs:
- bot_token: '<BOT_TOKEN_CUA_BAN>'
chat_id: '<CHAT_ID_NHOM_WARNING>' # Chat ID của nhóm/người dùng nhận cảnh báo warning
parse_mode: 'HTML'
send_resolved: true
Lưu ý: Tôi dùng hai chat_id khác nhau cho critical và warning để minh họa khả năng định tuyến. Bạn hoàn toàn có thể sử dụng cùng một chat_id cho tất cả cảnh báo nếu muốn. Hãy thay <BOT_TOKEN_CUA_BAN>, <CHAT_ID_NHOM_CRITICAL>, <CHAT_ID_NHOM_WARNING> bằng thông tin thực tế của bạn.
Bước 4: Tải lại cấu hình Alertmanager
Sau khi thay đổi file alertmanager.yaml, bạn cần tải lại cấu hình để Alertmanager áp dụng các thay đổi.
# Nếu bạn chạy Alertmanager dưới dạng service
sudo systemctl reload alertmanager
# Hoặc thông qua API nếu bạn đã bật (khuyến nghị)
curl -XPOST http://localhost:9093/-/reload
Bước 5: Kiểm tra cảnh báo Telegram
Để kiểm tra, bạn cần tạo một cảnh báo giả trong Prometheus hoặc kích hoạt một tình huống cảnh báo thực tế.
Ví dụ cấu hình Prometheus để tạo cảnh báo test:
Thêm vào file prometheus.yml (hoặc file rule của bạn):
# prometheus.yml
# ...
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093'] # Địa chỉ Alertmanager của bạn
rule_files:
- "alert_rules.yml" # Đảm bảo file này được Prometheus đọc
# ...
File alert_rules.yml:
# alert_rules.yml
groups:
- name: general.rules
rules:
- alert: HighLoadTest
expr: node_load1 > 0.01 # Thay đổi ngưỡng này để dễ dàng kích hoạt
for: 1s
labels:
severity: 'critical' # Để phù hợp với route telegram-critical
annotations:
summary: "Server {{ $labels.instance }} đang có tải cao (test)"
description: "Tải trung bình trong 1 phút là {{ $value }} trên {{ $labels.instance }}."
- alert: LowDiskSpaceTest
expr: node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100 < 90 # Dưới 90% dung lượng trống
for: 1s
labels:
severity: 'warning' # Để phù hợp với route telegram-warning
annotations:
summary: "Ổ đĩa {{ $labels.mountpoint }} trên {{ $labels.instance }} sắp đầy (test)"
description: "Chỉ còn {{ $value | humanizePercentage }} dung lượng trống trên {{ $labels.instance }}."
Tải lại cấu hình Prometheus:
curl -XPOST http://localhost:9090/-/reload
Nếu mọi thứ được cấu hình chính xác, bạn sẽ nhận được tin nhắn Telegram ngay khi các điều kiện cảnh báo này kích hoạt.
2. Cấu hình SMS Notification (Qua Webhook và script tự tạo)
Alertmanager không có tích hợp SMS trực tiếp. Vì vậy, chúng ta sẽ dùng webhook kết hợp với một script tùy chỉnh để gọi đến dịch vụ SMS Gateway. Phương pháp này mang lại sự linh hoạt và khả năng tùy biến cao.
Bước 1: Hiểu về cơ chế Webhook và SMS Gateway
- Webhook: Alertmanager sẽ gửi một yêu cầu HTTP POST đến một URL mà bạn chỉ định khi có cảnh báo. Yêu cầu này chứa thông tin chi tiết về cảnh báo dưới dạng JSON.
- Custom Script/Service: Bạn sẽ chạy một ứng dụng nhỏ (ví dụ: viết bằng Python với Flask). Ứng dụng này sẽ lắng nghe yêu cầu POST từ Alertmanager. Khi nhận được, script sẽ phân tích cú pháp JSON, lấy thông tin cần thiết và gọi API của nhà cung cấp SMS (như Twilio, Nexmo, hoặc dịch vụ SMS nội địa).
Bước 2: Chuẩn bị một SMS Gateway Service (Conceptual)
Để đơn giản, tôi sẽ trình bày một script Python cơ bản. Thực tế, bạn cần tích hợp nó với API của một nhà cung cấp SMS. Script này chỉ minh họa cách nhận webhook và xử lý thông tin.
Giả sử bạn có một file sms_gateway.py như sau:
# sms_gateway.py (Đây là script minh họa, bạn cần tự phát triển theo SMS Provider của mình)
from flask import Flask, request, jsonify
import os
app = Flask(__name__)
# Thay thế bằng số điện thoại nhận SMS thật của bạn
TARGET_PHONE_NUMBER = os.environ.get("TARGET_PHONE_NUMBER", "+849xxxxxxxx")
@app.route('/sms-alert', methods=['POST'])
def send_sms_alert():
try:
alert_data = request.get_json()
# Xử lý thông tin cảnh báo từ Alertmanager
# Bạn cần tùy chỉnh cách bạn muốn nội dung SMS hiển thị
for alert in alert_data.get('alerts', []):
alertname = alert['labels'].get('alertname', 'Unknown Alert')
severity = alert['labels'].get('severity', 'info')
instance = alert['labels'].get('instance', 'Unknown Instance')
summary = alert['annotations'].get('summary'!, 'No Summary')
# Tạo nội dung tin nhắn SMS
sms_message = f"[ITFZS] {severity.upper()} - {alertname} on {instance}: {summary}"
print(f"Sending SMS to {TARGET_PHONE_NUMBER}: {sms_message}")
# --- Ở đây, bạn sẽ gọi API của nhà cung cấp SMS của bạn ---
# Ví dụ với một API giả định:
# import requests
# sms_api_url = "https://api.sms_provider.com/send"
# payload = {
# "to": TARGET_PHONE_NUMBER,
# "message": sms_message,
# "api_key": os.environ.get("SMS_API_KEY")
# }
# response = requests.post(sms_api_url, json=payload)
# if response.status_code == 200:
# print("SMS sent successfully!")
# else:
# print(f"Failed to send SMS: {response.status_code} - {response.text}")
# ---
# Trong ví dụ này, chúng ta chỉ in ra console
print("SMS alert processed (conceptual).")
return jsonify({"status": "success", "message": "SMS alert processed conceptually."}), 200
except Exception as e:
print(f"Error processing SMS alert: {e}")
return jsonify({"status": "error", "message": str(e)}), 500
if __name__ == '__main__':
# Chạy script này trên một cổng (ví dụ 9099)
# Đảm bảo nó có thể truy cập được từ Alertmanager
print("Starting SMS Gateway Mockup on port 9099...")
app.run(host='0.0.0.0', port=9099)
Để chạy script này, bạn cần cài Flask (pip install Flask) và chạy nó:
export TARGET_PHONE_NUMBER="+849xxxxxxxx" # Thay bằng số điện thoại thật của bạn
python sms_gateway.py
Hãy đảm bảo script này chạy liên tục và có thể truy cập được từ Alertmanager (trên cùng server, hoặc qua mạng nếu đặt ở server khác).
Bước 3: Chỉnh sửa cấu hình Alertmanager (alertmanager.yaml) cho SMS
Thêm một receiver mới sử dụng webhook_configs để trỏ đến SMS Gateway script của bạn.
# alertmanager.yaml (Thêm vào cùng file cấu hình Alertmanager ở trên)
# ...
route:
# ... (Phần route hiện có)
routes:
- match:
severity: 'critical'
receiver: 'sms-critical' # Định tuyến cảnh báo critical tới SMS
- match:
severity: 'emergency' # Ví dụ thêm một mức độ cực kỳ khẩn cấp
receiver: 'sms-critical' # Cảnh báo khẩn cấp cũng gửi qua SMS
# ... (Các route khác)
receivers:
# ... (Các receiver Telegram hiện có)
- name: 'sms-critical'
webhook_configs:
- url: 'http://localhost:9099/sms-alert' # URL của custom SMS Gateway script
send_resolved: true
# Bạn có thể cấu hình http_config nếu script của bạn cần xác thực
# http_config:
# basic_auth:
# username: 'smsuser'
# password: 'smspassword'
Thay http://localhost:9099/sms-alert bằng địa chỉ thực tế nơi script sms_gateway.py của bạn đang chạy.
Bước 4: Tải lại cấu hình Alertmanager và kiểm tra
Tải lại cấu hình Alertmanager như đã làm với Telegram.
curl -XPOST http://localhost:9093/-/reload
Bạn có thể cập nhật alert_rules.yml trong Prometheus. Hãy tạo một cảnh báo với severity: 'critical' (hoặc emergency) để kiểm tra. Xem script sms_gateway.py có nhận webhook và in ra thông báo không. Nếu bạn thấy dòng Sending SMS to ... trong console của sms_gateway.py, nghĩa là Alertmanager đã gửi webhook thành công. Bước tiếp theo là tích hợp script này với API của một nhà cung cấp SMS thực tế.
3. Tối ưu hóa cảnh báo và tránh "Alert Fatigue"
Như đã chia sẻ, ‘alert fatigue’ là một vấn đề lớn. Alertmanager cung cấp nhiều tính năng hữu ích để quản lý luồng cảnh báo.
-
Grouping (Nhóm cảnh báo):
Sử dụnggroup_by,group_wait,group_interval,repeat_intervaltrongroute. Điều này giúp bạn không bị ‘spam’ khi nhiều cảnh báo tương tự xuất hiện đồng thời.route: group_by: ['alertname', 'instance', 'severity'] # Nhóm theo tên cảnh báo, instance, và mức độ nghiêm trọng group_wait: 30s # Đợi 30 giây để thu thập thêm cảnh báo trước khi gửi group_interval: 5m # Nếu có cảnh báo mới trong nhóm, đợi thêm 5 phút trước khi gửi lại repeat_interval: 4h # Lặp lại cảnh báo sau mỗi 4 giờ nếu vẫn chưa được giải quyết receiver: 'default-receiver'Với cấu hình này, Alertmanager sẽ nhóm các cảnh báo liên quan đến cùng một vấn đề trên cùng một instance. Nhờ đó, số lượng thông báo bạn nhận được sẽ giảm đáng kể.
-
Inhibition (Ngăn chặn cảnh báo):
Chặn các cảnh báo ‘thứ cấp’ khi một cảnh báo ‘chính’ đã kích hoạt. Ví dụ, nếu cả một server gặp sự cố, bạn chỉ muốn nhận thông báo về server đó. Bạn sẽ không muốn nhận hàng chục cảnh báo về các dịch vụ chạy trên nó.# alertmanager.yaml inhibit_rules: - source_match: severity: 'critical' # Cảnh báo về server down có mức độ 'critical' target_match: severity: 'warning' # Cảnh báo về dịch vụ có mức độ 'warning' equal: ['instance'] # Áp dụng nếu chúng xảy ra trên cùng một instance # Quy tắc này nói rằng: nếu có một cảnh báo 'critical' trên một 'instance' nào đó, # thì ngăn chặn tất cả các cảnh báo 'warning' khác trên cùng 'instance' đó. -
Silences (Tắt tiếng):
Khi bạn biết trước sự kiện bảo trì hoặc một vấn đề tạm thời, hãy tạo mộtsilencequa giao diện web của Alertmanager (thường làhttp://localhost:9093). Tính năng này giúp tạm thời dừng cảnh báo trong một khoảng thời gian nhất định, rất hữu ích khi bạn đang chủ động khắc phục sự cố hoặc nâng cấp hệ thống.
Bằng cách tận dụng các tính năng này một cách thông minh, bạn có thể xây dựng một hệ thống cảnh báo hiệu quả. Hệ thống đó chỉ tập trung vào những thông tin cốt lõi, giúp bạn tránh ‘bội thực cảnh báo’ và phản ứng nhanh chóng hơn trước mọi sự cố.
Kết luận
Thiết lập hệ thống giám sát và cảnh báo hiệu quả là yếu tố sống còn cho mọi hệ thống IT ổn định. Trong bài viết này, bạn đã tìm hiểu cách cấu hình Alertmanager để gửi cảnh báo đến Telegram và SMS. Đây là hai kênh thông báo mạnh mẽ và đáng tin cậy.
Tích hợp Telegram giúp đội ngũ của bạn nhận thông báo nhanh chóng, miễn phí và đầy đủ thông tin. Trong khi đó, SMS đóng vai trò lớp cảnh báo cuối cùng. Nó đảm bảo rằng ngay cả trong những tình huống khắc nghiệt nhất, bạn vẫn nắm được thông tin về sự cố.
Hãy bắt tay cấu hình ngay hôm nay để cải thiện khả năng phản ứng và duy trì ổn định cho hệ thống của bạn. Một hệ thống cảnh báo được cài đặt chuẩn chỉnh không chỉ giúp bạn yên tâm hơn, mà còn là minh chứng cho hạ tầng IT chuyên nghiệp và đáng tin cậy.

