Prometheus 및 Grafana로 Docker 모니터링

Docker 및 Docker-compose를 설치했다는 가정하에 작성

  • Docker-compose.yml 작성
version: '3'

services:
  node_exporter:
    image: prom/node-exporter:latest
    container_name: node_exporter
    ports:
      - "9100:9100"
    restart: always

  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - /home/rocky/dev_monitor/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - /home/rocky/dev_monitor/prometheus/alert.rules.yml:/etc/prometheus/alert.rules.yml
    ports:
      - "9090:9090"
    restart: always

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    volumes:
      - /home/rocky/dev_monitor/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - /home/rocky/dev_monitor/alertmanager/templates:/etc/alertmanager/templates
    ports:
      - "9093:9093"
    restart: always

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana-data:/var/lib/grafana
    restart: always

volumes:
  grafana-data:
  • node_exporter : 시스템 지표 수집
  • Prometheus : metric 수집기
  • alertmanager : 각종 알림 관리자
  • Grafana : 모니터링 시각화 서비스

Docker container 형식으로 돌리는 것이기 때문에, 사라지면 안되는 file들은 mount를 시켜야 한다.

mount를 설정한 부분

prometheus: 
volumes:
      - /home/rocky/dev_monitor/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - /home/rocky/dev_monitor/prometheus/alert.rules.yml:/etc/prometheus/alert.rules.yml

alertmanager: 
volumes:
      - /home/rocky/dev_monitor/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - /home/rocky/dev_monitor/alertmanager/templates:/etc/alertmanager/templates

grafana:
volumes:
      - grafana-data:/var/lib/grafana

각각 경로에 맞게 폴더와 파일을 만든 뒤, Docker container로 올릴 때, mount 해서 올리자.


📌 참고 | Mount 내용

alertmanager

  • alertmanager.yml
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'instanceDown']
  group_wait: 20s
  group_interval: 5m
  repeat_interval: 60m
  receiver: 'telegram'

receivers:
- name: 'telegram' # 텔레그램 외에도 많은 플랫폼이 있음. 
  telegram_configs:
  - bot_token: '봇 토큰'
    chat_id: 챗_id
    send_resolved: true
    message: '{{ template "monitoring-template" . }}' # 내가 만든 템플릿.
templates:
- '/etc/alertmanager/templates/*.tmpl' # 템플릿 경로
  • telegram.tmpl (서버 다운 될 시, 알림 템플릿) — 예시
{{ define "monitoring-template" }}
** {{ if eq .Status "firing" }}🔥{{ else if eq .Status "resolved" }}✅{{ end }} {{ .Status }} **

{{ range .Alerts }}
  Instance: {{ .Labels.instance }}
  Job: {{ .Labels.job }}

  {{ if eq .Status "firing" }}
    {{ .Annotations.summary }} - down
  {{ else if eq .Status "resolved" }}
    {{ .Annotations.summary }} - up
  {{ else }}
    {{ .Annotations.summary }}
  {{ end }}
{{ end }}
{{ end }}

Prometheus

  • alert.rules.yml

알림 규칙을 정의한 파일내용이다.

사용자에 맞게 유동적으로 변경가능하다.

groups:
- name: server_down
  rules:
  - alert: InstanceDown
    expr: up == 0
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} "
      description: "{{ $labels.instance }} of job {{ $labels.job }} "
  • Prometheus.yml
# 해당 파일은 서버정보가 담겨 있기 때문에 생략.
# 아래와 같은 형식으로 서버마다 작성하면 됨.

- job_name: "Job-name"
    static_configs:
      - targets: ["IP_addr:9100"]

댓글

댓글 남기기