Cấu hình cảnh báo Alertmanager trên Prometheus gửi cảnh báo về Slack
Cấu hình cảnh báo Alertmanager trên Prometheus gửi cảnh báo về Slack
Bài viết này sẽ hướng dẫn các cấu hình AlertManager cảnh báo của Prometheus để gửi cảnh báo về Slack, Alert sẽ dựa vào câu lệnh PromQL để lấy ra các metrics cần thiết để add cảnh báo.
1./ Tạo file alertmanager.yml để trỏ cấu hình bắn cảnh báo vào slack
nano /alertmanager/alertmanager.yml
global:
resolve_timeout: 1m
slack_api_url: 'https://hooks.slack.com/services/XXXXXXXXXX/YYYYYYYYY/xxxxxxxxxxxxxxxxxxxx'
route:
receiver: 'my-monitor'
receivers:
- name: 'my-monitor'
slack_configs:
- channel: '#monitor-dvg-prometheus'
send_resolved: true
icon_url: https://avatars3.githubusercontent.com/u/3380462
title: |-
[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .CommonLabels.alertname }} for {{ .CommonLabels.job }}
{{- if gt (len .CommonLabels) (len .GroupLabels) -}}
{{" "}}(
{{- with .CommonLabels.Remove .GroupLabels.Names }}
{{- range $index, $label := .SortedPairs -}}
{{ if $index }}, {{ end }}
{{- $label.Name }}="{{ $label.Value -}}"
{{- end }}
{{- end -}}
)
{{- end }}
text: >-
{{ range .Alerts -}}
*Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}
*Description:* {{ .Annotations.description }}
*Details:*
{{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
{{ end }}
{{ end }}
Để lấy được link web hook của slack
'https://hooks.slack.com/services/XXXXXXXXXX/YYYYYYYYY/xxxxxxxxxxxxxxxxxxxx'
Có thể tham khảo hướng dẫn sau để tạo link web hooks trên slack:
https://sankalpit.com/how-to-create-slack-incoming-webhook-url/
2./ Tải alertmanager về hoặc có thể sử dụng Docker container.
Cài đặt Docker trên Ubuntu 18
https://fixloinhanh.com/script-cai-dat-docker-container-tu-dong-tren-ubuntu-18/
Tạo 1 Docker compose cho container alertmanager
cat docker-compose.yml
version: '2'
services:
alertmanager:
image: prom/alertmanager
privileged: true
volumes:
- /alertmanager/alertmanager.yml:/alertmanager/alertmanager.yml
command:
- '--config.file=/alertmanager/alertmanager.yml'
ports:
- '9093:9093'
- '9094:9094'
Sau đó khởi tạo container
cd /opt/docker
docker-compose up
Nếu không dùng docker để triển khai alertmanager có thể download file chạy trực tiếp để giải nén và chạy
https://prometheus.io/download/
wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
Lệnh chạy
cd alertmanager-0.21.0.linux-amd64
./alertmanager --config.file /alertmanager/alertmanager.yml
Sau khi chạy xong server sẽ listen thêm port 9093 và 9094
3./ Tạo nội dung của file prometheus.yml sử dụng Docker container để chạy prometheus
#Khong de khoang trong giua 2 dong
global:
#How frequently to scrape targets
scrape_interval: 10s
#How frequently to evaluate rules
evaluation_interval: 10s
# external_labels:
# monitor: 'my-monitor'
#Rules and alerts are read from the specified file(s)
rule_files:
# - /alertmanager/alertmanager.yml
- /prometheus/rules.yml
#Alerting specifies settings related to the Alertmanager
alerting:
alertmanagers:
- static_configs:
# - targets: ['10.0.155.200:9093']
- targets:
# Alertmanager's default port is 9093
- localhost:9093
- 10.0.155.200:9093
- 127.0.0.1:9093
###############################
scrape_configs:
- job_name: prometheus
scrape_interval: 5s
scrape_timeout: 5s
metrics_path: /metrics
scheme: http
static_configs:
- targets: ['localhost:9090']
# - localhost:9090
###############################
- job_name: node_exporter
scrape_interval: 5s
scrape_timeout: 5s
metrics_path: /metrics
scheme: http
static_configs:
- targets: ['10.0.155.200:9100']
# - localhost:9100
###############################
- job_name: winserver2012
scrape_interval: 5s
scrape_timeout: 5s
metrics_path: /metrics
scheme: http
static_configs:
- targets: ['10.0.1.14:9182']
###############################
- job_name: vmware_vcenter
scrape_interval: 120s
scrape_timeout: 120s
metrics_path: /metrics
static_configs:
- targets: ['10.0.155.200:9274']
4./ Tạo nội dung file rules.yml
file rules.yml sẽ có nhiệm vụ chọn lọc những metrics để đưa ra cảnh báo.
cat /etc/prometheus/rules.yml
groups:
- name: AllInstances
rules:
- alert: InstanceDown
# Condition for alerting
expr: up == 0
for: 1m
# Annotation - additional informational labels to store more information
annotations:
summary: 'Instance {{ $labels.instance }} down'
description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute.'
# Labels - additional labels to be attached to the alert
labels:
severity: 'critical'
# Tạo cảnh báo nếu có VM bị down.
- name: VMDown
rules:
- alert: VMDown
# Condition for alerting
expr: vmware_vm_power_state == 0
for: 1m
# Annotation - additional informational labels to store more information
annotations:
summary: 'Instance {{ $labels.vm_name }} down'
description: '{{ $labels.vm_name }} of job {{ $labels.job }} has been down for more than 1 minute.'
# Labels - additional labels to be attached to the alert
labels:
severity: 'critical'
5./ Cài đặt Prometheus qua Docker container
sudo useradd -rs /bin/false prometheus
sudo mkdir /etc/prometheus
cd /etc/prometheus/ && sudo touch prometheus.yml
sudo mkdir -p /data/prometheus
sudo chown prometheus:prometheus /data/prometheus /etc/prometheus/*
nano /etc/prometheus/prometheus.yml
#paste
# A scrape configuration scraping a Node Exporter and the Prometheus server
# itself.
scrape_configs:
# Scrape Prometheus itself every 10 seconds.
- job_name: 'prometheus'
scrape_interval: 10s
target_groups:
- targets: ['localhost:9090']
Chắc chắn rằng không có port nào đang chiếm port 9090
sudo netstat -tulpn | grep 9090
Kiểm tra UID và GID của user prometheus
cat /etc/passwd | grep prometheus
prometheus:x:999:998:/home/prometheus:/bin/false
Tiến hành khởi tạo Docker container
docker run -d -p 9090:9090 --user 999:998 \
--net=bridge \
-v /etc/prometheus/:/prometheus \
prom/prometheus \
--config.file="/prometheus/prometheus.yml" \
--storage.tsdb.path="/prometheus"
Kết quả
2973f82f1fea3ece389b265074f2d49f2bc3c9119e2cc73349b1993a880fe840
Như vậy đã Map được port 9090 của server cài Docker vào container và trỏ các file cấu hình tương ứng vị trí.
Lưu ý mở port 9090 trên server cài Docker
Để truy cập được vào container prometheus tiến hành sử dụng lệnh
docker exec -it prometheus sh
Lưu ý:
Lỗi khi tiến hành exec vào container mode bash thay vì sh : OCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown
Xử lý
# https://github.com/docker/for-linux/issues/246
6./ Truy cập vào prometheus qua Browser để kiểm tra lại
http://10.0.155.200:9090/graph
Tham khảo:
# https://devconnected.com/how-to-install-prometheus-with-docker-on-ubuntu-18-04/
Truy cập vào link quản lý của prometheus
http://10.0.155.200:9090/alerts
Truy cập vào link quản lý của AlertManager
http://10.0.155.200:9093/#/alerts?silenced=false&inhibited=false&active=true
Lưu ý:
Tạo Docker prometheus như sau: (mục đích map 2 file prometheus.yml và rules.yml sang docker.)
docker run -d -p 9090:9090 --user 999:998 \
--net=bridge \
-v /etc/prometheus/:/prometheus \
prom/prometheus \
--config.file="/prometheus/prometheus.yml" \
--storage.tsdb.path="/prometheus"
Link api check Data Alert của Alertmanager
http://yourIP:9093/api/v1/alerts
Thử tắt 1 instance để test
Cảnh báo bắn vào slack, chỉ khi xử lý xong hết cảnh báo thì mới có Alert trở lại, hoặc bạn có thể tuỳ chỉnh cảnh báo.
Tham khảo:
Chúc các bạn thành công.