- Published on
Prometheus와 Docker compose를 이용한 모니터링 구성2
- Authors
- Name
- 신주용
지난 글에서는 Prometheus를 실행하고 rule을 등록했습니다. 이번 글에서는 이 rule을 사용해 알림을 보내는 과정을 해보겠습니다.
alertmanager 설정
Alertmanager는 prometheus와 연동되어 알림을 보내는 컴포넌트입니다.
alertmanager 등록
./docker-compose.yml
services:
# ...
alertmanager:
image: prom/alertmanager
volumes:
- ./prometheus/alertmanager.yml:/etc/alertmanager/alertmanager.yml
restart: unless-stopped
# ...
- scrape_interval: 정보를 가져올 주기를 설정합니다. 기본값은 1분입니다.
alertmanager 설정을 하기 전 API Key를 먼저 준비헤야 합니다. 아래 링크는 Grafana 기술 블로그에 있는 글인데, Slack 알림, Gmail 알림을 설정하는 방법에 대해 알려줍니다. 제 경우에는 연구실 협업 메신저로 슬랙을 사용하고 있어서 슬랙 알림을 구성했지만, 슬랙을 사용하고 계신 것이 아니라면 Gmail을 사용한 알림을 설정하시면 됩니다.
예시는 Gmail을 기본으로 하고, 슬랙 알림 설정은 주석으로 추가했습니다.
./config/alertmanager.yml
global:
resolve_timeout: 1m
# slack_api_url: 'https://hooks.slack.com/services/.../'
route:
receiver: "gmail-notifications"
# receiver: 'slack-notifications'
repeat_interval: 6h
receivers:
- name: "gmail-notifications"
email_configs:
- to: cheesecat47@gmail.com
from: cheesecat47@gmail.com
smarthost: smtp.gmail.com:587
auth_username: cheesecat47@gmail.com
auth_identity: cheesecat47@gmail.com
auth_password: api_key_abc
send_resolved: true
# - name: 'slack-notifications'
# slack_configs:
# - channel: '#general'
# send_resolved: true
# title: "{{ range .Alerts }}{{ .Annotations.summary }}\n{{ end }}"
# text: >-
# {{ range .Alerts }}
# *Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}
# *Description:* {{ .Annotations.description }}
# *Details:*
# {{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
# {{ end }}
# {{ end }}
- scrape_interval: 정보를 가져올 주기를 설정합니다. 기본값은 1분입니다.
Prometheus에게 Alertmanager가 있다는 것을 알려줍니다.
./config/prometheus.yml
# ...
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
# ...
- scrape_interval: 정보를 가져올 주기를 설정합니다. 기본값은 1분입니다.
Alertmanager 실행, Prometheus 재실행
docker-compose.yml
version: "3.8"
services:
prometheus:
image: prom/prometheus
ports:
- 9090:9090
volumes:
- ./config/prometheus.yml:/etc/prometheus/prometheus.yml
- ./config/rules.yml:/etc/prometheus/rules.yml
- prom_data:/prometheus
restart: unless-stopped
volumes:
prom_data:
- image: 도커 허브에 있는 prom/prometheus 이미지를 사용합니다.
- ports: prometheus 웹ui에 접속하기 위해 포트를 노출해줍니다.
- volumes: 위에서 만든 설정 파일을 컨테이너 안으로 연결해서 사용합니다. 또한, prom_data라는 볼륨을 만들어 사용합니다. 이렇게 하면 컨테이너를 삭제하더라도 데이터는 남길 수 있습니다.
설정을 다 했으니 실행을 해봅니다.
> docker compose up -d alertmanager; docker compose restart prometheus; docker compose logs -f --tail=1000
[+] Running 1/1
✔ Container prom-grafana-monitoring-alertmanager-1 Started 0.4s
[+] Running 1/1
✔ Container prom-grafana-monitoring-prometheus-1 Started 0.6s
# ...
prom-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)"
# ...
prom-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
prom-grafana-monitoring-alertmanager-1 | ts=2023-05-13T13:15:19.202Z caller=tls_config.go:232 level=info msg="Listening on" address=[::]:9093
# ...
prom-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)"
# ...
prom-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
# ...
prom-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
prom-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."
prom-grafana-monitoring-prometheus-1 | ts=2023-05-13T13:15:19.874Z caller=manager.go:974 level=info component="rule manager" msg="Starting rule manager..."
prom-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
prom-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
파일에서 원하는 쿼리를 추가해주면 됩니다.
이번 글에서 사용된 코드는 깃허브에서 확인할 수 있습니다.