그라파나 설정하기
그라파나 설정하기
기존 서비스에 whatap이라는 apm을 사용해서 모니터링 중인데, 리눅스 서버 모니터링만 하고 있는 상태다. 자금 문제, 서버 스펙문제 등으로 인해 어플리케이션 모니터링은 불가능한 상태였는데, 힙사이즈나 GC 타이밍을 좀 보고싶어졌다. 운영중인 서비스가 메모리 관련 이슈가 분명 있는 것 같은데, 힙덤프를 떠봐도 메모리 누수 같은 문제는 보이지 않아서 해당 시점의 자세한 상황을 봐야 알 것 같았다.
이전에도 핀포인트나 스카우터 같은걸 설치해 보려는 시도는 했으나, 에이전트를 구동하자마자 서버가 뻗는 걸 봤기에 엄두도 못내고 있었는데, 그라파나는 웬지 될 것 같아서(?) 프라이빗하게 돌리고 있는 웹서비스에 실험을 해봤다. 얘는 터져도 큰 여파가 없기에…
설치 과정
Node Exporter
먼저 Node Exporter를 설치해준다. 그라파나는 조금 독특한게, 에이전트-서버 구성인 기존 apm들과는 다르게 클라이언트-서버-시각화 이런식으로 구성되어 있는 것 같다.
여기서 각 역할들을 대입해보자면 클라이언트(Node Exporter)-서버(Prometheus)-시각화(Grafana) 인 것 같다.
먼저 위의 링크에서 자신의 서버 스펙과 맞는 파일을 다운로드해준다. 나는 amd64로 다운로드했다.
1
2
3
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xvfz node_exporter-1.7.0.linux-amd64.tar.gz
압축해제한 폴더로 이동 후 서버를 실행시켜준다.
1
2
3
4
nohup ./node_exporter --web.listen-address=:실행시킬_포트번호 &
# ex)
# nohup ./node_exporter --web.listen-address=:8080 &
ip:port/metrics 로 접속시 수집된 정보를 확인할 수 있다.
만약 접속이 안된다면 방화벽 설정이나 클라우드 서비스 제공자의 보안 규칙을 확인해보자. CentOS 7 기준 방화벽 스크립트는 미래의 누군가를 위해 써놔야겠다.
1
2
sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp
firewall-cmd --reload
spring actuator
스프링 부트로 돌아가는 어플리케이션 모니터링을 위한 추가 설정을 해줬다. 전체적인 서버 자원만 모니터링한다면 해당 과정은 생략해도 된다.
1
2
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
build.gradle에 다음과 같이 추가해 준다.
1
2
3
4
5
management:
endpoints:
web:
exposure:
include: health, info, prometheus
application.yml에는 다음과 같이 추가해준다.
Prometheus
위의 링크로 접속해서 서버와 맞는 파일을 다운로드 해준다.
1
2
3
wget https://github.com/prometheus/prometheus/releases/download/v2.48.1/prometheus-2.48.1.linux-amd64.tar.gz
tar xvfz prometheus-2.48.1.linux-amd64.tar.gz
압축을 해제한 폴더에 들어가 prometheus.yml 파일을 수정해주어야 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
# node exporter가 설치된 서버의 아이피:포트
static_configs:
- targets: ["아이피:포트"]
# 스프링 어플리케이션이 실행되는 서버의 아이피:포트
- job_name: "spring-boot"
metrics_path: "/actuator/prometheus"
static_configs:
- targets: ["아이피:포트"]
다음과 같이 상황에 맞게 설정해준다. 이제 프로메테우스를 실행해본다.
1
nohup ./prometheus --config.file=prometheus.yml --web.listen-address=:실행할_포트번호 > prometheus.log 2>&1 &
아이피:포트번호 로 접속해본다. 정상적으로 설정되었다면 이런 창이 뜬다.
여기서 상단 메뉴의 Status -> Targets로 들어가본다.
Status가 초록초록하다면 잘 수집하고 있다는 뜻이다.
Grafana
위의 링크로 접속해서 설치해준다. 압축파일로 받는게 편한 것 같다.
1
2
3
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.0.5.linux-amd64.tar.gz
tar -zxvf grafana-enterprise-9.0.5.linux-amd64.tar.gz
압축해제후 /bin 폴더에서 서버를 실행해준다.
1
nohup ./grafana-server > grafana.log 2>&1 &
기본 실행 포트는 3000번이다. 서버 실행 후 아이피:3000 으로 접속하면 로그인 창이 뜨는데, 초기 설정은 id 비밀번호 모두 admin이다. 로그인 후 비밀번호 변경 창이 뜨니까 바꿔주자.
grafana dashboard 로 가서 템플릿을 줍줍해야 한다. 그전에 Configuration -> Data sources에 가서 프로메테우스를 등록해주자. Add Datasource를 클릭한다.
프로메테우스를 선택한다.
값을 알맞게 잘 넣고 맨 하단의 Save & test 버튼을 눌러 확인한다. 테스트가 성공했다면 초록불과 함께 저장된다.
이제 템플릿을 줍줍할 시간이다.
Node Exporter Full, JVM (Micrometer), Spring Boot 2.1 System Monitor 등 필요하거나 마음에 드는 템플릿의 id값을 복사해온다.
Dashboard -> import에 들어간 후 id값을 넣어주고, 몇 가지 설정만 하면 대시보드 확인이 가능하다. 나는 이미 추가된 상태라 빨간 경고들이 뜬다.
설정 완료 시 다음과 같은 대시보드들을 확인할 수 있다.
후기
생각보다 메모리 사용량이 얼마 안되는 것 같다. 데이터를 가공해서 보내는 기존의 에이전트 방식이 아니라 그런가, 메모리 사용량을 잡아봤는데 10MB 언저리다. 운영중인 서비스에 도입해봐도 큰 문제가 없을 것 같다.
참고
https://velog.io/@sojukang/%EC%84%B8%EC%83%81%EC%97%90%EC%84%9C-%EC%A0%9C%EC%9D%BC-%EC%89%AC%EC%9A%B4-Prometheus-Grafana-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-%EC%84%A4%EC%A0%95
https://hapajay.tistory.com/82
https://owin2828.github.io/devlog/2020/03/13/etc-6.html