카카오톡 클론코딩(12) - prometheus, grafana
이번에는 프로메테우스 그라파나에 대해 알아보자
프로메테우스는 서버의 CPU 사용량, 메모리 사용량, HTTP 응답시간 등을 모니터링하기 위한 도구다.
그라파나는 그러한 프로메테우스의 데이터들을 시각화하기 위한 도구다.
즉 프로메테우스는 데이터를 수집하고 저장하고 그것을 시각화한 게 그라파나이다.
프로메테우스는 pull 방식의 모니터링을 하는데 서버에서 제공하는 /metrics 엔드포인트를 주기적으로 가져가 데이터베이스에 저장한다.
프로메테우스를 사용할라면 일단 프로메테우스를 설치해야 한다.
나는 맥북을 이용하기 때문에 Mac 기준으로 설명을 할 것이다.
brew install prometheus
프로메테우스를 설치해 주고 설치된 경로를 확인해야 한다.
/opt/homebrew/etc/prometheus.yml
나 같은 경우엔 이 경로에 yml 파일이 존재했다.
해당 경로의 yml 파일을 열어주자
sudo nano /opt/homebrew/etc/prometheus.yml
이제 프로메테우스의 설정파일을 수정해줘야 한다.
global:
scrape_interval: 15s
scrape_configs:
- job_name: "kokoatalk-api"
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ["스프링 서버 주소"]
scheme: https
tls_config:
insecure_skip_verify: true
https로 연결하는 거고, 15초마다 수집한다. job_name 은 kokoatalk-api로 지정해 뒀다.
targets는 서버의 주소를 적어줘야 하는데 로컬일 경우 보통 localhost:8080를 사용하면 될 것이다.
insecure_skip_verify: true 이 부분은 프로메테우스가 http로 요청하고 https로 리다이렉트 되면서 TLS handshake에 문제가 발생했기 때문에 인증서 검증을 건너뛰게 설정해 줬다. 물론 실제 운영환경에서는 사용하는 것을 지양해야 한다. 리다이렉트 되는 원인은 내가 프로젝트에서 스프링 부트 설정을 http 요청을 모두 https로 리다이렉트 하게 만들어 놨기 때문이다.
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
그 후 의존성을 추가해 주자
그 후 application.yml 에 설정을 추가해 주자
server:
management:
endpoints:
web:
exposure:
include: prometheus, health, metrics
metrics:
enable:
all: true
tags:
application: KokoatalkServerApplication
exposure.include를 통해서 prometheus, health, metrics 정보를 포함하게 해 뒀다. 다른 블로그들을 보면 *로 해도 되지만 왜인지 나는 제대로 작동하지 않아서 따로 지정해 줬다. (좀 찾아보니 Spring Boot 3.0 이상에서는 명시적으로 지정해줘야 한다고 한다.)
metrics.enable.all : true 설정을 통해 기본 제공되는 모든 메트릭들을 활성화해준다 ex) JVM, CPU, HTTP 요청 등
tags.application : 메트릭에 application=KokoatalkServerApplication 태그 정보를 추가해서 사용에 편리함을 더해줬다.
Grafana 에서 필터링할 때 Application 단위로 구분 할 수 도 있다.
이제 설정이 끝났으니
프로메테우스를 실행시켜 보자
brew services start prometheus
그 후 로컬에서 실행시킨 경우 일반적으로 localhost:9090에서 프로메테우스 웹 UI를 확인할 수 있다.
물론 aws 같이 원격서버에서 실행한다면 localhost가 아닐것이다.
성공적으로 실행됐다면 State가 UP 상태로 표시될 것이다.
물론 Spring Security를 사용 중이라면 /actuator/** 경로를 허용시켜 놔야 정상적으로 정보를 받아 올 것이다.
물론 프로메테우스를 이용해서 직접 쿼리를 검색해 가며 데이터를 분석할 수는 있지만 그건 너무 비효율적이니 이제 그라파나를 통해서 시각화를 해볼 것이다.
brew install grafana
똑같이 그라파나를 설치해 주자
brew services start grafana
별도의 설정 없이 바로 그라파나를 실행시켜 주자
그 후 기본적으로는 그라파나는 http://localhost:3000을 통해 접속해 주면 된다.
기본 로그인은 ID : admin, PW : admin이다.
처음에는 먼저 Connections -> Data sources에서 프로메테우스를 추가해줘야 한다. 나는 이미 추가시켜 놨기에 사진엔 있지만 처음에는 아무것도 없을 것이다. Add new data sources를 누르고 타입은 프로메테우스를 선택해 주면 된다.
이름을 적절히 지정해 주고 URL에는 http://localhost:9090(프로메테우스 주소)을 넣어주면 된다.
그 후 그라파나를 통해서 기본적인 대시보드를 만들어 볼 것이다.
대시보드 패널에서 New dashboard를 눌러보자
Add visualization을 눌러 프로메테우스 데이터소스를 선택해 주면 된다.
그 후 대시보드에 프로메테우스 쿼리를 등록해 대시보드를 꾸며주면 된다. 하지만 초보자에겐 뭐가 뭔지도 모르는데 뭘 추가하고 뭘 관리해야 하지 이런 점이 어려울 수 있다. 그런 어려움을 극복할 방법으로 커스텀 대시보드를 import 해오는 방법이 있다.
Grafana dashboards | Grafana Labs
No results found. Please clear one or more filters.
grafana.com
위의 링크를 통해서 대시보드에서 검색해 보면 되는데 나는 Spring을 이용하기 때문에
Spring Boot 2.1 System Monitor
Spring Boot 2.1 System Monitor | Grafana Labs
The Spring Boot 2.1 System Monitor dashboard uses the prometheus data source to create a Grafana dashboard with the graph and singlestat panels.
grafana.com
Spring Boot Http를 이용해 줬다.
Spring Boot Http (3.x) | Grafana Labs
Introduction This dashboard is designed to monitor the state and performance of HTTP requests in a Spring Boot application. It uses Spring Boot Actuator to expose metrics and Prometheus to collect and store these metrics. Grafana is then used to visualize
grafana.com
먼저 Spring Boot 2.1 System Monitor 대시보드를 보자
패널은 크게 7가지로 구분 되어 있다.
- Basic Statics : 전체적인 서버 상태의 요약이라 보면 된다.
- JVM Statistics - Heaps : Heap 메모리, Non-Heap 메모리에 대한 상태 정보를 알려준다.
- JVM Statistics Threads/Buffers : JVM의 스레드 상태, 클래스 로딩, 네이티브 메모리 버퍼 사용량에 대한 상태 정보를 알려준다.
- JVM Statistic - GC : GC로 인해 JVM이 일시 정지된 시간 등 GC에 대한 상태 정보를 알려준다.
- HikariCp Statistics : 커넥션 수와 타임아웃 빈도 등 DB 연결의 상태 정보를 알려준다.
- Jetty Statistics : Jetty 서버에 대한 HTTP 요청 패턴, 응답 시간에 대한 상태 정보를 알려 준다. (나는 따로 설정을 안해 Tomcat이다. 즉 Jetty 서버에 대한 정보가 없을것) Tomcat이라면 패널을 삭제해도 무방할 것이다.
- Logback Statistics : 로그의 레벨별 통계를 알려준다.
기본적으로 CPU 사용량, 메모리 사용량, Hikari CP, HTTP 요청 수, GC 사용량, 로깅 이벤트 등등을 알려준다.
그다음으로는 Spring Boot HTTP이다.
들어온 요청의 개수, 그리고 요청의 응답 상태, HTTP 요청의 응답시간 등을 나타낸다.
지금은 위의 사진에 /actuator/prometheus 만 나타나 있지만 (현재 따로 요청을 보낸적도 없고, 프로메테우스가 데이터만 보내주고 있기 때문이다.) 요청을 보내면 해당 요청의 항목도 나타날 것이다.
그리고 처음에는 저렇게 어떤 요청이 들어온 건지 깔끔하게 안 나타날 수도 있는데
이 부분에서 Edit을 눌러서 Options 항목에서 Legend를 Auto에서 Custom으로 바꿔주자
위와 같이 {{method}} - {{uri}} - {{status}} 설정하면 메서드(GET, POST, PUT, DELETE), uri, 상태코드 이렇게 나타낼 수 있다.
나 같은 경우는 어디서 병목이 생기는지 확인하기 위해 Spring Boot HTTP를 확인하다. nGrinder에 없는 오류가 없는데 Prometheus 에서는 5XX 응답이 잡히는걸 보고 잘못된 테스트가 진행되고 있었다는 걸 깨달았다. 이제 테스트를 진행하면서 어떤 api가 응답시간이 늦는지 패널을 통해 확인해 보면 병목도 잡을 수 있을 것이다.