La foret rouge
Published on

Prometheus와 Docker compose를 이용한 모니터링 구성2

Authors
  • avatar
    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을 사용한 알림을 설정하시면 됩니다.

https://grafana.com/blog/2020/02/25/step-by-step-guide-to-setting-up-prometheus-alertmanager-with-slack-pagerduty-and-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 파일에서 원하는 쿼리를 추가해주면 됩니다.

이번 글에서 사용된 코드는 깃허브에서 확인할 수 있습니다.