작업관리자는 윈도우 PC를 사용하는 사람들에겐 너무나도 친숙한 프로그램입니다. 렉이 걸린다면 CPU를 너무 많이 잡 아먹고 있는건지, 메모리가 부족한건지 직관적으로 확인할 수 있습니다.
그렇다면 리눅스에서의 작업관리자는 어떻게 사용할 수 있을까요? 물론 유사한 프로그램은 많이 있습니다. Ubuntu에서 제공하는 시스템 감시를 사용하거나 터미널 환경에서 사용할 수 있는 htop이 있습니다.
그러나 이러한 프로그램들은 훨씬 과거의 데이터까지 표시해주지 않습니다. 예를 들어 자는 동안 CPU에 과부하가 걸리진 않았는지 확인은 어렵다는 거죠.
prometheus와 grafana를 사용함으로서 가능한 것들
- 모니터링 데이터를 반영구적으로 저장할 수 있습니다. prometheus에서 data retention을 조절하면 되는데요, 1y, 5y(1년, 5년) 처럼 기간을 정할 수도 있고, 100GB 처럼 용량으로 설정할 수도 있습니다.
- CPU, 메모리 사용량 같은 시스템 데이터 뿐만 아니라 Django, Docker, Minecraft Server 등 다양한 metrics를 저장할 수 있습니다.
- 알림을 받을 수 있습니다. 시스템에 문제가 생겨 설정한 값(예: Memory Usage가 90%일 때)을 넘었을 때 Slack으로 알림을 보내는 것이 가능합니 다.
아키텍트
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 플러그인을 사용합니다.
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.time
과 storage.tsdb.retention.size
가 있는것을 확인할 수 있는데, 이들은 저장 기간과 용량에 대한 정책입니다. 둘 중 하나라도 초과할 시 오래된 metrics 데이터부터 지워집니다.
prometheus.yml
prometheus 설정 파일도 필요한데 이는 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
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가 있다면 false
를 true
로 바꿔주세요.
실행
터미널에서 docker-compose up -d
명령을 입력하여 minecraft
, prometheus
, grafana
를 실행합니다.
docker-compose ps
명령으로 서비스 상태를 확인할 수 있습니다.
Docker Desktop이 설치되어 있다면 위 사진처럼 GUI로 확인할 수도 있습니다.
서비스 상태 확인
먼저 prometheus web console부터 접속해봅니다. localhost:9090
으로 접속할 수 있습니다.
Status > Targets 로 들어가면 exporter 상태를 확인할 수 있습니다.
다음으로 minecraft-prometheus-exporter 상태를 확인합니다. localhost:9225/metrics
로 접속하였을 때 위 사진처럼 잘 나타나는지 확인합니다.
새로고침할 때마다 특정 metrics 값들이 바뀌는 것을 볼 수 있습니다. prometheus는 이 metrics 값들을 5초마다 가져간 후 저장하게 됩니다. (가져가는 간격은 prometheus.yml에서 바꿀 수 있습니다)
다음으로 grafana 입니다. localhost:3000
으로 접속하였을 때 위와 같이 로그인 화면이 뜨는지 확인합니다.
grafana 셋업
초기 유저 이름 및 비밀번호를 admin
/admin
으로 설정해두었으며 입력하고 로그인하면 grafana의 메인 화면을 볼 수 있습니다.
grafana에서는 prometheus 연결이 안되어있기 때문에 초기에 연결해주는 작업이 필요한데요, 이는 Add data source 로 할 수 있습니다.
설정 > Data sources로 들어간 후, Add data source 버튼을 클릭하세요.
다양한 data source를 지원합니다. 이번 글에서는 prometheus로 추가합니다.
URL은 http://prometheus:9090
으로 입력합니다. 입력 후 맨 하단의 Save & test 를 클릭하여 data source를 추가하세요.
다시 data sources로 돌아오면 prometheus가 추가된 것을 확인할 수 있습니다.
grafana 쿼리
grafana에서 prometheus에 저장된 metrics를 쿼리해봅시다.
왼쪽 메뉴에서 나침반 모양 아이콘 > Explore 로 들어갑니다.
상단의 data source를 prometheus로 바꿔줍니다.
Metrics에서 원하는 metrics를 선택 후 실행해보세요.
데이터가 표시되는 것을 확인할 수 있습니다.
grafana 대시보드 추가
grafana의 explore 기능은 즉석에서 확인하는 기능입니다. mc_jvm_memory
나 mc_tps
, mc_players_online_total
등 관심있는 데이터들을 대시보드 형태로 만들어 확인하는 것도 가능한데요, 지금부터 간단한 대시보드를 하나 만들어보도록 하겠습니다.
대시보드 추가를 찾아 클릭하세요.
대시보드가 바로 생성이 되는데, Add a new panel을 클릭하여 패널을 추가합니다.
패널 추가 화면에서는 다양한 것들을 설정할 수 있습니다. metric, 패널 title, 패널 종류 등등...
Apply 버튼을 누르면 패널이 추가됩니다.
이 작업을 반복하여 다양한 패널을 추가할 수 있습니다.
패널을 정성껏 꾸미면 예쁜 대시보드도 만들 수 있습니다. 그러나 고도로 커스터마이징 하는 것이 부담스럽다면 잘 만들어진 대시보드를 가져다 쓰는 방법도 있습니다.
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에서 제작한 모니터링 솔루션에 대한 인포그래픽을 첨부합니다.