Prometheus와 Grafana를 통한 모니터링 시스템 구축하기

BLUECHEAT
9 min readNov 28, 2023

회사에서 운영중인 인프라는 IDC , AWS 클라우드가 복합적으로 구성되어 있습니다. 많은 서버와 인스턴스 그리고 서비스의 양 대비 인력이 부족하기에 장애나 신뢰성을 측정하고자 할때 빠르게 측정하기 어려움이 있었습니다.

때문에 신규 개발건이나 운영 대응에 대한 부담감을 줄이기 위해서라도 통합 모니터링 및 운영 자동화는 선택이 아니라 필수요소라고 생각했고, 오픈소스인 Prometheus + Grafana 구성을 선택하게 되었습니다.

모니터링 목표

모니터링 시스템 구축 시 논리적인 목표가 필요했고 이에 구글의 SRE를 참조 하여 목표를 설정할 수 있었습니다. 다음은 모니터링 구축 시 필수 요구사항입니다.

  • 현재 운영중인 인프라 통합 모니터링
  • 현재 운영중인 서비스 통합 모니터링
  • 특정 운영 지표에 따른 실시간 알림
  • 운영 복구에 따른 실시간 알림

위와 같이 운영 지표가 명확해 진다면 이에 따른 서비스 탄력성 및 가용성에 대한 추가적인 지식을 얻을 수 있습니다.

서비스 수준 목표(SLO) 에 따른 운영 지표

서비스 운영 시 “장애” 혹은 “위험도”를 판단할 운영 지표가 중요합니다. 여기서 이해관계자들끼리 동일한 용어 및 운영중 커뮤니케이션 미스를 줄이기 위해 아래와 같이 정리하였습니다.

경고 레벨

  • LEVEL1 (Error) — 서비스에 치명적인 경고 레벨, 해당 레벨의 경고가 발생한다면 1순위로 해결해야 합니다.
  • LEVEL2 (Warn) — 치명적이진 않지만, 서비스에 문제가 생길 여지가 있는 경고 레벨
  • LEVEL3 (Info) — 서비스에 영향은 주지 않지만, 이슈의 잔재가 남아 수동으로 처리해야 하는 경고 레벨

시스템 상태 목표 예시

  • 시스템, 서비스 Down — LEVEL1
  • CPU ≥ X% — LEVEL2
  • Memory ≥ X% — LEVEL2
  • Disk ≥ X% — LEVEL2
  • Thread 개수 네트워크 커넥션 수 ≥ X — LEVEL3

서비스 가용성 목표 예시

  • API 응답 시간 90% < 200 ms — LEVEL2
  • API 응답 Status Code 99.9% < 5XX — LEVEL2

SLO(Service Level Indicator)는 서비스 수준 목표를 의미하며, SLI(Service Level Objectives)에 의해 측정된 서비스 수준의 척도, 기준을 의미합니다.

SLOSLI <= 목표치 또는 최솟값 <= SLI <= 최댓값으로 표현될 수 있으며, 명확성을 극대화 하기 위해 SLO는 측정 방식과 유효한 기준이 반드시 명시되어야 합니다.

아키텍처 설계

위의 목표를 기반으로 전체적인 아키텍처를 설계했습니다.

기본적으로 오픈 소스 중심으로 수집은 Prometheus, GUI는 Grafana를 이용, 알림 같은 경우 카카오톡 혹은 문자를 지원할 수 있게 Custom이 필요해서 자체 서비스 구축을 통한 hook 처리를 고려했습니다.

모니터링 시스템 아키텍처 구성

Prometheus 설정

아래는 ubuntu 기반으로 설정 Prometheus 방법을 정리했습니다.

1. 설치

$ sudo mkdir /etc/prometheus
$ sudo mkdir /opt/prometheus

# 설치
$ wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz
$ tar xvfz prometheus-2.34.0.linux-amd64.tar.gz
$ cd prometheus-2.34.0.linux-amd64

# 프로메테우스 파일 복사
$ sudo cp prometheus /usr/local/bin/
$ sudo cp promtool /usr/local/bin/

$ sudo cp -r prometheus.yml /etc/prometheus
$ sudo cp -r consoles /etc/prometheus
$ sudo cp -r console_libraries /etc/prometheus

2. Prometheus 서비스 데몬 등록

다운로드 받은 prometheus 서비스 데몬 등록 및 실행합니다.

$ vi /etc/systemd/system/prometheus.service

# prometheus.service 파일
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target

[Service]
User=root
Group=root
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /opt/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target

...
# 서비스 데몬 동록 및 실행

$ sudo systemctl daemon-reload
$ sudo systemctl start prometheus
$ sudo systemctl enable prometheus

$ sudo systemctl status prometheus

2. Prometheus Config 설정

  • 설정 파일을 수정합니다 $ sudo vi /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s #기본 수집 주기

scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:9090']

3. Node exporter 설치

시스템의 메트릭 정보를 얻기 위해 공식 사이트에서 제공하고 있는 Node exporter 를 설치합니다.

$ wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz
$ tar -xzvf node_exporter-1.1.2.linux-amd64.tar.gz

# 폴더명 변경 로그아웃
$ sudo cp node_exporter-1.1.2.linux-amd64/node_exporter /usr/local/bin/

Prometheus와 마찬가지로 서비스 데몬으로 등록합니다.

$ vi /etc/systemd/system/node_exporter.service

# node_exporter.service 파일
[Unit]
Description=Prometheus Node Exporter
Documentation=https://prometheus.io/docs/guides/node-exporter/
Wants=network-online.target
After=network-online.target

[Service]
User=root
Group=root
Restart=on-failure
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target

...
# 서비스 데몬 동록 및 실행

$ sudo systemctl daemon-reload
$ sudo systemctl start node_exporter
$ sudo systemctl enable node_exporter

$ sudo systemctl status node_exporter

Grafana 설정

그라파나를 통해 대시보드 구축 시 Hub 역할을 하는 Grafana Labs 에서 대시보드 템플릿이 많이 올라와 있기 때문에 직접 구축하지 않아도 원하는 형태를 찾을 수 있습니다.

1. 설치

$ sudo apt-get install -y adduser libfontconfig1
$ wget https://dl.grafana.com/oss/release/grafana_8.4.6_amd64.deb
$ sudo dpkg -i grafana_8.4.6_amd64.deb

2. 실행 및 Config 변경

$ service grafana-server start

# 설정변경
$ vi /etc/grafana/grafana.ini

3. 대시보드 찾기

--

--