Prometheus + Grafana + Docker Compose 설치

Prometheus, Grafana를 Docker에 설치하고 작동하는 방법에 대해서 설명한다.

Prometheus, Grafana를 Docker에 설치

개요

Prometheus, Grafana를 Docker compose로 설치하고 작동을 시켜 보도록 하겠다.

Docker 설정

Prometheus

Prometheus를 Docker에 설치하기 위한 파일 및 디렉터리를 구성해 보도록 하겠다.

  1. 먼저 설치 디렉터리를 적당한 곳에 생성한다.
mkdir prometheus-grafana
cd prometheus-grafana
  1. Docker를 실행하기 위해 docker-compose.yml 파일을 생성한다. prometheus-grafana/docker-compose.yml
version: '3.7'  # 파일 규격 버전
services:       # 이 항목 밑에 실행하려는 컨테이너 들을 정의
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus/config:/etc/prometheus
      - ./prometheus/volume:/prometheus
    ports:
      - 9090:9090 # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    command: # web.enalbe-lifecycle은 api 재시작없이 설정파일들을 reload 할 수 있게 해줌
      - '--web.enable-lifecycle'
      - '--config.file=/etc/prometheus/prometheus.yml'
    restart: always
    networks:
      - promnet

networks:
  promnet:
    driver: bridge
  • Prometheus DockerHub image
  • Prometheus의 저장 디렉터리는 ./prometheus/volume으로 지정하였다.
  • Prometheus의 설정 디렉터리는 ./prometheus/config으로 지정하였다.
  1. Prometheus 관련 설정 파일이 위치할 디렉터리를 생성한다.
mkdir prometheus
mkdir prometheus/config
  1. /prometheus/config 디렉터리 안에는 설정 파일(prometheus.yml, rule.yml)을 생성한다.

참조: Prometheus Configuration

prometheus-grafana/prometheus/config/prometheus.yml

global:
  scrape_interval: 15s     # scrap target의 기본 interval을 15초로 변경 / default = 1m
  scrape_timeout: 15s      # scrap request 가 timeout 나는 길이 / default = 10s
  evaluation_interval: 2m  # rule 을 얼마나 빈번하게 검증하는지 / default = 1m

  # Attach these labels to any time series or alerts when communicating with
  # external systems (federation, remote storage, Alertmanager).
  external_labels:
    monitor: 'codelab-monitor'       # 기본적으로 붙여줄 라벨
  query_log_file: query_log_file.log # prometheus의 쿼리 로그들을 기록, 없으면 기록안함

# 규칙을 로딩하고 'evaluation_interval' 설정에 따라 정기적으로 평가한다.
rule_files:
  - "rule.yml"  # 파일 위치는 prometheus.yml 이 있는 곳과 동일 위치
  - "rule2.yml" # 여러개 가능

# 매트릭을 수집할 엔드포인드로 여기선 Prometheus 서버 자신을 가리킨다.
scrape_configs:
  # 이 설정에서 수집한 타임시리즈에 `job=<job_name>`으로 잡의 이름을 설정한다.
  # metrics_path의 기본 경로는 '/metrics'이고 scheme의 기본값은 `http`다
  - job_name: 'monitoring-item' # job_name 은 모든 scrap 내에서 고유해야함
    scrape_interval: 10s      # global에서 default 값을 정의해주었기 떄문에 안써도됨
    scrape_timeout: 10s       # global에서 default 값을 정의해주었기 떄문에 안써도됨
    metrics_path: '/asdf'     # 옵션 - prometheus가 metrics를 얻기위해 참조하는 URI를 변경할 수 있음 | default = /metrics
    honor_labels: false       # 옵션 - 라벨 충동이 있을경우 라벨을 변경할지설정(false일 경우 라벨 안바뀜) | default = false
    honor_timestamps: false   # 옵션 - honor_labels이 참일 경우, metrics timestamp가 노출됨(true일 경우) | default = false
    scheme: 'http'            # 옵션 - request를 보낼 scheme 설정 | default = http
    params:                   # 옵션 - request요청 보낼 떄의 param
      user-id: ['myemail@email.com']

    # 그 외에도 authorization 설정 
    # service discovery 설정(sd)

    # 실제 scrap 하는 타겟에 관한 설정
    static_configs:
      - targets: ['localhost:9090', 'localhost:9100', 'localhost:80'] ## prometheus, node-exporter, cadvisor  
        labels: # 옵션 - scrap 해서 가져올 metrics 들 전부에게 붙여줄 라벨
          service : 'monitor-1'
    
    # relabel_config - 스크랩되기 전의 label들을 수정
    # metric_relabel_configs - 가져오는 대상들의 레이블들을 동적으로 다시작성하는 설정(drop, replace, labeldrop)

prometheus-grafana/prometheus/config/rule.yml

groups:
- name: example # 파일 내에서 unique 해야함
  rules:

  # Alert for any instance that is unreachable for >5 minutes.
  - alert: InstanceDown
    expr: up == 0
    for: 5m
    labels:
      severity: page
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."

  # Alert for any instance that has a median request latency >1s.
  - alert: APIHighRequestLatency
    expr: api_http_request_latencies_second{quantile="0.5"} > 1
    for: 10m
    annotations:
      summary: "High request latency on {{ $labels.instance }}"
      description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"
  1. /prometheus 디렉터리의 권한을 docker에서 수정할 수 있도록 변경한다.
sudo chmod -R 777 ./prometheus

최종 파일을 다 생성하면 아래와 같은 구조가 된다.

.
├── docker-compose.yml
└── prometheus
    └── config
        ├── prometheus.yml
        └── rule.yml

Grafana

Grafana는 데이터 시각화, 모니터링 및 분석을 위한 오픈소스 플랫폼이다.

  1. docker-compose.yml에서 services:아래 Grafana 설정 내용을 추가한다.
  grafana:
    image: grafana/grafana
    container_name: grafana
    # user: "$GRA_UID:$GRA_GID"
    ports:
      - 3000:3000 # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
    volumes:
      - ./grafana/volume:/var/lib/grafana
    restart: always
    networks:
      - promnet

Docker 실행

도커 이미지을 생성하고, 컨테이너의 시작을 한꺼번에 처리하는 명령어를 실행시킨다.

docker compose up -d

컨테이너를 중지하려면 다음 명령을 실행한다.

docker compose stop

컨테이너를 다시 시작하려면 다음 명령을 실행한다.

docker compose start

실행한 후에는 아래과 같은 volume 디렉터리가 생기는 것을 볼 수 있다.

.
├── docker-compose.yml
├── grafana
│   └── volume
│       ├── grafana.db
│       ├── grafana.db-journal
│       └── plugins
└── prometheus
    ├── config
    │   ├── prometheus.yml
    │   ├── query_log_file.log
    │   └── rule.yml
    └── volume
        └── data
            ├── chunks_head
            ├── lock
            ├── queries.active
            └── wal
                └── 00000000

접속 실행

  • Prometheus
    • http://localhost:9090
  • Grafana
    • http://localhost:3000
      • 기본 계정 ID/PW: admin/admin

참조

설정 파일을 GitHub에 올려 두었다.




최종 수정 : 2022-12-27