IT일상

grafana와 prometheus로 모니터링 시스템 구축하기

  • 인프라
Profile picture

Written by solo5star

2022. 7. 11. 20:09

작업관리자는 윈도우 PC를 사용하는 사람들에겐 너무나도 친숙한 프로그램입니다. 렉이 걸린다면 CPU를 너무 많이 잡아먹고 있는건지, 메모리가 부족한건지 직관적으로 확인할 수 있습니다.

1 2

그렇다면 리눅스에서의 작업관리자는 어떻게 사용할 수 있을까요? 물론 유사한 프로그램은 많이 있습니다. Ubuntu에서 제공하는 시스템 감시를 사용하거나 터미널 환경에서 사용할 수 있는 htop이 있습니다.

그러나 이러한 프로그램들은 훨씬 과거의 데이터까지 표시해주지 않습니다. 예를 들어 자는 동안 CPU에 과부하가 걸리진 않았는지 확인은 어렵다는 거죠.

prometheus와 grafana를 사용함으로서 가능한 것들

  • 모니터링 데이터를 반영구적으로 저장할 수 있습니다. prometheus에서 data retention을 조절하면 되는데요, 1y, 5y(1년, 5년) 처럼 기간을 정할 수도 있고, 100GB 처럼 용량으로 설정할 수도 있습니다.
  • CPU, 메모리 사용량 같은 시스템 데이터 뿐만 아니라 Django, Docker, Minecraft Server 등 다양한 metrics를 저장할 수 있습니다.
  • 알림을 받을 수 있습니다. 시스템에 문제가 생겨 설정한 값(예: Memory Usage가 90%일 때)을 넘었을 때 Slack으로 알림을 보내는 것이 가능합니다.

아키텍트

3
출처: https://www.devopsschool.com/blog/what-is-prometheus-and-how-it-works/

prometheus와 grafana를 사용한 모니터링 아키텍트는 위와 같습니다. prometheus는 데이터를 저장하는 데이터베이스입니다. 아키텍트에서 Back-end 역할을 합니다. grafana는 prometheus에 query하여 데이터를 가져옵니다. 아키텍트에서 Front-end 역할을 합니다.

prometheus는 각 서비스(Django, Minecraft Server ...)에서 metrics를 수집할 때 Pull 방식과 Push 방식 둘 다 지원합니다. Pull 방식은 prometheus에서 각 서비스에 직접 metrics를 가져오는 방식이고, Push 방식은 각 서비스가 prometheus에 metrics를 업로드하는 방식입니다.

이 글에서 다루는 범위

이 글에서는 minecraft 서버에서 얻을 수 있는 metrics(접속중인 플레이어 수, TPS, 월드 수, 엔티티 수 등)을 prometheus 에 저장하고 grafana에서 시각화합니다.

grafana-prometheus/
└docker-compose.yml
└prometheus.yml # prometheus 설정 파일
└prometheus/ # prometheus 데이터 저장
└grafana/ # grafana 데이터 저장
└minecraft/ # minecraft 서버 데이터
  └plugins/
    └PrometheusExporter/
      └config.yml # minecraft-prometheus-exporter 설정 파일

위와 같은 디렉토리 구조로 구축하게 됩니다.

docker-compose.yml

docker-compose.yml 파일을 생성한 뒤, 아래와 같이 minecraft, prometheus, grafana를 추가해줍니다.

minecraft 서버의 metrics (접속중인 플레이어 수, TPS, 월드 수 등)를 prometheus가 가져갈 수 있도록 minecraft-prometheus-exporter 플러그인을 사용합니다.

docker-compose.yml
version: "3"
services:
  minecraft:
    image: itzg/minecraft-server
    stdin_open: true
    tty: true
    restart: unless-stopped
    ports:
      - 25565:25565 # minecraft
      - 9225:9225 # minecraft-exporter
    volumes:
      - ./minecraft:/data
    environment:
      - EULA=true
      - TYPE=PAPER
      - SPIGET_RESOURCES=36618 # prometheus-exporter plugin

  prometheus:
    image: prom/prometheus
    restart: unless-stopped
    ports:
      - 9090:9090
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus:/prometheus
    command:
      - --config.file=/etc/prometheus/prometheus.yml
      - --storage.tsdb.path=/prometheus
      - --storage.tsdb.retention.time=90d # 90일보다 오래된 metrics는 삭제
      - --storage.tsdb.retention.size=10GB # 10GB를 넘을 시 오래된 metrics 삭제
      - --web.console.libraries=/usr/share/prometheus/console_libraries
      - --web.console.templates=/usr/share/proemtheus/consoles
      - --web.enable-admin-api

  grafana:
    image: grafana/grafana
    restart: unless-stopped
    ports:
      - 3000:3000
    volumes:
      - ./grafana:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin # grafana 사용자 이름
      - GF_SECURITY_ADMIN_PASSWORD=admin # grafana 사용자 비밀번호
      - GF_USERS_ALLOW_SIGN_UP=false

prometheus에서 command 부분을 보시면 storage.tsdb.retention.timestorage.tsdb.retention.size가 있는것을 확인할 수 있는데, 이들은 저장 기간과 용량에 대한 정책입니다. 둘 중 하나라도 초과할 시 오래된 metrics 데이터부터 지워집니다.

prometheus.yml

prometheus 설정 파일도 필요한데 이는 prometheus.yml 파일에 작성합니다.

prometheus.yml
global:
  scrape_interval: 5s # By default, scrape targets every 15 seconds.
  evaluation_interval: 5s # Evaluate rules every 15 seconds.

rule_files:
  - 'prometheus.rules.yml'

scrape_configs:
  - job_name: 'minecraft'
    static_configs:
      - targets: ['minecraft:9225']

scrape_configs에는 사용할 exporter들을 적으면 됩니다. 위의 설정에서는 minecraft-prometheus-exporter를 추가해주었습니다.

minecraft/plugins/PrometheusExporter/config.yml

minecraft/plugins/PrometheusExporter/config.yml
host: 0.0.0.0
port: 9225
enable_metrics:
  entities_total: true
  villagers_total: true
  loaded_chunks_total: true
  jvm_memory: true
  players_online_total: true
  players_total: true
  tps: true
  jvm_threads: true
  jvm_gc: true
  tick_duration_median: true
  tick_duration_average: true
  tick_duration_min: false
  tick_duration_max: true
  player_online: false
  player_statistic: false

minecraft-prometheus-exporter 플러그인의 설정 파일도 생성해주어야 합니다. host 부분이 반드시 0.0.0.0 으로 되어있어야 합니다.

이 외에 활성화하고 싶은 metrics가 있다면 falsetrue로 바꿔주세요.

실행

4

터미널에서 docker-compose up -d 명령을 입력하여 minecraft, prometheus, grafana를 실행합니다.

5

docker-compose ps 명령으로 서비스 상태를 확인할 수 있습니다.

6

Docker Desktop이 설치되어 있다면 위 사진처럼 GUI로 확인할 수도 있습니다.

서비스 상태 확인

7

먼저 prometheus web console부터 접속해봅니다. localhost:9090 으로 접속할 수 있습니다.

8 9

Status > Targets 로 들어가면 exporter 상태를 확인할 수 있습니다.

10

다음으로 minecraft-prometheus-exporter 상태를 확인합니다. localhost:9225/metrics 로 접속하였을 때 위 사진처럼 잘 나타나는지 확인합니다.

새로고침할 때마다 특정 metrics 값들이 바뀌는 것을 볼 수 있습니다. prometheus는 이 metrics 값들을 5초마다 가져간 후 저장하게 됩니다. (가져가는 간격은 prometheus.yml에서 바꿀 수 있습니다)

11

다음으로 grafana 입니다. localhost:3000으로 접속하였을 때 위와 같이 로그인 화면이 뜨는지 확인합니다.

grafana 셋업

12

초기 유저 이름 및 비밀번호를 admin/admin으로 설정해두었으며 입력하고 로그인하면 grafana의 메인 화면을 볼 수 있습니다.

grafana에서는 prometheus 연결이 안되어있기 때문에 초기에 연결해주는 작업이 필요한데요, 이는 Add data source 로 할 수 있습니다.

13 14

설정 > Data sources로 들어간 후, Add data source 버튼을 클릭하세요.

15

다양한 data source를 지원합니다. 이번 글에서는 prometheus로 추가합니다.

16 17

URL은 http://prometheus:9090 으로 입력합니다. 입력 후 맨 하단의 Save & test 를 클릭하여 data source를 추가하세요.

18

다시 data sources로 돌아오면 prometheus가 추가된 것을 확인할 수 있습니다.

grafana 쿼리

grafana에서 prometheus에 저장된 metrics를 쿼리해봅시다.

19

왼쪽 메뉴에서 나침반 모양 아이콘 > Explore 로 들어갑니다.

20

상단의 data source를 prometheus로 바꿔줍니다.

21

Metrics에서 원하는 metrics를 선택 후 실행해보세요.

22

데이터가 표시되는 것을 확인할 수 있습니다.

grafana 대시보드 추가

grafana의 explore 기능은 즉석에서 확인하는 기능입니다. mc_jvm_memorymc_tps, mc_players_online_total 등 관심있는 데이터들을 대시보드 형태로 만들어 확인하는 것도 가능한데요, 지금부터 간단한 대시보드를 하나 만들어보도록 하겠습니다.

23

대시보드 추가를 찾아 클릭하세요.

24

대시보드가 바로 생성이 되는데, Add a new panel을 클릭하여 패널을 추가합니다.

25

패널 추가 화면에서는 다양한 것들을 설정할 수 있습니다. metric, 패널 title, 패널 종류 등등...

26

Apply 버튼을 누르면 패널이 추가됩니다.

27

이 작업을 반복하여 다양한 패널을 추가할 수 있습니다.

28

패널을 정성껏 꾸미면 예쁜 대시보드도 만들 수 있습니다. 그러나 고도로 커스터마이징 하는 것이 부담스럽다면 잘 만들어진 대시보드를 가져다 쓰는 방법도 있습니다.

https://grafana.com/grafana/dashboards/

유저들이 대시보드를 만들고 업로드하는 URL입니다. 대시보드의 ID를 복사하여 자신의 grafana에 추가하는 식입니다.

다른 exporter도 구경해보세요

이 글에서는 minecraft에 대한 exporter를 구성하고 셋업하였지만 이 외에도 다양한 exporter가 있습니다.

  • node-exporter: CPU, Memory, Network 등 시스템 자원에 대한 exporter
  • cadvisor: docker에 대한 exporter
  • MySQL server exporter: MySQL 데이터베이스에 대한 exporter

prometheus 홈페이지 https://prometheus.io/docs/instrumenting/exporters/ 에서 어떤 exporter들이 있는지 확인할 수 있습니다.

맺음말

prometheus와 grafana를 사용하여 기본적인 대시보드를 구성해보았습니다. 이 시스템은 DB와 Front-end가 나누어져있어 처음 설치를 하고 설정을 해보면 잘 안되거나 어려운 부분들이 많지만 kubernetes 같은 분산 컴퓨팅 환경에서 모니터링 시스템을 구축한다면 필수로 사용하게 되지 않을까 싶습니다.

가볍게 사용한다면 조금 과할 수도 있는 시스템이지만 대체할 만한 솔루션은 거의 없는 것 같네요. 마지막으로 netdata에서 제작한 모니터링 솔루션에 대한 인포그래픽을 첨부합니다.

29

https://github.com/netdata/netdata


Profile picture

Written by solo5star

안녕하세요 👋 개발과 IT에 관심이 많은 solo5star입니다

  • GitHub
  • Baekjoon
  • solved.ac
  • about
© 2023, Built with Gatsby