Bài 3: Khám Phá PNG Stack - Xử lý luồng cảnh báo với Alertmanager
Nội dung
*Bài này mình sẽ đi từ kiến thức nền tảng để các bạn nắm được cách hoạt động và Lab để cả những bạn mới cũng có thể dễ dàng hiểu và tự tin với các bài thực tế tiếp theo.
1. Giới thiệu về Alertmanager và Grafana
Ở phần trước, chúng ta đã có Node Exporter và Prometheus để thu thập dữ liệu. Trong bài viết này, chúng ta sẽ tập trung vào Alertmanager để xử lý những dữ liệu đó và thông báo với quản trị viên.
Alertmanager là một lĩnh vực khá rộng ngoài PNG Stack, Trong phạm vi của bài này, mình sẽ hướng dẫn cấu hình minh họa một rule cơ bản cho Prometheus và đẩy cảnh báo về các kênh liên lạc.
2. Luồng Cảnh Báo Của Alertmanager
Trong PNG Stack, công việc cảnh báo được thực hiện qua hai bước chính:
- Bước 1: Prometheus liên tục đánh giá các quy tắc cảnh báo đã được cấu hình. Khi điều kiện cảnh báo thỏa mãn, Prometheus sẽ gửi cảnh báo này đến Alertmanager.
- Bước 2: Alertmanager nhận các cảnh báo từ Prometheus, sau đó xử lý và chuyển tiếp thông báo qua các kênh như Email, Telegram, Slack, v.v.
Điều này giúp đảm bảo rằng người quản trị hệ thống sẽ nhận được thông báo kịp thời khi có sự cố, từ đó có thể nhanh chóng phản ứng và giải quyết vấn đề.
3. Cài đặt và tích hợp Alertmanager với Prometheus
Alerting với Prometheus được chia làm hai phần:
- Alerting rules trong Prometheus server gửi alerts tới Alertmanager. (*)
- Alertmanager sẽ quản lý việc cảnh báo, bao gồm silencing, inhibition, aggregation và gửi cảnh báo qua các phương thức như email, on-call notification systems, và chat platforms. (**)
Ở đây mình Demo tất cả các thành phần trên một Server với IP 192.168.24.120
3.1. Cài đặt Prometheus
Tải Alertmanager: https://prometheus.io/download/#alertmanager
# wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz # tar -xzf alertmanager-0.26.0.linux-amd64.tar.gz # cd alertmanager-0.26.0.linux-amd64 # sudo mv alertmanager /usr/local/bin/ # alertmanager --version
Tạo rule alert trên Prometheus server (*)
Các bạn tạo một file alert-rules.yml trong thư mục /etc/prometheus/alert-rules.yml ví dụ một rule cơ bản như sau:
Nhóm “Linux Alert”, cảnh báo “Instance Down”, điều kiện “up == 0”, trong vòng “1m”
groups: - name: Linux Alert rules: - alert: Instance Down expr: up == 0 for: 1m
Với up là metrics để đánh giá một target đang hoạt động, up == 0 tức target đang down
*Chi tiết về phần viết rules mình sẽ để dành ở các bài sau, kiểm tra syntax:
# promtool check rules /etc/prometheus/alert-rules.yml
Khai báo service Alertmanager với Prometheus (*):
Các bạn mở file cấu hình /etc/prometheus/prometheus.yml và sửa phần cấu hình alerting thành địa chỉ của Alertmanager để gửi cảnh báo tới Alertmanager.
Ở phần rule_files trỏ thêm file alert rules vừa tạo (có thể có nhiều rule cũng sẽ liệt kê ở đây)
Chạy lại prometheus server và quay lại prometheus UI, vào phần Alert sẽ thấy các rule và alert:
# sudo systemctl restart prometheus.service
Giả sử các bạn down server đi để điều kiện up == 0 là đúng.
Tại Prometheus, các bạn truy vấn metrics up sẽ được nội dung tương tự khai báo trong phần scrape_config:
Sang thẻ Target trong Prometheus cũng thấy tình trạng Job đã down (lưu ý ở đây là Job mà chúng ta cấu hình down chứ không phải thuộc Alert)
Sau 1 phút, Prometheus sẽ chuyển sang cảnh báo đỏ và đồng thời bắn thông tin này cho Alertmanager (nếu có).
(*) Lưu ý là các công việc này thuộc phạm vi của Prometheus và chưa hề động tới Alertmanager vì chúng ta chưa cấu hình Alertmanager.
4. Cách thức hoạt động và các khái niệm quan trọng trong Alertmanager
Alertmanager là một thành phần quan trọng trong hệ thống giám sát, đảm nhiệm việc quản lý và xử lý các cảnh báo từ Prometheus. Ngoài ra Alertmanager còn có khả năng triển khai dưới dạng phân tán để đảm bảo tính HA khi hệ thống gặp sự cố.
Alertmanager hỗ trợ nhiều cơ chế định tuyến cảnh báo (Alert Routing) mạnh mẽ. Dưới đây là một số khái niệm chính:
4.1. Nhóm (Grouping) trong Alertmanager
Grouping là khái niệm giúp gộp các cảnh báo có tính chất tương tự lại thành một nhóm cảnh báo duy nhất. Ví dụ, khi một máy chủ gặp sự cố, nhiều dịch vụ liên quan có thể bị ảnh hưởng, dẫn đến việc tạo ra nhiều cảnh báo. Thay vì gửi đi hàng loạt cảnh báo riêng lẻ, Alertmanager sẽ nhóm chúng lại dựa trên các thuộc tính chung như tên cụm (cluster) hoặc tên cảnh báo (alertname). Điều này giúp giảm thiểu số lượng thông báo nhận được và tập trung vào giải quyết vấn đề chính.
4.2. Kiểm Soát (Inhibition) trong Alertmanager
Inhibition là khả năng tạm dừng các cảnh báo nếu có một cảnh báo ưu tiên cao hơn đang hoạt động. Ví dụ, nếu một cảnh báo về sự cố toàn cụm đã được kích hoạt, các cảnh báo liên quan đến các dịch vụ nhỏ hơn trong cụm này có thể được tạm dừng. Điều này ngăn ngừa việc gửi đi quá nhiều cảnh báo không cần thiết, giúp quản trị viên tập trung vào vấn đề lớn hơn.
4.3 Tắt Tiếng (Silences) trong Alertmanager
Silences cho phép quản trị viên tạm thời tắt cảnh báo trong một khoảng thời gian cụ thể. Điều này rất hữu ích trong trường hợp cần bảo trì hệ thống, khi mà các thay đổi có thể gây ra nhiều cảnh báo không cần thiết. Silences được cấu hình dựa trên các bộ khớp (matching labels), giống như một cây định tuyến, đảm bảo rằng chỉ những cảnh báo phù hợp mới bị tắt tiếng.
5. Cấu hình xử lý cảnh báo trên Alertmanager
(**) Bây giờ sẽ đến phần cấu hình Alertmanager xử lý cảnh báo. Alertmanager có một số kênh liên lạc phổ biến: Telegram, Email, Slack, Webhook,…
Ở đây mình sẽ minh họa là Gmail.
Để chuẩn bị cần tạo App password/mật khẩu ứng dụng tại tài khoản google:
Tạo file cấu hình alert notify đến email. Các bạn tạo file cấu hình Alertmanager tại vị trí /etc/alertmanager/alertmanager.yml
# sudo mkdir /etc/alertmanager/ # sudo vi /etc/alertmanager/alertmanager.yml
global: resolve_timeout: 5m route: group_by: ["alertname"] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: "email" receivers: - name: "email" email_configs: - to: "example@gmail.com" from: "example@gmail.com" smarthost: "smtp.gmail.com:587" auth_identity: "example@gmail.com" auth_secret: "" auth_username: "example@gmail.com"
Giải thích:
- Group by, group wait, group interval là thời gian xử lý các cảnh báo mới cùng nhóm (ở đây là cùng tên cảnh báo)
- Repeat interval là thời gian lặp lại thông báo khi cảnh báo vẫn tiếp diễn liên tục
- Receivers ở đây mình đặt là email và cấu hình SMTP của gmail (các bạn có thể dùng một tài khoản email của công ty gửi sang một email nào đó hoặc tự gửi chính mình)
- Auth_secret là mã ứng dụng bạn vừa tạo
Tạo dịch vụ chạy alertmanager dưới nền:
# sudo tee /etc/systemd/system/alertmanager.service << EOF [Unit] Description=Alertmanager Wants=network-online.target After=network-online.target [Service] User=root Type=simple Restart=always ExecStart=/usr/local/bin/alertmanager --config.file /etc/alertmanager/alertmanager.yml --storage.path /var/lib/alertmanager/ [Install] WantedBy=multi-user.target EOF
Chạy dịch vụ:
# sudo systemctl daemon-reload # sudo systemctl start alertmanager # sudo systemctl enable alertmanager # sudo systemctl status alertmanager
Mặc định alertmanager sẽ chạy với port 9093, các bạn có thể Silence cảnh báo hoặc lấy Link cảnh báo từ đây
Các logs cũng như cảnh báo cũng sẽ hiển thị dưới dạng time series tại Prometheus
6. Kết Luận
Alertmanager cung cấp khả năng cảnh báo kịp thời dựa trên các tiêu chí định nghĩa trước. Hiểu rõ cách thức hoạt động của Alertmanager cùng với các khả năng Alert Routing sẽ giúp quản trị viên tối ưu hóa quá trình giám sát và phản ứng với sự cố.