Cài đặt Alert Manager (Prometheus) để gửi mail khi có cảnh báo

Cần có kiến thức cơ bản về docker như image, container docker-compose, volumes, port, service,...

OS: Centos 8

1. Tổng quan

Alert trong Prometheus được chia làm 2 phần là Rule trong Prometheus Server và Alert Manager. 

Rule có 3 trạng thái là inactive, pending, firing. Prometheus Server sẽ check các rule này, nếu thỏa mãn điều kiện thì sẽ đẩy sang cho Alert Manager xử lý. Alert Manager sẽ gửi quản lý các alert vừa nhận, gửi thông báo qua các kênh mail, chat,...

Vậy nên sẽ phải cấu hình các Rule ở Prometheus Server, cấu hình kết nối Prometheus Server và Alert Manager và cấu hình cho AlertManager để xử lý alert.

2. Pull Image

dockker pull prom/alertmanager

3. docker-compose.yml

Tạo 2 thư mục /etc/prometheus-docker/alertmanager/config, /etc/prometheus-docker/alertmanager/data

mkdir -p /etc/prometheus-docker/alertmanager/data

Trong file docker-compose.yml, add thêm nội dung bên dưới để start Alert Manager:

  alertmanager:
    image: prom/alertmanager
    restart: unless-stopped
    ports:
      - 9093:9093
    volumes:
      - /etc/prometheus-docker/alertmanager/config:/config
      - /etc/prometheus-docker/alertmanager/data:/data
    command: --config.file=/config/alertmanager.yml --log.level=debug

4. prometheus.yml

Trong file prometheus.yml, add thêm đoạn bên dưới để cấu hình kết nối với Alert Manager và cấu hình tên file chứa rule. 

alerting:
  alertmanagers:
    - static_configs:
      - targets:
          - "192.168.100.27:9093"
rule_files:
      - "windows-rule.yml"

Rule sẽ tạo ở bước sau.

5. Tạo file rule

Các file rule sẽ có định dạng yml và được đặt ngang cấp với file prometheus.yml. Có thể tạo nhiều file rule (vd: windows-rule.yml, cisco-rule.yml, linux-rule.yml, fortigate.yml,...)

Prometheus Server sẽ đọc các Rule được định nghĩa ở đây. Bên dưới là 1 ví dụ định nghĩa rule cho windows:

############# Define Rule Alert ###############
# my global config
############# Define Rule Alert ###############
groups:
- name: Windows-alert
  rules:

################ Memory Usage High
  - alert: Memory Usage High
    expr: 100*(windows_cs_physical_memory_bytes)*0 < 1
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "Memory Usage (instance {{ $labels.instance }})"
      description: "Memory Usage is more than 90%\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

################ CPU Usage High
  - alert: Cpu Usage High
    expr: 100 - (avg by (instance) (irate(wmi_cpu_time_total{mode="idle"}[2m])) * 100) > 80
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "CPU Usage (instance {{ $labels.instance }})"
      description: "CPU Usage is more than 80%\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

################ Disk Usage
  - alert: DiskSpaceUsage
    expr: 100.0 - 100 * ((wmi_logical_disk_free_bytes{} / 1024 / 1024 ) / (wmi_logical_disk_size_bytes{}  / 1024 / 1024)) > 95
    for: 1m
    labels:
      severity: error
    annotations:
      summary: "Disk Space Usage (instance {{ $labels.instance }})"
      description: "Disk Space on Drive is used more than 95%\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

################ ServiceStatus
  - alert: ServiceStatus
    expr: wmi_service_status{status="ok"} != 1
    for: 1m
    labels:
      severity: error
    annotations:
      summary: "Service Status (instance {{ $labels.instance }})"
      description: "Windows Service state is not OK\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

################ CollectorError
  - alert: CollectorError
    expr: wmi_exporter_collector_success == 0
    for: 1m
    labels:
      severity: error
    annotations:
      summary: "Collector Error (instance {{ $labels.instance }})"
      description: "Collector {{ $labels.collector }} was not successful\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

6. alertmanager.yml

Ở bước 3, có dòng --config.file=/config/alertmanager.yml, tức là sẽ phải tạo file alertmanager.yml nằm ở  /etc/prometheus-docker/alertmanager/config

vi  /etc/prometheus-docker/alertmanager/config/alertmanager.yml

Sau đó add nội dung bên dưới

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 3600s
  receiver: 'email'
receivers:
- name: 'email'
  email_configs:
  - to: 'to@gmail.com'
    from: 'from@gmail.com'
    smarthost: 'smtp.gmail.com:587'
    auth_username: 'from@gmail.com'
    auth_identity: 'from@gmail.com'
    auth_password: 'abcbs12123'

7. Kết quả

Nếu Prometheus đọc được Rule thì trên Web sẽ hiển thị như hình. Nếu 1 node nào đó đang giám sát mà thỏa mãn điều kiện thì rule sẽ được chuyển từ Inactive sang Pending, và sau cùng là Firing.

Nếu Firing được thì trên Alert Manager​​​ sẽ hiển thị như sau:

Đây là kết quả Alert Manager gửi về email: