SpringBoot Actuator + Prometheus + Grafana

2021. 7. 24. 16:55SpringBoot 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 이 호출되는지 확인한다.

프로젝트 설정 확인 URL 테스트

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 Endpoints URL

지금까지 Actuator의 주요 기능인 애플리케이션의 정보를 수집하고 HTTP Url을 통하여 정보를 확인할 수 있다는 것을 확인할 수 있었다.

 

다음으로 Prometheus를 통한 metric 정보 수집 분석에 대해 알아보자.

 

03. Prometheus

프로그램 다운로드

https://prometheus.io/download/

 

Download | Prometheus

An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

prometheus.io

 

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 화면이 정상적으로 보일 것이다.

Prometheus 메인 화면

Metric 정보 확인을 위하여 빨간색 네모 부분을 선택하면 아래와 같이 Metric 목록이 보일 것이다.

Metrics 목록

목록에서 go_gc_duration_seconds 항목을 선택한다.

go_gc_duration_seconds 정보

위의 그림과 같이 쿼리 실행결과과 존재한다면 목록이 보일 것이다.

다음으로 Graph 탭을 선택하여서 그래프 정보 확인

그래프 정보

다음으로 Grafana를 이용한 매트릭 정보들을 시각화에 대해 알아보자.

 

04. Grafana

프로그램 다운로드

https://grafana.com/grafana/download

 

Download Grafana

Overview of how to download and install different versions of Grafana on different operating systems.

grafana.com

설정 정보 수정이 완료되었다면 압축 해제한 프로그램 폴더의 bin/grafana-server.exe를 실행한다

Grafana 서버 실행

 

Prometheus Data Source 등록

 

서버 실행이 정상적으로 수행되었다면 http://localhost:3000을 호출한다.

정상적으로 호출되었다면 아래와 같이 Prometheus UI 화면이 정상적으로 보일 것이다.

Grafana Main

초기 계정 정보는 username : admin, password :  admin이다.

Log In을 실행하게 되면 패스워드 변경을 해야 한다.

패스워드 변경

패스워드 변경 후 Submit 실행한다.

Grafana 메인

빨간색 네모 부분에 DATA SOURCES 부분을 선택한다.

Prometheus Data Source 선택

Prometheus를 선택한다.

Data Source 설정

Data Source 정보를 입력하기 전에 Prometheus 서버는 실행되어 있어야 한다.

HTTP 부분의 URL 정보에 Prometheus 서버 URL 인 http://localhost:9090 정보를 입력 후 아래의 그림과 같이 Save & Test를 실행한다. 

Data Source 테스트

정상적으로 연결이 되었다면 위의 그림과 같이 Data source is working이라는 메시지를 볼 수 있을 것이다.

 

Panel 추가

 

패널 추가

Panel 추가를 위해서 위의 그림과 같이 Create를 선택

 

Panel 선택

Add an empty panel 선택

 

Metric 조회

Metrics browser 입력 칸에 go_gc_duration_seconds 입력하면 위의 그림같이 Prometheus 대시보드에서 보았던 그래프를 볼 수 있다. Save 하면 아래와 같이 추가된 Panel을 확인할 수 있다.

 

Panel 추가 완료

Dashboard Import

 

내가 원하는 Dashboard를 만들기 위해서 내가 원하는 Metric 정보들을 Panel로 다 등록해야하는데 이 부분이 매우 번거로울 수 있다.  Grafana 사이트에 보면 많은 사람들이 Dashboard 들을 json 형태로 등록 해 두었다. 

 

이 중에 SpringBoot Apm Dashboard를 Import 해보도록 하자.

 

우선 아래 사이트에서 json 파일을 다운로드 한다.

https://grafana.com/grafana/dashboards/12900

 

SpringBoot APM Dashboard dashboard for Grafana

Dashboard for Spring Boot Metrics

grafana.com

 

Import 메뉴 선택

SpringBoot Apm Dashboard Import

Upload JSON file 선택 후 다운로드한 JSON 파일 선택

Upload File 선택

파일 선택하면 Name, Folder, Unique identifier 부분은 자동으로 채워진다.

Prometheus 캄보 박스만 Prometheus로 선택 후 Import 클릭

Upload File

Import 후 아래와 같이 Dashboard가 보일 것이다.

 

예제 소스

https://github.com/roopy1210/spring-boot-monitoring

 

GitHub - roopy1210/spring-boot-monitoring

Contribute to roopy1210/spring-boot-monitoring development by creating an account on GitHub.

github.com

 

예제 관련 동영상 강의

https://www.youtube.com/watch?v=gJZhdEJvZmc 

 

반응형