지난 글에서는 Prometheus를 실행하고 rule을 등록했습니다. 이번 글에서는 이 rule을 사용해 알림을 보내는 과정을 해보겠습니다.
alertmanager 설정
Alertmanager는 prometheus와 연동되어 알림을 보내는 컴포넌트입니다.
alertmanager 등록
1// ./docker-compose.yml
2services:
3 # ...
4 alertmanager:
5 image: prom/alertmanager
6 volumes:
7 - ./prometheus/alertmanager.yml:/etc/alertmanager/alertmanager.yml
8 restart: unless-stopped
9 # ...
- scrape_interval: 정보를 가져올 주기를 설정합니다. 기본값은 1분입니다.
alertmanager 설정을 하기 전 API Key를 먼저 준비헤야 합니다. 아래 링크는 Grafana 기술 블로그에 있는 글인데, Slack 알림, Gmail 알림을 설정하는 방법에 대해 알려줍니다. 제 경우에는 연구실 협업 메신저로 슬랙을 사용하고 있어서 슬랙 알림을 구성했지만, 슬랙을 사용하고 계신 것이 아니라면 Gmail을 사용한 알림을 설정하시면 됩니다.
예시는 Gmail을 기본으로 하고, 슬랙 알림 설정은 주석으로 추가했습니다.
1global:
2 resolve_timeout: 1m
3 # slack_api_url: 'https://hooks.slack.com/services/.../'
4
5route:
6 receiver: "gmail-notifications"
7 # receiver: 'slack-notifications'
8 repeat_interval: 6h
9
10receivers:
11 - name: "gmail-notifications"
12 email_configs:
13 - to: sb_receive@somewhere.com
14 from: sender@somewhere.com
15 smarthost: smtp.gmail.com:587
16 auth_username: my_account@gmail.com
17 auth_identity: my_account@gmail.com
18 auth_password: api_key_abc
19 send_resolved: true
20# - name: 'slack-notifications'
21# slack_configs:
22# - channel: '#general'
23# send_resolved: true
24# title: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}"
25# text: >-
26# {{ range .Alerts }}
27# *Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}
28# *Description:* {{ .Annotations.description }}
29# *Details:*
30# {{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
31# {{ end }}
32# {{ end }}
- scrape_interval: 정보를 가져올 주기를 설정합니다. 기본값은 1분입니다.
Prometheus에게 Alertmanager가 있다는 것을 알려줍니다.
1// ./config/prometheus.yml
2# ...
3alerting:
4 alertmanagers:
5 - static_configs:
6 - targets:
7 - alertmanager:9093
8# ...
- scrape_interval: 정보를 가져올 주기를 설정합니다. 기본값은 1분입니다.
Alertmanager 실행, Prometheus 재실행
1// docker-compose.yml
2version: "3.8"
3
4services:
5 prometheus:
6 image: prom/prometheus
7 ports:
8 - 9090:9090
9 volumes:
10 - ./config/prometheus.yml:/etc/prometheus/prometheus.yml
11 - ./config/rules.yml:/etc/prometheus/rules.yml
12 - prom_data:/prometheus
13 restart: unless-stopped
14
15volumes:
16 prom_data:
- image: 도커 허브에 있는 prom/prometheus 이미지를 사용합니다.
- ports: prometheus 웹ui에 접속하기 위해 포트를 노출해줍니다.
- volumes: 위에서 만든 설정 파일을 컨테이너 안으로 연결해서 사용합니다. 또한, prom_data라는 볼륨을 만들어 사용합니다. 이렇게 하면 컨테이너를 삭제하더라도 데이터는 남길 수 있습니다.
설정을 다 했으니 실행을 해봅니다.
1> docker compose up -d alertmanager; docker compose restart prometheus; docker compose logs -f --tail=1000
2
3[+] Running 1/1
4 ✔ Container prom-grafana-monitoring-alertmanager-1 Started 0.4s
5[+] Running 1/1
6 ✔ Container prom-grafana-monitoring-prometheus-1 Started 0.6s
7# ...
8prom-grafana-monitoring-alertmanager-1 | ts=2023-05-13T13:15:19.170Z caller=main.go:240 level=info msg="Starting Alertmanager" version="(version=0.25.0, branch=HEAD, revision=258fab7cdd551f2cf251ed0348f0ad7289aee789)"
9# ...
10prom-grafana-monitoring-alertmanager-1 | ts=2023-05-13T13:15:19.196Z caller=coordinator.go:126 level=info component=configuration msg="Completed loading of configuration file" file=/etc/alertmanager/alertmanager.yml
11prom-grafana-monitoring-alertmanager-1 | ts=2023-05-13T13:15:19.202Z caller=tls_config.go:232 level=info msg="Listening on" address=[::]:9093
12# ...
13prom-grafana-monitoring-prometheus-1 | ts=2023-05-13T13:15:19.865Z caller=main.go:564 level=info msg="Starting Prometheus Server" mode=server version="(version=2.43.0, branch=HEAD, revision=edfc3bcd025dd6fe296c167a14a216cab1e552ee)"
14# ...
15prom-grafana-monitoring-prometheus-1 | ts=2023-05-13T13:15:19.867Z caller=tls_config.go:232 level=info component=web msg="Listening on" address=[::]:9090
16# ...
17prom-grafana-monitoring-prometheus-1 | ts=2023-05-13T13:15:19.874Z caller=main.go:1246 level=info msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml totalDuration=1.474487ms db_storage=791ns remote_storage=1µs web_handler=291ns query_engine=10.083µs scrape=168.374µs scrape_sd=15.416µs notify=12.333µs notify_sd=4.291µs rules=822.701µs tracing=7.75µs
18prom-grafana-monitoring-prometheus-1 | ts=2023-05-13T13:15:19.874Z caller=main.go:990 level=info msg="Server is ready to receive web requests."
19prom-grafana-monitoring-prometheus-1 | ts=2023-05-13T13:15:19.874Z caller=manager.go:974 level=info component="rule manager" msg="Starting rule manager..."
20prom-grafana-monitoring-alertmanager-1 | ts=2023-05-13T13:15:21.180Z caller=cluster.go:706 level=info component=cluster msg="gossip not settled" polls=0 before=0 now=1 elapsed=2.007308236s
21prom-grafana-monitoring-alertmanager-1 | ts=2023-05-13T13:15:29.184Z caller=cluster.go:698 level=info component=cluster msg="gossip settled; proceeding" elapsed=10.011353027s
그럼 이제 localhost:9090/targets, localhost:9090/rules로 접속해봅시다.
우리가 지정했던 대상과 규칙이 잘 적용된 것을 확인할 수 있습니다.
대상 시스템을 여러 개 등록하고 싶다면 prometheus.yml에서 targets, job을 여러 개 등록하고, rules.yml 파일에서 원하는 쿼리를 추가해주면 됩니다.
이번 글에서 사용된 코드는 깃허브에서 확인할 수 있습니다.
Comments