모니터링이란 지속적으로 특정 대상을 감시하고 있는 행위라고 한다. 굳이 개발분야가 아니더라도, 다양한 산업에서도 쓰이는 용어이다. 하지만 개발 분야에서는 어플리케이션의 상태를 지속적으로 관찰하고, 특이점을 보이는 지표에 대해서 적절한 조치를 취하는 것이 주 목적이라고 할 수 있다. 모니터링을 쉽게 하기 위해서 이용하는 툴 중에서는 프로메테우스
와 그라파나
가 대표적이다. 질문의 취지에 맞게 프로메테우스
와 그라파나
가 무엇인지와 Spring
환경에서 어떻게 사용하는지에 대해서 간단하게 알아보자.
프로메테우스
와 그라파나
에 대한 설명은 공식 문서에서 소개한 문구로 알아보자.
Prometheus is an open-source systems monitoring and alerting toolkit originally built at SoundCloud.
Prometheus collects and stores its metrics as time series data, i.e. metrics information is stored with the timestamp at which it was recorded, alongside optional key-value pairs called labels.
- 프로메테우스 Docs
프로메테우스
는 모니터링과 알림 툴킷이고, 지표를 시계열 데이터로 수집, 저장을 한다고 한다.
아래 그림은 프로메테우스
공식 홈페이지에 있는 프로메테우스
의 아키텍쳐이다. 프로메테우스
는 targets으로부터 metrics를 수집하고, 이를 저장을 한다. 알람을 전달할 필요가 있다면 전달을 하고, 그라파나와 같은 데이터 시각화 도구가 PromQL이라는 쿼리를 통해 데이터를 질의하면 데이터를 전달해준다.
Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored. Create, explore, and share dashboards with your team and foster a data-driven culture - 그라파나 Github
그라파나
는 지표를 질의, 시각화, 알림을 주고, 대시보드를 만들어준다고 한다. 대시보드를 만드는 것이 그라파나의 핵심 기능이다. 앞서 프로메테우스
에서 수집, 저장한 지표를 통해 보기 좋은 대시보드를 만들어내는 기능을 실제로 많이 사용한다고 한다.
프로메테우스 역시 그래프를 그릴 수 있는 기능이 있는데, 그라파나를 이용하는 이유는 다음 사진으로 아주 간단하게 이해할 수 있다.
프로메테우스 | 그라파나 |
---|---|
![]() |
|
위의 사진에서는 둘의 큰 차이점을 보기 힘들지만, 그라파나의 경우 대시보드를 커스텀할 수 있고, 다른 사람이 만든 대시보드를 이용할 수 있다는 장점이 있다.
아래 이미지는 Spring Boot 2.1 System Monitor라는 대시보드이다. 이 사진을 보면 왜 그라파나를 이용하는지 쉽게 이해가 간다. (나는 상상도 안가는 형태이다.)
Spring Actuactor란 Spring의 사이드 프로젝트로 어플리케이션을 모니터링할 수 있도록 도움을 주는 라이브러리다. Spring에서 알 수 있는 다양한 지표들을 제공하며, MicroMeter
라는 라이브러리를 이용해 모니터링 툴에 맞는 형태로 데이터를 변환하여 이용할 수 있게 해준다.
Gradle
, Maven
에 다음과 같이 입력해주면 쉽게 이용이 가능하다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator' //actuator 추가
implementation 'io.micrometer:micrometer-registry-prometheus' //프로메테우스 데이터 형태로 변환
}
MicroMeter
에서 변환이 가능한 모니터링 툴들에 대한 정보는 Actuator Docs에 나와있다.
Actuator
에서 제공하는 지표들은 정말 많지만 위에서 소개한 Spring boot 2.1 System Monitor에서 사용한 지표를 몇개 살펴보자. 전체 지표는 역시 docs에 있다.
큰 분류를 살펴보면 7개로 나뉜다. 각 분류에서 어떤 지표를 다루는지 간략하게 알아보자.
Basic Statistics
시스템이 언제 시작했고, 얼마나 가동되었는지, CPU, Memory의 사용율에 대한 지표를 다룬다.
JVM Statistics - Heaps
Heap과 Non-Heap 영역에서의 메모리를 얼마나 이용했는지에 대한 지표를 다룬다.
JVM Statistics - Threads/Buffers
작동하는 Thread와 Buffere에 관련된 지표를 다룬다.
JVM Statistics - GC
GC가 동작한 횟수, Stop the world
가 작동한 기간에 관한 지표를 다룬다.
HikariCP Statistics
전체 커넥션의 수, 커넥션이 타임아웃된 횟수, 작동, 대기, 휴식중인 커넥션의 수 등 커넥션과 관련된 지표를 다룬다.
Tomcat Statistics
작동중인 쓰레드, 초당 Http 요청의 수, 요청을 처리하는데 걸린 시간, 발생한 응답 코드 등 Web 관련된 지표를 다룬다.
Logback Statistics
각 레벨(info
, error
, warn
, debug
, trace
)에 해당하는 로그가 언제 몇개가 발생했는지에 대한 지표를 다룬다.
Spring과 Prometheus, Grafana를 함께 적용하는 것은 크게 어렵지 않다.
앞서 소개한 것 처럼 Spring
프로젝트의 빌드 도구에 Prometheus
와 Actuator
에 대한 의존성을 추가한 이후, Prometheus
의 설정파일인 prometheus.yml
에 scrape_configs
하위에 다음과 같이 추가해주면 된다.
- job_name: "spring-actuator" // 프로메테우스에 표기할 이름
metrics_path: "/actuator/prometheus" // metrics를 제공받는 p경로
scrape_interval: 1s // metrics를 수집할 시간
static_configs:
- targets: ["localhost:8080"] // 타겟의 주소
이후 Grafana
에선 왼쪽 하단의 설정버튼 클릭 -> add datasource -> prometheus -> url 입력 -> 저장 버튼을 클릭하면 된다.
자세한 내용은 아래 이미지를 통해 살펴보면 된다.