[Spring] 마이크로미터(Micrometer)와 메트릭(Matric) 확인

마이크로미터란?

서비스를 운영할 때는 애플리케이션의 CPU, 메모리, 커넥션 사용, 고객 요청수 같은 수 많은 지표들을 확인하는 것이 필요하다.

그래야 어디에 어떤 문제가 발생했는지 사전에 대응도 할 수 있고, 실제 문제가 발생해도 원인을 빠르게 파악해서 대처할 수 있다.

모니터링 툴시스템의 다양한 정보를 받아 우리가 모니터링할 수 있도록 도와준다.

 

모니터링 툴이 작동하려면 시스템의 다양한 지표들을 각각의 모니터링 툴에 맞도록 만들어서 보내주어야 하는데, 모니터링 툴마다 정해진 포멧방식이 다 다르다.

만약 기존에 사용하던 모니터링 툴에서 모니터링 툴을 변경하면 기존에 측정했던 코드를 모두 변경한 툴에 맞도록 다시 변경해야 하는 번거로움이 발생한다.

이런 문제를 해결하는 것이 바로 마이크로미터라(Micrometer)는 라이브러리이다.

 

마이크로미터는 애플리케이션의 메트릭(지표)마이크로미터가 정한 표준 방법으로 모아서 제공(추상화)해준다.

스프링 부트 액츄에이터는 마이크로미터를 기본으로 내장해서 사용한다.

implementation 'org.springframework.boot:spring-boot-starter-actuator'

그렇기 때문에 우리는 마이크로미터가 정한 표준 방법으로 메트릭(측정 지표)를 전달하고 사용하는 모니터링 툴에 맞는 구현체를 선택하면 된다.

만약, 모니터링 툴이 변경되어도 해당 구현체만 변경하면 된다.


메트릭 확인하기

액츄에이터는 마이크로미터가 제공하는 지표 수집@AutoConfiguration 을 통해 자동으로 등록해준다

http://localhost:8080/actuator/metrics 엔드포인트에 접근 하면 기본으로 제공되는 메트릭들을 확인할 수 있다.

마이크로미터가 제공하는 일부 matric

 

스프링 부트 액츄에이터를 사용하면 수 많은 메트릭(지표)를 편리하게 사용할 수 있다.

 

metrics 엔드포인트 접근방법
  • http://localhost:8080/actuator/metrics : 액추에이터가 마이크로미터를 통해서 등록한 기본 메트릭들을 확인할 수 있다
  • http://localhost:8080/actuator/metrics/{name} : metrics 엔드포인트는 다음과 같은 패턴을 사용해서 더 자세히 확인할 수 있다.

만약 JVM 메모리 사용량을 확인한다면 http://localhost:8080/actuator/metrics/jvm.memory.used 로 확인할 수 있다.

 

Tag 필터

해당 Tag를 기반으로 정보를 필터링해서 확인할 수 있다.

?tag=key:value과 같은 형식을 사용해야 한다.

 

위 JVM 메모리 사용량 결과에서 tag가 area인 부분을 heap과 nonheap으로 분류해 데이터를 확인하면 다음과 같이할 수 있다.

http://localhost:8080/actuator/metrics/jvm.memory.used?tag=area:heap http://localhost:8080/actuator/metrics/jvm.memory.used?tag=area:nonheap

 

HTTP 요청수 확인하기

아래의 매트릭 엔드포인트로 접근하면 HTTP 요청수를 확인할 수 있다.

http://localhost:8080/actuator/metrics/http.server.requests

만약 여기서 /actuator/health 요청만 필터링 하고싶다면 다음과 같이 할 수 있다.

http://localhost:8080/actuator/metrics/http.server.requests?tag=uri:/actuator/health

메트릭 종류

마이크로미터와 액츄에이터는 기본으로 다양한 메트릭을 제공한다.

 

JVM 메트릭  ( jvm. 으로 시작)

JVM 관련 메트릭을 제공.

  • 메모리 및 버퍼 풀 세부 정보
  • 가비지 수집 관련 통계
  • 스레드 활용
  • 로드 및 언로드된 클래스 수
  • JVM 버전 정보
  • JIT 컴파일 시간

 

시스템 메트릭 ( system. , process. , disk. 으로 시작 )

시스템 메트릭을 제공. 

  • CPU 지표
  • 파일 디스크립터 메트릭
  • 가동 시간 메트릭
  • 사용 가능한 디스크 공간

 

애플리케이션 시작 메트릭

애플리케이션 시작 시간 메트릭을 제공.

  • application.started.time : 애플리케이션을 시작하는데 걸리는 시간 ( ApplicationStartedEvent 로 측정)
  • application.ready.time : 애플리케이션이 요청을 처리할 준비가 되는데 걸리는 시간 (ApplicationReadyEvent 로 측정)

 

스프링 MVC 메트릭  ( http.server.requests )

스프링 MVC 컨트롤러가 처리하는 모든 요청을 다룬다.

tag 를 사용해서 다음 정보를 분류해서 확인할 수 있다.

  • uri : 요청 URI
  • method : GET , POST 같은 HTTP 메서드
  • status : 200 , 400 , 500 같은 HTTP Status 코드
  • exception : 예외
  • outcome : 상태코드를 그룹으로 모아서 확인 1xx:INFORMATIONAL , 2xx:SUCCESS ,3xx:REDIRECTION , 4xx:CLIENT_ERROR , 5xx:SERVER_ERROR

 

데이터소스 메트릭 ( jdbc.connections. 으로 시작 )

DataSource , 커넥션 풀에 관한 메트릭을 확인. 

최대 커넥션, 최소 커넥션, 활성 커넥션, 대기 커넥션 수 등을 확인할 수 있다.

히카리 커넥션 풀을 사용하면 hikaricp. 를 통해 히카리 커넥션 풀의 자세한 메트릭을 확인할 수 있다.

 

로그 메트릭 ( logback.events?tag=level:로그레벨 )

로그에 대한 메트릭을 확인할 수 있다. 

trace , debug , info , warn , error 각각의 로그 레벨에 따른 로그 수를 확인할 수 있다.

(error 로그 수가 급격히 높아진다면 위험한 신호라고 인지 할 수 있다.)

 

톰캣 메트릭 ( tomcat. 으로 시작)

기본적으로 session과 관련된 정보만 노출되고 톰캣 메트릭을 모두 사용하려면 다음 옵션을 켜야한다.

server:
  tomcat:
    mbeanregistry:
      enabled: true

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

(사용 쓰레드가 최대 쓰레드 수에 가깝거나 넘어가려한다면 위험한 신호라고 인지 할 수 있다.)

 

기타

이 외에도 다양한 메트릭이 있다.

더 많은 메트릭을 알고 싶으면 아래의 공식 메뉴얼을 확인하자.

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


더 알아보기

[Spring] 스프링부트 엑츄에이터(Actuator)란?

[Prometheus] 프로메테우스란? 사용방법

[Prometheus/Spring] 프로메테우스와 스프링 연결

 

참고자료 : 스프링 부트 - 핵심 원리와 활용