이번엔 Prometheus 와 Node Exporter 를 설치해서 제공하는 메트릭 지표를 확인하고,
시각화 도구인 Grafana 까지 연동해보도록 하겠습니다.
해당 테스트를 위해 aws ec2 instance 를 사용했습니다.
- Docker 설치
Prometheus 는 binary 로 설치해도 되지만 전 docker 로 실행하기 위해 먼저 ec2 에 docker 를 설치하도록 하겠습니다.
> sudo yum -y install docker
터미널에서 위와 같은 command 를 실행하면 아래처럼 설치가 될 것입니다.
docker 버전을 확인해 제대로 설치되었는지 보도록 합니다.
> docker -v
Docker version 20.10.4, build d3cb89e
20.10.4 버전의 docker 가 제대로 설치되었습니다.
- Prometheus 설치
위에서 설치한 docker 를 통해 prometheus 를 실행해보도록 하겠습니다.
그보다 먼저 local (host) 에 prometheus.yml 을 만들어 줍니다. docker 가 실행될 때 이 파일을 마운트 시켜서 설정 파일로 사용되게 할 것입니다.
> sudo vi /tmp/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
prometheus.yml 을 우선 위처럼 작성해 줍니다. 아직 target 에 대한 정보는 별도로 넣지 않았습니다.
global 로 추가된 두 설정에 대해 설명하자면, scrape_interval 은 메트릭을 수집할 주기에 대한 설정이고 evaluation_interval 은 alert 에 대한 rule 을 평가하는 주기에 대한 설정입니다. (여기선 자세히 설명하진 않겠습니다)
저는 15초로 설정했고, default 는 둘 다 1분 (1m) 입니다.
> sudo docker run \
-p 9090:9090 \
-v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
이제 docker 로 prometheus 를 실행시켜 보겠습니다. 현재 local 에는 prom/prometheus 이미지가 없기 때문에, docker hub 에서 최신 이미지를 다운받아 prometheus 컨테이너를 띄우게 됩니다.
prometheus 가 제대로 실행되었으면 한번 UI 로 접근해보겠습니다.
저는 ec2 instance 에서 실행시켰기 때문에 브라우저에서 {private ip}:9090 으로 들어갔습니다.
로컬에서 진행한다면 localhost:9090 으로 들어가면 되겠습니다.
현재는 메트릭을 수집하는 target 이 없기 때문에 어떠한 메트릭도 조회가 되진 않고 prometheus 가 제대로 실행된 것만 확인 가능합니다.
- Node Exporter 설치
이제 ec2 instance 의 시스템, 커널 정보를 수집해주는 node exporter 를 설치해보도록 하겠습니다.
node exporter 는 공식 페이지에서 binary asset 주소를 복사해 터미널에서 아래와 같이 설치할 수 있습니다.
> wget wget https://github.com/prometheus/node_exporter/releases/download/v1.1.2/node_exporter-1.1.2.linux-amd64.tar.gz
> tar xvfz node_exporter-1.1.2.linux-amd64.tar.gz
> cd node_exporter-1.1.2.linux-amd64/
> nohup node_exporter >node_exporter.out 2>&1 &
자신의 환경에 맞는 asset 을 선택해 설치할 수 있으며, 설치된 node_exporter 스크립트는 ./node_exporter 로도 실행 가능하지만 nohup 을 사용해 백그라운드로 돌렸습니다.
저번 글에서 적었던 것처럼 exporter 는 /metrics HTTP endpoint 를 제공한다고 했습니다.
브라우저에서 localhost:9100/metrics 로 들어갑니다. (node_exporter 는 기본적으로 9100 포트를 사용합니다)
ec2 instance (혹은 로컬) 의 gc, cpu, memory, proc, network 와 관련된 여러 메트릭이 수집되고 있는 것을 확인할 수 있습니다.
이제 이 메트릭을 prometheus 에서 수집할 수 있도록 prometheus.yml 설정을 조금 수정해 다시 띄우도록 하겠습니다.
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'node_exporter'
static_configs:
- targets: ['localhost:9100']
scrape_configs 부분이 추가되었습니다. 따로 설명을 할 필요가 없을 정도로 간단합니다.
(여기서 전 docker 와 host 네트워크가 달라 prometheus 가 localhost:9100 endpoint 로 접근을 할 수 없어 docker 실행 시
--network host 옵션을 사용했습니다. localhost 대신 host.docker.internal 을 사용하면 된다고 하지만 전 되지 않아서..)
- Prometheus UI : 메트릭 확인
위에서 prometheus.yml 에 node_exporter 의 타겟을 추가했기에, 이 메트릭을 이제 prometheus UI 에서도 확인 가능합니다.
아까처럼 다시 브라우저에서 localhost:9090 으로 들어가봅니다.
상단 탭에서 Status > Targets 를 확인하면 아래처럼 설정한 타겟에 대해 정상 scrape 하고 있습니다.
UI 에서 promQL 을 사용해 메트릭을 조회해보도록 하겠습니다.
node_exporter 가 제공하는 메트릭 중 node_memory_MemFree_bytes 데이터입니다. Graph 을 통해 시간에 따른 데이터 추이를 볼 수 있습니다. 하지만 저번에 적었듯이 prometheus UI 는 시각화가 썩 뛰어나지 않습니다. 따라서 Grafana 를 연동해 보도록 하겠습니다.
- Grafana 설치 및 대시보드 추가
grafana 또한 docker 를 통해 쉽게 실행할 수 있습니다. (전 아까와 같은 이슈로 --network host 옵션을 동일하게 사용했습니다..)
> sudo docker run -d -p 3000:3000 grafana/grafana
브라우저에서 localhost:3000 으로 들어가 보겠습니다.
기본 접속 정보는 admin / admin 입니다.
grafana 에서 prometheus 의 데이터를 가져오기 위해선 Datasource 가 추가되어야 합니다.
왼쪽 메뉴 중 톱니바퀴를 눌러 Data Sources 선택 후 Prometheus 를 선택해줍니다.
Data Sources 설정 중 URL 에 http://localhost:9090 을 적은 후 제일 하단의 Save & Test 버튼을 누르면 grafana 에서 prometheus 의 접근이 잘 되는게 확인되었습니다.
아까 prometheus UI 에서 봤던 node_memory_MemFree_bytes 메트릭을 grafana 대시보드로 시각화한 모습입니다.
기존 UI 와 큰 차이가 있네요. 여기서 promQL 과 grafana 의 다양한 옵션을 통해 custom 대시보드를 만들 수 있고,
이미 잘 만들어진 대시보드를 import 해서 사용할 수도 있습니다.
제가 자주 쓰는 옵션 중 아래 Legend 에 {{instance}} 를 넣어 필요한 정보만 범례로 띄우도록 수정했습니다.
현재로선 모든 지표가 node_exporter 를 통해 수집되고 있으므로 job 은 볼 필요가 없기 때문입니다.
이 외에도 grafana 에는 많은 옵션이 있고, promQL 에도 다양한 함수가 있으니 따로 확인해보시면 좋을 것 같습니다.
여기까지 Prometheus 와 Node Exporter, Grafana 를 통해 메트릭을 수집하고 시각화까지 해봤습니다.
다음엔 이어서 prometheus 의 client library 를 활용해 직접 운영하는 서버에서 발생하는 메트릭을 수집할 수 있도록
custom exporter 를 만들어보도록 하겠습니다.
'Infrastructure > Prometheus' 카테고리의 다른 글
Prometheus Pushgateway with Node.Js (2) | 2021.04.10 |
---|---|
Node.js Cluster mode 모니터링 (0) | 2021.04.04 |
Node.js 어플리케이션 모니터링 (0) | 2021.03.27 |
Prometheus 란? (0) | 2021.03.14 |