LA FORET ROUGE

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

⏱ 2m | Categories: CLOUD | Tags: DOCKER , METRIC , MONITORING , PROMETHEUS

Setup Prometheus monitoring system using Docker compose.

지난 글에서는 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을 사용한 알림을 설정하시면 됩니다.

https://grafana.com/blog/2020/02/25/step-by-step-guide-to-setting-up-prometheus-alertmanager-with-slack-pagerduty-and-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

Link copied to clipboard!