인트로에서 얘기한 것처럼 노드 혹은 서버를 작동시키는 머신에서 하드웨어적으로 문제가 생기거나, 가용 리소스 보다 많은 리소스를 사용해 문제가 생기는 경우 등이 있습니다. 따라서 구축한 환경 자체를 모니터링하고, 문제가 생길 경우 적절한 조치를 빠르게 취해야 합니다.
모든 모니터링 순서는 수집 → 통합 → 시각화 구조로 되어있는데요.
우리는 모니터링을 위해 필요한 데이터를 수집하고, 수집한 정보를 한 곳에 모아(통합), 그 데이터들을 시각화 할 수 있어야 합니다.
위의 플로우를 도와주는 서비스들이 여럿 있는데요.
데이터 수집 도구에는 대표적으로 프로메테우스, 데이터독이 있습니다.
1. Prometheus
2. Datadog
프로메테우스 등의 도구는 시각화 기능이 부족합니다. 그래서 부족한 시각화 기능을 보강하는 다음과 같은 도구를 사용하는데요.
1. Grafana
2. 키바나(Kibana)
보통 모니터링 시스템을 구축하기 위해 고려하는 문제는 크게 두 가지입니다.
이 중 비용은 의사결정 시 가장 큰 요소입니다. 프로메테우스와 그라파나는 무료인 오픈 소스인데다가 기능이 부족하지 않고, 보안, 확장성도 뛰어나기 때문에 가볍게 모니터링 시스템을 구축해보는 용도로 가장 적합하다고 할 수 있습니다.
그럼 프로메테우스를 설치해보고 필요한 요소들을 세팅해보겠습니다.
먼저, 프로메테우스의 주요 요소들을 먼저 짚고 넘어가보겠습니다.
프로메테우스는 여러 요소를 설치합니다. 아래의 요소를 설치하며, 설치된 요소들로 모니터링에 필요한 데이터를 수집하고 저장합니다.
exporter
prometheus-server
프로메테우스는 서비스 디스커버리를 활용해 프로메테우스 서버와 API 서버가 주기적으로 데이터를 주고받아 수집 대상을 자동으로 인식하고 필요한 정보를 수집합니다.
exporter 중에 가장 유명한 exporter로 node exporter가 있습니다. 이 글에서 사용할 exporter이기도 합니다.
node exporter는 노드 서버의 시스템 metric 정보를 HTTP로 공개합니다.
설치된 노드 서버에서 특정 파일들을 읽어, 이를 프로메테우스 서버가 수집할 수 있는 metric으로 변환한 후에 HTTP로 접근할 수 있게 합니다.
node exporter가 제공하는 주요 지표로는 node_cpu_seconds_total
, node_memory_MemAvailable_bytes
등이 있습니다.
이 글에서는 노드 모니터링을 위해 node exporter 뿐만 아니라 Near protocol의 노드 metric 정보도 수집해야 합니다. 따라서 exporter 하나를 추가로 더 사용합니다.
near노드 구현체를 보면 내부적으로 prometheus exporter를 구현해놨으며, localhost:3030/metrics 라는 엔드포인트로 노드 데이터에 접근할 수 있게 되어있습니다.
코드 : https://github.com/near/nearcore/blob/master/chain/jsonrpc/src/lib.rs#L1389
즉, Near metrics exporter는 노드에서 열어둔 3030 port 를 통해 데이터를 제공하고 있으며,
prometheus 서버가 노드의 port 로 접근하여 metric 데이터들을 수집해가는 구조입니다.
주요 metric은 이 파일에 정의되어 있습니다.
이제 prometheus 서버 설치 및 세팅을 진행해보겠습니다.
세팅에 사용할 환경은 Linux/Ubuntu 22.02 환경입니다. (보통 노드는 Linux에서 구축한다고 보시면 됩니다.)
이 글에서는 직접 설치하는 방법을 사용하겠습니다.
(도커 이미지를 이용하고싶다면, 이 링크를 참고하세요.)
prometheus와 node exporter 유저를 추가해줍니다.
sudo useradd --no-create-home --shell /usr/sbin/nologin prometheus
sudo useradd --no-create-home --shell /bin/false node_exporter
prometheus 폴더를 만들고 오너쉽을 설정해줍니다.
sudo mkdir /etc/prometheus
sudo mkdir /var/lib/prometheus
sudo chown prometheus:prometheus /etc/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus
Prometheus 최신 버전을 다운로드 합니다.(LATEST VERSION 부분에 버전 숫자를 넣어주세요.)
wget https://github.com/prometheus/prometheus/releases/download/<LATEST VERSION>/prometheus-<LATEST VERSION>linux-amd64.tar.gz
tar xfz prometheus-<LATEST VERSION>linux-amd64.tar.gz
cd prometheus-<LATEST VERSION>linux-amd64/
sudo cp ./prometheus /usr/local/bin/
sudo cp ./promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus
sudo chown prometheus:prometheus /usr/local/bin/promtool
sudo cp -r ./consoles /etc/prometheus
sudo cp -r ./console_libraries /etc/prometheus
sudo chown -R prometheus:prometheus /etc/prometheus/consoles
sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
설정을 위해 prometheus.yml
파일을 작성합니다.
sudo vim /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: 'near_node'
scrape_interval: 5s
static_configs:
- targets: ['localhost:3030']
파일의 오너쉽을 변경해줍니다.
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
background 실행을 위해 prometheus systemd service를 만들어줍니다. 포트는 19001로 해보겠습니다.
sudo vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Monitoring
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries \
--web.listen-address=localhost:19001
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
(프로메테우스 실행 커맨드 컨피그는 이 링크를 참고하세요.)
이제 프로메테우스 서비스를 시작합니다.
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
이제 node exporter도 설치합니다.
wget https://github.com/prometheus/node_exporter/releases/download/<LATEST VERSION>/node_exporter-<LATEST VERSION>linux-amd64.tar.gz
tar xvf node_exporter-<LATEST VERSION>linux-amd64.tar.gz
sudo cp node_exporter-<LATEST VERSION>linux-amd64/node_exporter /usr/local/bin
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
node exporter service도 작성합니다. 포트는 19002로 설정합니다.
sudo vim /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--path.procfs=/host/proc \
--path.sysfs=/host/sys \
--path.rootfs=/host \
--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc|boot)($$|/) \
--web.listen-address=localhost:19002
[Install]
WantedBy=multi-user.target
node exporter 데이터도 수집하기 위해 prometheus.yml
파일을 수정합니다.
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first.rules"
# - "second.rules"
scrape_configs:
- job_name: 'near_node'
scrape_interval: 5s
static_configs:
- targets: ['localhost:3030']
- job_name: 'near.nost'
scrape_interval: 10s
static_configs:
- targets: ['localhost:19002']
node exporter, prometheus 서비스를 시작해줍니다.
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
sudo systemctl restart prometheus
prometheus 세팅을 완료했습니다! 이제 모니터링을 위한 데이터 시각화 단계로 넘어가보겠습니다.