2021. 7. 24. 16:55ㆍSpringBoot Monitoring
SpringBoot Actuator를 통하여 애플리케이션의 모니터링 정보를 관리하고 Prometheus를 통하여서 Metric 정보를 수집 분석하고 Grafana를 통하여 시각화하는 방법에 대한 기본적인 내용을 정리해보려고 한다.
Spring Boot Actuator
애플리케이션에 대한 모니터링 하고 매트릭 정보를 수집하고 이 정보들을 HTTP 또는 JMX를 통하여서 관리할 수 있다.
Prometheus
매트릭 정보 수집 분석
Grafana
시각화
Prometheus와 Grafana를 사용하는 가장 큰 차이점에 대해 생각해보고 찾아봤을 때 아래와 같은 글을 보았다.
with Prometheus primarily on the gathering side and Grafana on the reporting side.
Prometheus는 정보를 수집하고 Grafana는 수집된 정보를 정리하는 쪽에 가깝다 라는 의미로 해석이 되는데 이 말이 Prometheus와 Grafana에 대한 설명을 대표하는 거 같다.
예제 프로그램을 통하여서 Spring Actuator를 통하여 정보를 수집하고 Actuator의 매트릭 정보를 Prometheus를 통하여 수집 분석하고 Grafana를 통하여 시각화하는 방법에 대해 알아보자.
01. 프로젝트 설정
프로젝트 생성 후 위와 같이 설정 파일과 코드를 작성한다.
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
</parent>
<groupId>com.roopy</groupId>
<artifactId>spring-boot-monitoring</artifactId>
<version>1.0-SNAPSHOT</version>
<description>SpringBoot Actuator + Prometheus + Grafana Example Projects</description>
<properties>
<java.version>9.0.4</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
application.yml
server:
port: 7000
spring:
application.name: spring-data-redis
output.ansi.enabled: always
위와 같이 프로젝트 구조 작성이 완료되었다면 서버 실행 후 아래와 같이 /greeting 이 호출되는지 확인한다.
02. SpringBoot Actuator
pom.xml 에 actuator dependency 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.yml 에 설정 추가
management.endpoints.web.exposure.include: '*'
management.endpoint.health.show-details: always
설정 추가 후 서버 재시작
설정이 정상적으로 반영되었다면 Exposing 13 endpoint(s) beneath base path '/actuator' 다음과 같은 메시지를 확인할 수 있다.
메시지 확인이 정상적으로 되었으면 http://localhost:7000/actuator를 호출해본다.
정상적으로 호출되었다면 아래와 같은 json 형태의 데이터가 보일 것이다.
지금까지 Actuator의 주요 기능인 애플리케이션의 정보를 수집하고 HTTP Url을 통하여 정보를 확인할 수 있다는 것을 확인할 수 있었다.
다음으로 Prometheus를 통한 metric 정보 수집 분석에 대해 알아보자.
03. Prometheus
프로그램 다운로드
https://prometheus.io/download/
Prometheus 매트릭 정보 등록을 위해서 pom.xml 에 dependency 추가
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.7.1</version>
</dependency>
서버 재기동 후 http://localhost:7000/actuator/prometheus 호출 후 정보 확인
# HELP tomcat_sessions_active_max_sessions
# TYPE tomcat_sessions_active_max_sessions gauge
tomcat_sessions_active_max_sessions 0.0
# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 9632768.0
jvm_memory_used_bytes{area="heap",id="G1 Survivor Space",} 9437184.0
jvm_memory_used_bytes{area="heap",id="G1 Old Gen",} 9754160.0
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 4.155732E7
jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 1343488.0
jvm_memory_used_bytes{area="heap",id="G1 Eden Space",} 6.6060288E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 5050992.0
jvm_memory_used_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 2571904.0
# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool
# TYPE jvm_buffer_count_buffers gauge
jvm_buffer_count_buffers{id="mapped",} 0.0
jvm_buffer_count_buffers{id="direct",} 4.0
# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use
# TYPE jvm_memory_committed_bytes gauge
jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'profiled nmethods'",} 1.048576E7
jvm_memory_committed_bytes{area="heap",id="G1 Survivor Space",} 9437184.0
jvm_memory_committed_bytes{area="heap",id="G1 Old Gen",} 5.8720256E7
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 4.4957696E7
jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'non-nmethods'",} 2555904.0
jvm_memory_committed_bytes{area="heap",id="G1 Eden Space",} 9.1226112E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 5636096.0
jvm_memory_committed_bytes{area="nonheap",id="CodeHeap 'non-profiled nmethods'",} 2686976.0
...
정상적으로 호출되었다면 위와 같은 정보들을 확인할 수 있을 것이다.
위의 매트릭 정보를 수집하기 위해 prometheus.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'.
static_configs:
- targets: ['localhost:9090']
- job_name: 'spring-actuator'
metrics_path: '/actuator/prometheus'
scrape_interval: 5s
static_configs:
- targets: ['localhost:7070']
job_name: 'spring-actuator' 부분부터 추가된 정보이다.
설정 정보 수정이 완료되었다면 압축 해제한 프로그램 폴더의 prometheus.exe를 실행한다.
서버 실행이 정상적으로 수행되었다면 http://localhost:9090을 호출한다.
정상적으로 호출되었다면 아래와 같이 Prometheus UI 화면이 정상적으로 보일 것이다.
Metric 정보 확인을 위하여 빨간색 네모 부분을 선택하면 아래와 같이 Metric 목록이 보일 것이다.
목록에서 go_gc_duration_seconds 항목을 선택한다.
위의 그림과 같이 쿼리 실행결과과 존재한다면 목록이 보일 것이다.
다음으로 Graph 탭을 선택하여서 그래프 정보 확인
다음으로 Grafana를 이용한 매트릭 정보들을 시각화에 대해 알아보자.
04. Grafana
프로그램 다운로드
https://grafana.com/grafana/download
설정 정보 수정이 완료되었다면 압축 해제한 프로그램 폴더의 bin/grafana-server.exe를 실행한다
Prometheus Data Source 등록
서버 실행이 정상적으로 수행되었다면 http://localhost:3000을 호출한다.
정상적으로 호출되었다면 아래와 같이 Prometheus UI 화면이 정상적으로 보일 것이다.
초기 계정 정보는 username : admin, password : admin이다.
Log In을 실행하게 되면 패스워드 변경을 해야 한다.
패스워드 변경 후 Submit 실행한다.
빨간색 네모 부분에 DATA SOURCES 부분을 선택한다.
Prometheus를 선택한다.
Data Source 정보를 입력하기 전에 Prometheus 서버는 실행되어 있어야 한다.
HTTP 부분의 URL 정보에 Prometheus 서버 URL 인 http://localhost:9090 정보를 입력 후 아래의 그림과 같이 Save & Test를 실행한다.
정상적으로 연결이 되었다면 위의 그림과 같이 Data source is working이라는 메시지를 볼 수 있을 것이다.
Panel 추가
Panel 추가를 위해서 위의 그림과 같이 Create를 선택
Add an empty panel 선택
Metrics browser 입력 칸에 go_gc_duration_seconds 입력하면 위의 그림같이 Prometheus 대시보드에서 보았던 그래프를 볼 수 있다. Save 하면 아래와 같이 추가된 Panel을 확인할 수 있다.
Dashboard Import
내가 원하는 Dashboard를 만들기 위해서 내가 원하는 Metric 정보들을 Panel로 다 등록해야하는데 이 부분이 매우 번거로울 수 있다. Grafana 사이트에 보면 많은 사람들이 Dashboard 들을 json 형태로 등록 해 두었다.
이 중에 SpringBoot Apm Dashboard를 Import 해보도록 하자.
우선 아래 사이트에서 json 파일을 다운로드 한다.
https://grafana.com/grafana/dashboards/12900
Import 메뉴 선택
Upload JSON file 선택 후 다운로드한 JSON 파일 선택
파일 선택하면 Name, Folder, Unique identifier 부분은 자동으로 채워진다.
Prometheus 캄보 박스만 Prometheus로 선택 후 Import 클릭
Import 후 아래와 같이 Dashboard가 보일 것이다.
예제 소스
https://github.com/roopy1210/spring-boot-monitoring
예제 관련 동영상 강의
https://www.youtube.com/watch?v=gJZhdEJvZmc