Prometheus란?

ShinChul Bang
finda 기술 블로그
12 min readApr 23, 2020

오픈소스 모니터링 툴 Prometheus에 대해서 알아보자.

Prometheus?

Prometheus는 SoundCloud사에서 만든 오픈소스 시스템 모니터링 및 경고 툴킷이다.

지금은 독립형 오픈소스 프로젝트이며 많은 회사들이 사용 하고 있고, 또한 kubernetes에서도 Prometheus를 사용하여 매트릭 수집 및 대시보드 구축하는 방식을 장려하고 있다.

Prometheus의 다양한 기능들

Prometheus의 아키텍쳐는 아래와 같이 구성되어 있다.

간단하게 설명하자면 아래와 같다.

Jobs/exporters는 실제로 매트릭을 수집하는 프로세스라고 보면 된다.

exporter가 매트릭을 수집하고 HTTP 통신을 통해 매트릭 데이터를 가져갈 수 있게 /metrics 라는 HTTP 엔드포인트를 제공한다.

그러면 Prometheus server가 이 exporter의 엔드포인트로 HTTP GET 요청을 날려 매트릭 정보를 수집(Pull)한다.

수집한 정보를 Prometheus가 제공하는 간단한 웹 뷰를 통해 조회할 수 있고 그 안에서 테이블 및 그래프 형태로 볼 수 있다.

하지만 시각화 도구가 부족해서 이를 직접 사용하지는 않고 대게 Grafana라는 Data Visualization tool을 이용하여 시각화하고 있다.(Prometheus & Grafana와 Elasticsearch & Kibana 뭐 이런 느낌이다..)

Prometheus 설치 방법

간단하게 Docker를 사용하여 Prometheus를 구성하는 방법을 알아보자.

먼저 Prometheus는 prometheus.yml 이라는 파일을 사용하여 기본적인 설정을 한다.

기본적인 prometheus.yml의 내용을 살펴보자.

# 기본적인 전역 설정 
global:
scrape_interval: 15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
evaluation_interval: 15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
# 'scrpae_timeout' 이라는 설정은 기본적으로 10초로 세팅되어 있다.
# Alertmanager 설정
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# 규칙을 처음 한번 로딩하고 'evaluation_interval'설정에 따라 정기적으로 규칙을 평가한다.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# 매트릭을 수집할 엔드포인트를 설정. 여기서는 Prometheus 서버 자신을 가리키는 설정을 했다.
scrape_configs:
# 이 설정에서 수집한 타임시리즈에 'job=<job_name>'으로 잡의 이름을 설정한다.
- job_name: 'prometheus'
# 'metrics_path'라는 설정의 기본 값은 '/metrics'이고
# 'scheme'라는 설정의 기본 값은 'http'이다.
static_configs:
- targets: ['localhost:9090']

천천히 읽어보면 간단하게 구성되어 있는 것을 알 수 있다.

먼저 global: 이라는 코드로 시작한다.

그 아래로는 alerting:, rule_files:, scrape_configs: 등 많은 코드들이 있다.

Prometheus 서버는 이 yml 파일을 통해 기본적인 설정을 하고 어떤 exporter로부터 매트릭 정보를 수집할 것인지(job_name)를 확인한다.

Prometheus를 사용하면서 가장 자주 쓸 것 같은 설정이 저 scrape_configs:인 것 같다.

scrape_configs: 에서는 실제 exporter를 지정한다.

먼저 - job_name: 에 잡의 이름을 지정하고, 이 잡이 데이터를 수집할 exporter의 경로를 static_configs:- targets:metrics_path: ,scheme: 에 설정한다.

예를 들면 아래와 같은 식이다.

scrape_configs:  
- job_name: 'node_exporter_test'
# exporter가 제공하는 엔드포인트가 /metrics라면 metrics_path의 설정을 생략해도 된다.
# exporter의 프로토콜이 http라면 scheme의 설정을 생략해도 된다.
scrape_interval: 10s
static_configs:
- targets: ['192.168.56.111:9100']

- job_name: 'kube_state_metrics_exporter_test'
metrics_path: '/test-metrics'
scheme: 'https'
scrape_interval: 10s
static_configs:
- targets: ['13.209.3.110:30001']

아무튼, 기본적인 prometheus.yml 파일을 구성해 이를 이용하여 실제 Prometheus를 설치하고 테스트 해보자.

루트 디렉터리에 /test 라는 디렉터리를 만들어 그 안에 위의 기본 prometheus.yml 파일을 생성한다.

prometheus.yml 내용은 아래와 동일하게 작성한다.

# 기본적인 전역 설정 
global:
scrape_interval: 15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
evaluation_interval: 15s # 15초마다 매트릭을 수집한다. 기본은 1분이다.
# 'scrpae_timeout' 이라는 설정은 기본적으로 10초로 세팅되어 있다.
# Alertmanager 설정
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# 규칙을 처음 한번 로딩하고 'evaluation_interval'설정에 따라 정기적으로 규칙을 평가한다.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# 매트릭을 수집할 엔드포인트를 설정. 여기서는 Prometheus 서버 자신을 가리키는 설정을 했다.
scrape_configs:
# 이 설정에서 수집한 타임시리즈에 'job=<job_name>'으로 잡의 이름을 설정한다.
- job_name: 'prometheus'
# 'metrics_path'라는 설정의 기본 값은 '/metrics'이고
# 'scheme'라는 설정의 기본 값은 'http'이다.
static_configs:
- targets: ['localhost:9090']

Prometheus가 15초 마다 매트릭을 수집하는데, http://localhost:9090/metrics 에서 제공하는 매트릭 정보를 수집하도록 설정했다. 그리고 이 수집에 대한 Job 이름은 prometheus로 지정하였다.

그 다음 아래 명령어를 통해 Prometheus를 docker로 배포한다.

#!/bin/bash  
sudo docker run \
--rm -d \
-p 9090:9090 \
-v /test/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

우리가 위에서 만든 /test 디렉터리 내의 prometheus.yml 파일과 컨테이너 내부의 /etc/prometheus/prometheus.yml 을 동기화 시켰다.

즉, 우리가 작성한 /test/prometheus.yml 이 실제 컨테이너 내부의 /etc/prometheus/prometheus.yml으로 세팅되어 우리가 지정한 설정 값으로 Prometheus 컨테이너가 실행된다는 뜻이다.

그리고 Prometheus 컨테이너가 종료 되더라도 수집하던 매트릭 데이터는 보존하기 위해 prometheus-volume이라는 볼륨을 생성하고 그 볼륨에 Prometheus 컨테이너의 /prometheus 디렉터리와 마운트 시켰다.

이렇게 하면 컨테이너가 종료 되더라도 기존 컨테이너에서 마운트 시켰던 디렉터리의 데이터는 외부 볼륨에 저장되기 때문에 삭제되지 않는다.

이런 방식을 사이드카 패턴이라고 한다.

docker 컨테이너가 잘 배포되었는지 확인하기 위해 아래 명령어를 실행한다.

$ docker ps -a CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES 89e8211776c1        prom/prometheus     "/bin/prometheus --c…"   3 seconds ago       Up 2 seconds        0.0.0.0:9090->9090/tcp   interesting_nash

컨테이너는 잘 뜬 것 같다.

그럼 브라우저를 통해 Prometheus 대시보드로 접속해보자.

브라우저를 열어 http://<Prometheus를 띄운 서버의 public ip>:9090 으로 접속하자.

Prometheus 대시보드의 첫 화면. 굉장히 깔끔하다.
기본적으로 들어있는 쿼리를 Execute하여 결과를 가져온 화면
가져온 결과를 그래프로 본 화면
어떤 exporter를 수집하고 있는지 대상(Targets)을 확인할 수 있는 메뉴
기본적인 자기자신(Prometheus Server)에서 매트릭 정보를 수집하고 있음을 확인할 수 있다.

위처럼 Targets에서 우리가 prometheus.yml에서 지정했던 Job이 잘 수집되고 있음을 확인할 수 있다.

Job 이름은 prometheus였고, 수집 대상(targets)의 엔드포인트는 http://localhost:9090/metrics 였다.

이 외에 추가적인 exporter를 prometheus.yml의 scrape_configs:에서 세팅하여 다른 매트릭 데이터도 수집하도록 하면 아래처럼 다른 대상(targets)을 더 확인할 수 있다.

참고로 node_exporter는 서버 노드의 자원(CPU, 메모리, 디스크 등)에 대한 매트릭을 수집해주는 exporter이고,

kube_state_metrics는 쿠버네티스 클러스터 내부의 자원(CPU, 메모리, 디스크 및 각 컨테이너가 사용하고 있는 리소스 현황, 네트워크 I/O, 정상 컨테이너, 비정상 컨테이너 갯수 등)에 대한 매트릭을 수집해주는 exporter이다.

이러한 exporter들은 Prometheus 자체적으로 제공해주기도 하고, 사용자들이 커스텀해서 직접 제작한 exporter들도 Github을 뒤져보면 많이 발견할 수 있다.

Prometheus의 다양한 exporter들에 대해서 알고싶다면, 아래 링크를 참고한다.

--

--