*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:

https://myaccount.google.com/apppasswords

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ố.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *