brunch

You can make anything
by writing

C.S.Lewis

by 에디의 기술블로그 Jun 19. 2022

스프링부트 프로메테우스 모니터링

이 글은, 스프링부트에서 프로메테우스를 연동하는 글이다. 프로테우스에 대한 상세한 내용은 생략하며, 프로메테우스를 사용해본 경력자는 굳이 안 읽어도 된다. 주니어 개발자는 가벼운 마음으로 읽어보길 바란다. 


1. 프로메테우스 모니터링 개요


프로메테우스에 대한 기본적인 소개를 한다. 


프로메테우스란?

프로메테우스 란 무엇인가?

프로메테우스는 메트릭 기반의 오픈소스 모니터링 시스템인데, 풀 기반의 데이터 수집 방법을 제공한다. 이 글에서 프로메테우스에 대한 자세한 내용은 생략한다. 


모니터링 네가지

- 프로파일링

- 트레이싱

- 로깅

- 메트릭

자세한 내용은 생략한다.


메트릭이란?


"프로메테우스 오픈소스 모니터링 시스템" 이라는 책을 참고하였습니다.


메트릭은, 컨텍스트를 대부분 무시하고 다양한 유형의 이벤트에 대해 시간에 따른 집계를 추적한다.[1] 

- 수신된 HTTP 요청 횟수

- 요청을 처리하는 데 걸린 시간

- 현재 진행 중인 요청 수


메트릭 유형은 아래와 같다. 

- 카운터(Counter) : 이벤트 개수나 크기를 추적

- 게이지(Gauge) : 현재 상태에 대한 스냅샷 

- 서머리 : 평균 대기시간(?)

- 히스토그램 : ?


카운터 : 얼마나 빨리 증가하는가 에 관심을 둔다.

게이지 : 실제값에 관심을 둔다. 값은 증가할 수도 있고, 감소할 수도 있다. 


자세한 내용은 책을 구매해서 읽어보길 바란다. 번역이 좋지 않아서 가독성이 좋진 않다.

http://www.yes24.com/Product/Goods/80452497


프로메테우스 아키텍처

프로메테우스는 풀(pull) 방식의 모니터링이 가능하다. 즉, 스프링부트 API 에서 모니터링 데이터를 제공하고, 프로메테우스는 HTTP 통신으로 데이터를 수집할 수 있다. 


시간 관계상 

자세한 내용은 생략한다!!!!! ㅠㅠ


2. 프로메테우스 설치


이 글에서는 로컬 개발환경인 Mac 에서의 설치에 대해서만 간단히 설명한다. 리눅스에서 설치에 대해서는 생략한다.

프로메테우스 설치

자세한 내용은 생략한다. 

자세한 내용은 생략한다. 

자세한 내용은 생략한다. 

아직 수집하는 데이터가 없다. 


그라파나 설치

자세한 내용은 생략한다. 

자세한 내용은 생략한다. 



프로메테우스, 그라파나 데이터소스 연동하기

자세한 내용은 생략한다. 

자세한 내용은 생략한다. 

자세한 내용은 생략한다. 

자세한 내용은 생략한다. 


3. 스프링부트 프로메테우스 연동하기


스프링부트 Actuator

자세한 내용은 생략한다. 


스프링부트 기본 설정

그레이들 설정에서 아래와 같이 의존성을 추가해준다.

application.yml 파일에도 아래와 같이 작성한다. 

위와 같이 설정하면, 프로메테우스에서 수집 가능한 데이터를 HTTP 엔드포인트를 호출할 수 있다. 

이때 특이한 점은 데이터 포맷이다. # HELP # TYPE 등의 문자를 사용한다. 이건 프로메테우스에서 데이터를 수집하기 위한 스펙이기 때문에 반드시 지켜야 하는 규칙이다. 


메트릭 데이터 수집

프로메테우스에서 스프링부트 모니터링 데이터를 수집하기 위해서는 컨피그 설정을 해줘야 한다. 맥북 로컬 개발환경에서는 /usr/local/etc/prometheus.yml 파일을 수정하면 된다. 

targets 에는 애플리케이션 의 호스트:포트 를 정의해야 한다. metrics_path 에는 /actustor/prometheus 를 정의해야 한다. 설정이 끝난 후 프로메테우스를 재시작한다. 사실 프로메테우스에서 재시작 없이 컨피그를 리로드 하는 명령어가 있기는 하다. 기억이 안 난다. 암튼, 새로운 모니터링 타겟을 지정하였다면, 아래와 같이 프로메테우스 대시보드에서 확인할 수 있다. 

만약 잘못된 컨피그 정보를 넣었거나 메트릭 정보를 수집할 수 없다면 어떻게 될까? State 의 상태가 UP 이 아닌 DOWN 로 빨간색으로 표시될 것이다. 아래와 같다. 

암튼, STATE 의 상태가 UP 이라면, 프로메테우스에서 스프링부트 애플리케이션의 매트릭스 정보를 수집하기 시작하였다. 프로메테우스에서 수집되는 데이터를 확인해보자. jvm_memory_used_bytes 데이터를 확인해보자. 아래와 같다. 

자.. 스프링부트 와 프로메테우스 연동은 잘 되었다. 이제 시각화를 위해서 그라파나를 연동해보자. 


시각화, 그라파나에서 확인

그라파나에 대해서는 상세하게 설명하지 않겠다. 아래와 같이 패널을 추가한 후 Metrics browser 에 jvm_memory_used_bytes 를 선택하면 차트를 그려준다.  

자... 지금까지는 스프링부트 에서 기본으로 제공해주는 메트릭 정보를 수집하였다. 혹시, 애플리케이션의 비즈니스 로직에 따른 커스텀한 데이터를 수집하고 싶다면 어떻게 할까? 



4. 커스텀 데이터 수집하기


스프링부트 프로메테우스를 연동했을 때 기본으로 제공해주는 데이터 외에, 개발자가 필요에 의해서 커스텀하게 데이터를 작성할 수 있다. 두 가지 방법이 있다. 


- 엔드포인트 직접 정의해서 사용하기

- 라이브러리 사용하기


엔드포인트 직접 정의해서 사용하기

약간 무식한 방법이다. 

위에서 설명했듯이 actuator/prometheus 를 호출하면 프로메테우스에서 수집 가능하도록 데이터를 제공해준다. 이때 특이한 문자열 스펙이 정의가 되어있다. 

같은 문자열 방식으로 데이터를 제공해주면 되지 않을까? 새로운 컨트롤러를 하나 만들어보자. 

이때 반드시 produces="text/plain "로 설정해야 한다! 필자는 모니터링 메트릭 이름을 test 라고 정의하였다. 엔드포인트 호출하면 아래와 같이 응답한다. 

자.. 하지만 아직 프로메테우스에서 해당 데이터를 수집하지 않는다. 위에서 설명한 내용은 스프링부트 Actuator 를 제공하는 8082 포트의 actuator/prometheus 를 수집했었다. 커스텀하게 작성하는 엔드포인트는 8081 포트에 v1/custom/prometheus 엔드포인트로 수집해야 한다.


새로 작성한 컨트롤러를, 프로메테우스에서 수집하기 위해서 컨피그 설정을 변경 후 리로드한다. 


정상적으로 수집하고 있는지 프로메테우스 화면에서 확인하도록 하자. 

프로메테우스에서 수집되는 데이터를 확인해보자. 필자가 정의한 메트릭 이름은 test 이었다. test 로 검색하면 된다. 

아래와 같이 정상적으로 프로메테우스에서 데이터를 수집하는 것을 확인할 수 있다. 


이제 마지막으로 그라파나 대시보드에 패널을 추가해보자. 



비즈니스 로직에 의한 데이터를 수집할 수 있다. 예를 들어서, API 서버에 현재 접속해서 특정 기능을 사용 중인 사용자의 수, 비즈니스 로직에서 중요 메서드 호출 시 소요되는 시간 등등


하지만, 위와 같은 방식은, 별도의 엔드포인트를 정의해야 하기 때문에 약간 번거롭다.


- 관리 포인트가 늘어난다.

- 프로메테우스에서 수집하기 위한, 데이터 문자열을 직접 정의해야 한다. 


이런 단점이 싫다면 라이브러리를 활용하는 방법이 있다. 


라이브러리 사용하기

라이브러리를 사용하는 방법은 Actuator 포트인 8082 프트에서 제공하는데, actuator/prometheus 엔드포인트에서 커스텀하게 정의한 데이터가 새로 추가되는 방식이다. 해당 방법을 사용한다면 위에서 프로메테우스 컨피그에서 등록한 spring-custom(8081) 로 수집하는 타겟은 사용하지 않게 되며, 8082/actoatur/prometheus 를 그대로 사용하기 때문에 별도의 추가적인 컨피그 설정은 필요하지 않다. 


Gauge

코드에 대한 자세한 내용은 생략한다. coffee.ordersInQueue 라는 이름의 메트릭 정보를 추가하였다. 참고로 이름은 쩜(.) 이 언더바(_) 로 변경된다. 즉, coffee_ordersInQueue 로 변경된다. 

별도의 추가적인 엔드포인트를 작성하지 않아도 되며, 아래와 같이 actuator/prometheus 엔드포인트에서 추가된 것을 확인할 수 있다. 


Counter

시간 관계상 자세한 내용은 생략한다. 

시간 관계상 자세한 내용은 생략한다. 

시간 관계상 자세한 내용은 생략한다. 



어노테이션 사용해보기

@Times 어노테이션

@Counted 어노테이션



부록. Actuator Matrix 데이터 상세


시간 관계상 생략한다. 


부록. 알림 메시지


시간 관계상 생략한다. 


참고자료

https://autsoft.net/defining-custom-metrics-in-a-spring-boot-application-using-micrometer/


마무리


오랜만에 작성하는 블로그 포스팅이다. 글 쓰는 게 귀찮아서 간략하게만 작성하였는데, 어렵지 않은 내용이라서 주니어 개발자도 쉽게 이해가 되었을 것이다.


사실, 프로메테우스 연동 자체가 중요하지는 않다. 어떤 데이터를 관심 있게 봐야 하는지, 어떤 데이터가 임계치를 넘었을 때 위험상황인지 파악하는 것이 더 중요하다. 이 글에서 전부 다루기 어려워서, 나중에 시간이 한참 지난 후 기회가 되면 작성해보도록 하겠다. 


그럼 이만..

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari