이번에는 EC2 인스턴스의 Metric을 Prometheus로 수집하고, Grafana까지 연동까지 진행해보도록한다.
Prometheus와 Grafana가 연동된 아키텍쳐 구조를 먼저 보도록한다.
각 노드들의 node-exporter로 부터 Prometheus 서버가 metric을 Pull해오고, Grafana가 Prometheus 서버에 PromQL을 날려 쿼리 결과를 가져와 Dashboard 형태로 보기좋게 구성을 해주게 된다.
Prometheus 설치
수집한 Metric 데이터를 모을 인스턴스에 Prometheus를 설치한다.
공식 페이지에서 Prometheus 설치는 바이너리 / 소스 / Docker 이미지 형태로 제공한다.
이 글에서는 Docker 이미지를 받아 컨테이너 방식으로 설치하도록 한다.
먼저 다음과 같이 docker-composes 파일을 작성한다
version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- 9090:9090
restart: always
volume을 통해 prometheus 설정파일(prometheus.yml)을 컨테이너로 bind 시켜준다.
다음으로 prometheus 설정파일을 작성한다.
global:
scrape_interval: 10s
evaluation_interval: 10s
scrape_configs:
- job_name: 'prometheus_server'
static_configs:
- targets: ["prometheus:9090"]
prometheus 설정파일도 YAML 타입으로 작성한다.
설정파일에는 크게 Global, 수집 대상 부분 설정으로 나누어지고, 주요한 설정 내용은 아래와 같다.
global
- scrape_interval : Target에서 metric을 수집해오는 간격, 기본값은 1분
- evaluation_interval: evaluate rule(규칙 평가)의 실행 간격, 기본값 1분
scrape_configs
- job_name : 수집 작업의 이름
- metrics_path : Target에서 metric을 수집할 HTTP 경로, 기본값은 /metrics
- static_configs : 수집 작업을 수행할 Target 서버에 대한 설정
- targets : Target 서버 주소
기타 설정내용들과 방법, 기본값 등은 공식 Site를 통해 확인할 수 있다.
Prometheus 설정파일까지 작성 후, 서비스를 올리면 설정한 9090 포트를 통해 prometheus에 접속할 수 있다.
node_exporter 설치
인스턴스의 CPU/Memory 사용량과 같은 Metric을 수집하기 위해 대상 인스턴스에 설치해주어야한다.
node_exporter도 위와 마찬가지로 공식 Site에서 바이너리를 받거나, Docker 이미지로 설치할 수 있다.
먼저, prometheus 서버에 node_exporter를 설치한다.
version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- 9090:9090
restart: always
node-exporter: # node-exporter container
image: prom/node-exporter
ports:
- 9100:9100
restart: unless-stopped
node-exporter는 수집한 metric 데이터를 HTTP endpoint로 노출시킨다. 설정해둔 9100 포트에 /metric path로 접근하면 다음과 같이 metric 데이터를 볼 수 있다.
다음으로 Prometheus가 이 node-exporter를 포함한 다른 서버의 node-exporter endpoint로부터 metric을 수집하도록 설정한다.
global:
scrape_interval: 10s
evaluation_interval: 10s
scrape_configs:
- job_name: 'prometheus_server'
static_configs:
- targets: ["prometheus:9090"]
- job_name: 'node-exporter-prometheus'
metrics_path: /metrics
static_configs:
- targets: ["node-exporter:9100"]
Prometheus Web UI에서 Status > Targets 메뉴에서 Scraping 설정한 대상들이 Prometheus 서버와 잘 연결되었는지 확인할 수 있다.
Metric Querying
Prometheus Web UI를 통해 수집된 Metric에 대해 간단한 Querying을 해보도록 한다.
CPU Usage
rate(node_cpu_seconds_total{mode=”system”}[10m])
Disk Usage
node_filesystem_avail_bytes
Memory Usage
100 * (1 - ((avg_over_time(node_memory_MemFree_bytes[10m]) + avg_over_time(node_memory_Cached_bytes[10m]) + avg_over_time(node_memory_Buffers_bytes[10m])) / avg_over_time(node_memory_MemTotal_bytes[10m])))
Grafana 설치
마지막으로 Prometheus의 데이터 가시성을 높이기 위해 Grafana를 설치해 모니터링을 해본다
version: '3'
services:
grafana:
image: grafana/grafana
container_name: grafana
volumes:
- ./data:/var/lib/grafana
ports:
- 3000:3000
volume 설정을 위해 docker-compose 파일과 동일한 위치에 data 디렉토리를 777 권한으로 생성해준다.
Grafana 컨테이너를 올리고 3000 포트로 접속하면 Grafana 로그인 화면이 나온다.
기본 계정은 admin / admin이다.
로그인 후, Grafana와 Prometheus를 연동해주는 작업을 진행한다.
Home > Connections > Data Sources에서 default로 존재하는 prometheus에 들어가 Connection 주소를 Prometheus 서버의 URL로 설정해준다.
Connection URL 설정 후, 하단의 Save&Test로 성공적으로 연결되면 Dashboard를 생성한다.
Home > Dashboards에서 Create Dashboard > import Dashboard
여기에서 Dashboard json 파일을 import 해올 수 있다. 또한, 공식 Grafana에서 제공하는 Dashboard를 가져올 수도 있다.
ID 1860의 Dashboard를 가져와 보도록한다.
이후 방금 설정한 Prometheus data source를 연결하고 Dashboard를 생성한다.
Dashboard를 Import하면 가시성이 눈에 띄게 상승한 대시보드와 그래프들을 볼 수 있다.
모니터링할 Datasource, job, host 별로 따로 볼 수 있고, 우측 상단에서 모니터링할 시간 범위도 조절가능하다.