Cấu hình cảnh báo Alertmanager trên Prometheus gửi cảnh báo về Slack

Cu hình cnh 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:​​ 

https://grafana.com/blog/2020/02/25/step-by-step-guide-to-setting-up-prometheus-alertmanager-with-slack-pagerduty-and-gmail/

Chúc các bạn thành công.

 

SaKuRai

Xin chào, Mình là Sakurai. Blog này là nơi để note lại và chia sẻ những kiến thức, kinh nghiệm mà mình và anh em trong Team. Cảm ơn các bạn đã quan tâm theo dõi!

You may also like...

Leave a Reply