Why
서비스를 배포했다. 그런데 제대로 돌아가는걸까?
- api별로 호출 시간은 어느 정도인지, 병목은 없는지
- 런타임에서 예상치 못한 예외가 발생했는지
- 서버의 CPU, 메모리 사용량이 위험하지는 않은지
- SQL 쿼리가 데이터베이스에 부담을 주지는 않는지
- 사용자가 부적절한 호출을 하지는 않는지(보안 위협)
등등.. 추적 관리해야 할 것 들이 매우 많다.
이런 문제들을 관리하기 위해 모니터링 시스템을 구축하기로 했다.
What
먼저 추적하고자 하는 내용을 간추려 보자.
1. 서버의 시스템 메트릭 정보
2. Springboot 애플리케이션의 메트릭 정보
3. 애플리케이션에서 발생한 error 로그
4. RDS에서 발생한 슬로우 쿼리, N+1 쿼리
How
AWS의 CloudWatch라는걸 이용할 수도 있지만, 추후 AWS지원이 종료될 것을 대비하여 오픈소스 위주로 찾아보았다.
1. 서버의 시스템 메트릭 정보는 node exporter를 사용하여 매트릭 수집이 가능하다.
2. Springboot 애플리케이션의 메트릭 정보는 Spring Boot Actuator를 통해 수집이 가능하다.
3. loki로 수집한 error로그를 grafana에서 볼 수 있고, alert를 통해 슬랙 알림을 받고 싶다.
4. RDS도 모니터링 하면 좋은데, 일단 위 세개를 먼저 완성하고 추후에 추가해보는걸로 하자.
메트릭, 로그 수집 node exporter, Spring Boot Actuator, Loki
-> 메트릭 저장, 쿼리 Prometheus
-> 시각화, 알림 전송 Grafana
Sentry? 어플리케이션 오류 추적 및 성능 모니터링
Actuator는 애플리케이션의 상태와 메트릭을 모니터링함
애플리케이션 서버
Node exporter
https://github.com/prometheus/node_exporter
GitHub - prometheus/node_exporter: Exporter for machine metrics
Exporter for machine metrics. Contribute to prometheus/node_exporter development by creating an account on GitHub.
github.com
docker run -d \
--net="host" \
--pid="host" \
--name=node_exporter \
-v "/:/host:ro,rslave" \
quay.io/prometheus/node-exporter:latest \
--path.rootfs=/host
1. 도커 이미지 실행 (추후 docker-compose에 추가하자)
2. 보안그룹 인바운드 규칙에 9100 포트 추가
3. http://<EC2-Instance-IP>:9100/metrics 로 접속하면 메트릭 정보를 볼 수 있다.
...
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 75979.3
node_cpu_seconds_total{cpu="0",mode="iowait"} 24.32
node_cpu_seconds_total{cpu="0",mode="irq"} 0
node_cpu_seconds_total{cpu="0",mode="nice"} 14.33
node_cpu_seconds_total{cpu="0",mode="softirq"} 6.74
node_cpu_seconds_total{cpu="0",mode="steal"} 30.05
node_cpu_seconds_total{cpu="0",mode="system"} 55.88
node_cpu_seconds_total{cpu="0",mode="user"} 387.61
...
모니터링 서버
docker network 를 만들어준다. 추후 grafana에서 prometheus를 등록하려면 각 컨테이너가 같은 네트워크에 존재해야 한다.
docker network create monitoring
Prometheus
Prometheus - Monitoring system & time series database
An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.
prometheus.io
1. prometheus.yml 작성
global:
scrape_interval: 15s # 기본 스크레이핑 간격을 설정합니다.
evaluation_interval: 15s # 알림 규칙 평가 간격을 설정합니다.
scrape_configs:
- job_name: 'prometheus' # Prometheus 자체 메트릭을 수집합니다.
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter' # Node Exporter를 통해 서버 메트릭을 수집합니다.
static_configs:
- targets: ['{ec2-server-ip}:9100']
2. 도커로 실행
docker run -d \
-p 9090:9090 \
--name=prometheus \
--network=monitoring \
-v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus
http://localhost:9090/targets로 접속하면 yml에서 설정한 target을 잘 읽어오는지 확인할 수 있다.
Grafana
Prometheus를 통해 주기적으로 메트릭을 수집 할 수 있지만, 확인하기엔 어려움이 있다.
매번 PromQL을 통해 원하는 지표를 질의해야 하므로, 원하는 정보를 시간대별로 모아서 보기에는 어렵다.
Grafana는 수집된 데이터를 시각화해주는 프로그램이다.
https://grafana.com/oss/grafana/
Grafana OSS | Leading observability tool for visualizations & dashboards
The evolution of Grafana Inspired by the open source community and our growing number of users, Grafana introduces new innovations in every release to improve how you visualize, correlate, and share your data.
grafana.com
1. 도커로 실행
이때 volumn을 지정하지 않으면 컨테이너 삭제시 쌓인 데이터도 삭제된다. 따라서 경로를 지정하여 컨테이너가 삭제되어도 데이터를 유지할 수 있도록 해야 한다.
docker run -d \
-p 3000:3000 \
--name=grafana \
--network=monitoring \
-v /path/on/host:/var/lib/grafana \
grafana/grafana-enterprise
Grafana에서 prometheus 를 등록할 때 컨테이너 이름으로 주소를 입력하면 된다.
docker-compose.yml
version: '3'
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
networks:
- my-network
grafana:
image: grafana/grafana
ports:
- "3000:3000"
networks:
- my-network
depends_on:
- prometheus
networks:
my-network:
1. Grafana Labs에서 원하는 대시보드를 검색한다.
https://grafana.com/grafana/dashboards/
Dashboards | Grafana Labs
Thank you! Your message has been received!
grafana.com
나는 Node-exporter Full 이라는 대시보드를 사용해보기로 했다. 우측 하단에 ID가 있다. 이것을 복사한다. (Copy Id to clipboard)
Grafana Dashboard에서 New > Import 를 클릭한다.
Dashboard의 ID를 입력한 후 Load를 누르면
내용이 불러와진다. 아래 쪽에서 시각화할 prometheus 채널도 선택한다.
알록달록한 대쉬보드 만들기 성공!
다음은 스프링 애플리케이션 메트릭 수집, 애플리케이션 로그 수집을 다룰 예정이다.