Back-End/Spring

[Spring Boot 핵심원리와 활용] 마이크로미터, 프로메테우스, 그라파나

seungwook_TIL 2025. 5. 10. 19:21

이 글은 인프런 김영한님의 Spring 강의를 바탕으로 개인적인 정리를 위해 작성한 글입니다.


마이크로미터

  • 세상에는 수 많은 모니터링 툴이 있고, 시스템의 다양한 정보를 이 모니터링 툴에 전달해서 사용하게 된다.
  • 모니터링 툴이 작동하려면 시스템의 다양한 지표들을 각각의 모니터링 툴에 맞도록 만들어서 보내주어야 한다.
  • 그런데 중간에 사용하는 모니터링 툴을 변경하면 기존에 측정했던 코드를 모두 변경한 툴에 맞도록 다시 변경해야 한다.
  • 개발자 입장에서는 단순히 툴 하나를 변경했을 뿐인데, 측정하는 코드까지 모두 변경해야 하는 문제가 발생한다.
  • 이런 문제를 해결하는 것이 바로 마이크로미터(Micrometer)라는 라이브러리이다.

 

다양한 메트릭

마이크로미터와 액츄에이터가 기본으로 제공하는 다양한 메트릭은 아래와 같다.

  • JVM 메트릭
  • 시스템 메트릭
  • 애플리케이션 시작 메트릭
  • 스프링 MVC 메트릭
  • 톰캣 메트릭
  • 데이터 소스 메트릭
  • 로그 메트릭
  • 기타 수 많은 메트릭
  • 사용자가 메트릭을 직접 정의하는 것도 가능

 

이 중에서 톰캣 메트릭을 모두 사용하려면 아래와 같은 옵션을 켜야한다.(옵션을 켜지 않으면 tomcat.session. 관련 정보만 노출된다.)

application.yml

server:
  tomcat:
    mbeanregistry:
      enabled: true

톰캣 메트릭은 tomcat. 으로 시작한다.

톰캣 메트릭을 사용하면 톰캣의 최대 쓰레드, 사용 쓰레드 수를 포함한 다양한 메트릭을 확인할 수 있다.

  • tomcat.sessions.active.current: 현재 활성 세션 수
  • tomcat.sessions.active.max: 최대 활성 세션 수
  • tomcat.sessions.created: 생성된 세션의 총 수
  • tomcat.sessions.expired: 만료된 세션 수
  • tomcat.sessions.rejected: 거부된 세션 수 (최대 수용 초과 등)
  • tomcat.threads.busy: 현재 요청을 처리 중인 쓰레드 수
  • tomcat.threads.current: 현재 생성된 총 쓰레드 수
  • tomcat.global.sent: 톰캣이 전송한 총 바이트 수
  • tomcat.global.received: 톰캣이 수신한 총 바이트 수
  • tomcat.servlet.request.max: 가장 오래 걸린 요청의 처리 시간 (ms)
  • tomcat.servlet.request.count: 전체 요청 수
  • tomcat.servlet.request: 평균 요청 처리 시간 (ms)

 

지원하는 다양한 메트릭들은 아래 공식 메뉴얼을 참고

https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.metrics.supported

 

https://docs.spring.io/spring-boot/redirect.html?page=actuator

 

docs.spring.io

 

 

프로메테우스와 그라파나의 관계

프로메테우스

  • 애플리케이션에서 발생한 메트릭을 그 순간만 확인하는 것이 아니라 과거 이력까지 함께 확인하려면 메트릭을 보관하는
    DB가 필요하다.
  • 이렇게 하려면 어디선가 메트릭을 지속해서 수집하고 DB에 저장해야 한다. 프로메테우스가 바로 이런 역할을 담당한다.

 

그라파나

  • 프로메테우스가 DB라고 하면, 이 DB에 있는 데이터를 불러서 사용자가 보기 편하게 보여주는 대시보드가 필요하다.
  • 그라파나는 매우 유연하고, 데이터를 그래프로 보여주는 툴이다. 수 많은 그래프를 제공하고, 프로메테우스를 포함한 다
    양한 데이터소스를 지원한다.

 

  1. 스프링 부트 액츄에이터와 마이크로미터를 사용하면 수 많은 메트릭을 자동으로 생성한다.
  2. 마이크로미터 프로메테우스 구현체는 프로메테우스가 읽을 수 있는 포멧으로 메트릭을 생성한다.
  3. 프로메테우스는 이렇게 만들어진 메트릭을 지속해서 수집한다.
  4. 프로메테우스는 수집한 메트릭을 내부 DB에 저장한다.
  5. 사용자는 그라파나 대시보드 툴을 통해 그래프로 편리하게 메트릭을 조회한다. 이때 필요한 데이터는 프로메테우스를 통해서 조회한다.

 

 

프로메테우스

설치

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

 

본인에게 맞는 OS를 선택한다. Mac OS 사용자는 darwin-arm64(Apple Silicon) 을 선택하면 된다.

 

해당 디렉터리로 이동하고 prometheus를 실행한다.

 

이때 알수 없는 응용프로그램이라서 실행할 수 없다고 메시지가 나오는데, 개인정보 보호 및 보안에서 아래와같이 허용을 해주면 된다.

 

이후 다시 실행하면 아래와 같은 화면이 나타난다.

 

이제 http://localhost:9090 로 접속하면 프로메테우스의 실행화면을 확인할 수 있다.

 

설정

의존성 추가

build.gradle

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator' //actuator 추가
    implementation 'io.micrometer:micrometer-registry-prometheus' //prometheus 추가
}
  • 마이크로미터 프로메테우스 구현 라이브러리를 추가한다.
  • 이렇게 하면 스프링 부트와 액츄에이터가 자동으로 마이크로미터 프로메테우스 구현체를 등록해서 동작하도록 설정해준다.
  • 액츄에이터에 프로메테우스 메트릭 수집 엔드포인트가 자동으로 추가된다. (/actuator/prometheus)
  • http://localhost:8080/actuator/prometheus

 

수집 설정

이제 프로메테우스가 애플리케이션의 /actuator/prometheus 를 호출해서 메트릭을 주기적으로 수집하도록 설정해야 한다.
프로메테우스 폴더에 있는 prometheus.yml 파일에서 아래의 부분을 맨 밑에 추가한다.

prometheus.yml

scrape_configs:
  - job_name: "spring-actuator"
    metrics_path: '/actuator/prometheus'
    scrape_interval: 1m
    static_configs:
      - targets: ['localhost:8080']
  • job_name : 수집하는 이름이다. 임의의 이름을 사용하면 된다.
  • metrics_path : 수집할 경로를 지정한다.
  • scrape_interval : 수집할 주기를 설정한다.(수집 주기의 기본 값은 1m이다. 수집 주기가 너무 짧으면 애플리케이션 성능에 영향을 줄 수 있으므로 운영에서는 10s ~ 1m정도를 권장)
  • targets : 수집할 서버의 IP, PORT를 지정한다.

설정이 끝났으면 프로메테우스 서버를 종료하고 다시 실행해야 한다.

 

프로메테우스 연동 확인

  • 프로메테우스 메뉴 -> Status -> Configuration 에 들어가서 prometheus.yml 에 입력한 부분이 추가되어 있는지 확인
  • http://localhost:9090/config

 

프로메테우스 메뉴 -> Status -> Targets 에 들어가서 연동이 잘 되었는지 확인

http://localhost:9090/targets

  • prometheus : 프로메테우스 자체에서 제공하는 메트릭 정보이다. (프로메테우스가 프로메테우스 자신의 메트릭을 확인하는 것이다.)
  • spring-actuator : 우리가 연동한 애플리케이션의 메트릭 정보이다.
  • State 가 UP 으로 되어 있으면 정상이고, DOWN 으로 되어 있으면 연동이 안된 것이다.

 

기본 기능

  • 검색창에 http_server_requests_seconds_count 를 입력하고 실행
  • Table -> Evaluation time 을 수정해서 과거 시간 조회 가능
  • Graph -> 메트릭을 그래프로 조회 가능

 

  • 태그, 레이블: error , exception , instance , job , method , outcome , status , uri 는 각각의 메트릭 정보를 구분해서 사용하기 위한 태그이다. 마이크로미터에서는 이것을 태그(Tag)라 하고, 프로메테우스에서는 레이블(Label)이라 한다.
  • 숫자: 끝에 마지막에 보면 19 , 6, 2 와 같은 숫자가 보인다. 이 숫자가 바로 해당 메트릭의 값이다.

 

필터

레이블을 기준으로 필터를 사용할 수 있다. 필터는 중괄호 '{}' 문법을 사용한다.

레이블 일치 연산자

  • = : 제공된 문자열과 정확히 동일한 레이블 선택
  • != : 제공된 문자열과 같지 않은 레이블 선택
  • =~ : 제공된 문자열과 정규식 일치하는 레이블 선택
  • !~ : 제공된 문자열과 정규식 일치하지 않는 레이블 선택

 

예시

  • uri=/log , method=GET 조건으로 필터 : http_server_requests_seconds_count{uri="/log", method="GET"}
  • /actuator/prometheus 는 제외한 조건으로 필터 : http_server_requests_seconds_count{uri!="/actuator/prometheus"}
  • method 가 GET , POST 인 경우를 포함해서 필터 : http_server_requests_seconds_count{method=~"GET|POST"}
  • /actuator 로 시작하는 uri 는 제외한 조건으로 필터 : http_server_requests_seconds_count{uri!~"/actuator.*"}

 

연산자 쿼리와 함수

다음과 같은 연산자를 지원한다.

  • +(덧셈)
  • -(빼기)
  • *(곱셈)
  • / (분할)
  • % (모듈로)
  • ^ (승수/지수)

 

sum

  • 값의 합계를 구한다.
  • 예) sum(http_server_requests_seconds_count)

 

sum by

  • SQL의 group by 기능과 유사하다.
  • 예) sum by(method, status)(http_server_requests_seconds_count)

 

count

  • 메트릭 자체의 수 카운트
  • 예) count(http_server_requests_seconds_count)

 

topk

  • 예) topk(3, http_server_requests_seconds_count) : 상위 3개 메트릭 조회

 

오프셋 수정자

  • http_server_requests_seconds_count offset 10m
  • offset 10m 과 같이 나타낸다. 현재를 기준으로 특정 과거 시점의 데이터를 반환한다.

 

범위 벡터 선택기

  • http_server_requests_seconds_count[1m]
  • 마지막에 [1m], [60s] 와 같이 표현한다. 지난 1분간의 모든 기록값을 선택한다.
  • 참고로 범위 벡터 선택기는 차트에 바로 표현할 수 없다. 데이터로는 확인할 수 있다. 범위 벡터 선택의 결과를 차트에 표현하기 위해서는 약간의 가공이 필요

 

게이지와 카운터

메트릭은 크게 보면 게이지와 카운터라는 2가지로 분류할 수 있다.

게이지(Gauge)

  • 임의로 오르내일 수 있는 값
  • 예) CPU 사용량, 메모리 사용량, 사용중인 커넥션

예를 들어서 대표적인 게이지인 CPU 사용량(system_cpu_usage)는 CPU 사용량의 현재 상태를 계속 측정하고 그 값을 그대로 그래프에 출력하면 과거부터 지금까지의 CPU 사용량을 확인할 수 있다.

게이지는 가장 단순하고 사용하기 쉬운 메트릭이다. 크게 고민하지 않고 있는 그대로를 사용하면 된다.

 

카운터(Counter)

  • 단순하게 증가하는 단일 누적 값
  • 예) HTTP 요청 수, 로그 발생 수

카운터는 계속 누적해서 증가하는 값이다. 따라서 계속 증가하는 그래프만 보게 될 것이다. 이렇게 증가만 하는 그래프에서는 특정 시간에 얼마나 고객의 요청이 들어왔는지 한눈에 확인하기 매우어렵다.

이런 문제를 해결하기 위해 increase() , rate() 같은 함수를 지원한다.

 

increase()
지정한 시간 단위별로 증가를 확인할 수 있다.
마지막에 [시간] 을 사용해서 범위 벡터를 선택해야 한다.
예) increase(http_server_requests_seconds_count{uri="/log"}[1m])
rate()
범위 백터에서 초당 평균 증가율을 계산한다.
increase() 가 숫자를 직접 카운트 한다면, rate() 는 여기에 초당 평균을 나누어서 계산한다.
rate(data[1m]) 에서 [1m] 이라고 하면 60초가 기준이 되므로 60을 나눈 수이다.
rate(data[2m]) 에서 [2m] 이라고 하면 120초가 기준이 되므로 120을 나눈 수이다.
너무 복잡하게 생각하기 보다는 초당 얼마나 증가하는지 나타내는 지표로 보면 된다.
irate()
rate 와 유사한데, 범위 벡터에서 초당 순간 증가율을 계산한다.
급격하게 증가한 내용을 확인하기 좋다.

 

 

그라파나

  • 프로메테우스의 단점은 한눈에 들어오는 대시보드를 만들어보기 어렵다는 점이다. 이 부분은 그라파나를 사용하면 된다.

 

설치

https://grafana.com/grafana/download

 

Download Grafana | Grafana Labs

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

grafana.com

 

운영체제에 맞게 설치를 진행한다.

 

압축을 푼 곳에서 bin 폴더로 이동해서 grafana-server를 실행시킨다.

 

실행시켰다면 http://localhost:3000 로 접속한다.

아이디와 비밀번호를 입력하라고 나오면 둘 다 admin으로 입력하면 된다.

 

 

프로메테우스와 연동

그라파나는 프로 메테우스를 통해서 데이터를 조회하고 보여주는 역할이다.

그렇기 때문에 그라파나와 연동이 필요하다.

 

 

대시보드 만들기

먼저 다음 3가지를 꼭 수행해두어야 한다.

  1. 애플리케이션 실행
  2. 프로메테우스 실행
  3. 그라파나 실행

 

CPU 메트릭 만들기

  • system_cpu_usage : 시스템의 CPU 사용량
  • process_cpu_usage : JVM 프로세스 CPU 사용량

이렇게 시스템 CPU 사용량을 확인할 수 있다.

 

JVM CPU 사용량을 확인하고 싶다면 아래와 같이하면 된다.

 

범례(legend)를 바꾸고 싶다면 아래와 같이 하면 된다.

 

패널 이름을 바꾸고 대시보드를 저장하려면 아래와 같이 하면 된다.

 

 

디스크 사용량 메트릭 만들기

 

디스크 사용량을 나타내는 단위가 byte이기 때문에 사람이 한눈에 직관적으로 보기 힘들다.

따라서 오른쪽에서 Standard options에 data / bytes(si)를 선택하면 GB 단위로 볼 수 있다.

 

아래와 같이 Min을 0으로 나타내면

 

이렇게 그래프를 나타낼 수 있다.