본문 바로가기
스프링부트/액추에이터

2. 스프링 부트 액추에이터(마이크로미터, 프로메테우스 연동)

by amobu0 2024. 6. 2.

이전 글을 바로 이어서 들어가기 전에 실전 스프링 부트(책) 및 김영한 님의 강의에서는 마이크로미터, 그라파나, 프로메테우스에 대한 상세 내용을 다루는 것은 책, 강의 범위를 벗어나기 때문에 기초 내용과 올바른 방향을 설명하는데 초점을 맞추고 더 자세한 내용이 필요한 경우 별도의 학습이 필요하고 공식 문서를 참고하라고 나와있다.

 

마이크로미터

서비스를 운영할 때는 애플리케이션의 CPU, 메모리, 커넥션 사용, 고객 요청수 같은 많은 지표들을 확인하는 것이 필요하다. 그렇게 해야 어디에 어떤 문제가 발생했는지 사전에 대응도 할 수 있고, 실제 문제가 발생해도 원인을 빠르게 파악해서 대처할 수 있다. 모니터링 툴은 다양하게 많다 하지만 툴마다 전달하는 방법이 다 다르기 때문에 micometer가 표준 측정 방식을 제공한다. 개발자는 micrometer 인터페이스에 맞춰서 표준 측정방식에 맞춰 전달하고 구현체만 선택하면 된다.

 

마이크로미터는 다양한 유형의 측정지표를 벤터 중립적인 방법으로 수집할 수 있는 파사드 facade다 (파사드 - 대충 중간에서 뭔가 해결한다는 의미...)

그래서 원하는 구현체를 선택해 플로그인 방식으로 사용할 수 있다. 쉽게 이야기해서 마이크로미터가 추상화를 통해서 구현체를 쉽게 갈아 끼울 수 있도록 하였다. 보통 스프링이 이런 추상화를 직접 만들어서 제공하지만, 마이크로미터라는 잘 만들어진 추상화가 있기 때문에 스프링은 이것을 활용한다. 스프링 부트 액추에이터는 마이크로미터를 기본으로 내장해서 사용한다.

 

 

메트릭(지표)

애플리케이션을 실행하고 http://localhost:8080/actuator/metrics에 접속하면 수많은 메트릭 정보를 확인할 수 있다.

http://localhost:8080/actuator/metrics 정보 출력

 

 

다양한 메트릭

  • JVM 메트릭 - JVM 관련 메트릭을 제공한다. jvm.으로 시작한다.
    1. 메모리 및 버퍼 풀 세부 정보
    2. 가비지 수집 관련 통계
    3. 스레드 활용
    4. 로드 및 언로드 된 클래스 수
    5. JVM 버전 정보
    6. JIT 컴파일 시간
  • 시스템 메트릭 - 시스템 메트릭을 제공한다. system. process. disk. 으로 시작한다.
    1. CPU 지표
    2. 파일 스크립터 메트릭
    3. 가동 시간 메트릭
    4. 사용 가능한 디스크 공간
  • 스프링 MVC 메트릭(유용함) - 스프링 MVC 컨트롤러가 처리하는 모든 요청을 다룬다.  메트릭 이름: http.server.requests
    TAG를 사용해서 다음 정보를 분류해서 확인할 수 있다.
    1. uri: 요청 URI
    2. method: GET, POST 같은 HTTP메서드
    3. status: 200, 400, 500 같은 HTTP Status코드
    4. exception: 예외
    5. outcome: 상태코드를 그룹으로 모아서 확인
  • 데이터소스 메트릭 - 커넥션 풀에 관한 메트릭을 제공한다. jdbc.connections. 으로 시작한다. 히카리 커넥션 풀을 사용하면 hikaricp. 를 통해 히카리 커넥션 풀의 자세한 케트릭을 확인할 수 있다.
    1. 최대 커넥션
    2. 최소 커넥션
    3. 활성 커넥션
    4. 대기 커넥션 수
  • 톰캣 메트릭(유용함) - 톰캣 메트릭은 tomcat. 으로 시작한다. 톰캣 메트릭을 모두 사용하려면 아래의 코드를 추가해야 한다.
    (옵션 설정을 하지 않으면 tomcat.session. 관련 정보만 노출된다.) 이렇게 설정하면 다양한 톰캣 관련 메트릭을 확인할 수 있다.
//application.porperties
server.tomcat.mbeanregistry.enabled=true

 

 

http://localhost:8080/actuator/metrics에 톰캣 관련 메트릭 추가

 

 

  • 사용자 정의 메트릭 - 사용자가 직접 메트릭을 정의할 수 있다. 예를 들어 주문수, 취소수를 메트릭으로 만들 수 있다.

 

 

이러한 메트릭을 어디에서 지속적으로 보관하고 과거의 데이터도 확인해야 한다. 따라서 보관할 데이터베이스(프로메테우스)와 메트릭을 그래프를 통해서 한눈에 쉽게 확인할 수 있는 대시보드(그라파나)도 필요하다.

 

프로메테우스

프로메테우스는 메트릭을 수집하고 보관하는 DB이며 스프링 부트는 클래스패스에 프로메테우스 라이브러리가 있으면 스프링 부트에 내장된 측정지표 및 커스컴 측정지표를 전부 프로메테우스에게 전송한다.

 

프로메테우스 설치 (24년 6월 1일 기준   &&  설치 환경: macOS /  Apple M2)

드디어 프로메테우스를 설치해보자.

 

프로메테우스 공식홈페이지 다운로드 - https://prometheus.io/download/

https://prometheus.io/download/

 

 

 

OS - darwin -> prometheus-2.52.0.darwin-amd64.tar.gz 을 다운로드 한다. 다운로드된 압축을 원하는 곳에 풀고 프로메테우스 폴더에서 터미널을 열어서./prometheus를 실행하면 사진처럼 에러 메시지가 나온다. 그럼 취소를 누른다.

 

프로메테우스 폴더에서 터미널을 열고 ./prometheus 실행
프로메테우스를 실행할수 없다는 메시지

 

 

 

 

mac에서는 App Store 및 확인된 개발자가 등록한 응용 프로그램이 아니면 사용을 차단하기 때문에 프로메테우스를 허용하는 절차가 필요하다. 시스템 설정 -> 개인정보 보호 및 보안에 mac이 프로메테우스를 차단했다는 내용이 나온다. 그래도 허용을 선택해서 차단을 해제하고 다시./prometheus를 실행하고 열기를 선택해서 프로메테우스를 실행한다.

 

시스템 설정 -> 개인정보 보호 및 보안에서 프로메테우스가 차단된 상태

 

차단해제 후 다시 ./prometheus를 실행 -> 열기

 

터미널에서 ./prometheus 실행 결과

 

 

 

이제 웹 브라우저에서 http://localhost:9090에 접속하면 프로메테우스 실행 화면이 열리는 것을 확인할 수 있다.

웹 브라우저에서 http://localhost:9090 접속 화면

 

프로메테우스 설정 - 연동

이제 프로메테우스와 애플리케이션을 연동해야 한다. 연동하기 위해서는 2가지 작업이 필요하다.

  1. 애플리케이션 설정 - 프로메테우스가 메트릭을 가져갈 수 있도록 애플리케이션을 프로메테우스 포맷에 맞추어 메트릭 설정
    • 참고로 http://localhost:8080/actuator/metrics에서 보았던 포맷(JSON)은 이해하지 못한다. 마이크로미터가 이런 부분을 모두 해결해 준다. 각각의 메트릭들은 내부에서 마이크로미터 표준 방식으로 측정되며 따라서 어떤 구현체를 사용할지 지정만 해주면 된다.
  2. 프로메테우스 설정 - 프로메테우스가 애플리케이션의 메트릭을 주기적으로 수집하도록 설정

 

우선 마이크로미터 프로메테우스 구현 라이브러리를 build.gradle에 추가한다.

 

build.gradle에 프로메테우스 구현 라이브러리 추가

runtimeOnly 'io.micrometer:micrometer-registry-prometheus'

 

 

이렇게 추가하면 자동으로 마이크로미터 프로메테우스 구현체를 등록해서 동작하도록 한다. 액추에이터 프로테메우스 메트릭 수집 엔드포인트가 추가되고 애플리케이션을 실행하고 http://localhost:8080/actuator/prometheus로 접속하면 웹 브라우저에 결과가 출력된다.

http://localhost:8080/actuator/prometheus 화면

 

프로메테우스 연동 - 수집 설정

프로메테우스가 애플리케이션의 /actuator/prometheus를 호출해서 메트릭을 주기적으로 수집하도록 설정하려면 먼저 프로메테우스 폴더에 있는 prometheus.yml 파일에 설정코드를 추가해야 한다.

 

(참고 - job_name은 아무거나 적어도 상관없다. / scrape_interval의 기본값은 1분이다. 빠른 결과 확인을 위해 1초로 설정한다. / 띄어쓰기 2칸 유의!!!)

prometheus.yml 파일에 설정 추가

 

  # 추가 
  - job_name: "아무거나 적어도 됨"
    metrics_path: '/actuator/prometheus'
    scrape_interval: 1s 
    static_configs:
      - targets: ["localhost:8080"]

 

 

프로메테우스가 실행 중인 터미널을 종료하고 다시./prometheus를 재실행한다. 그리고 프로메테우스 실행 웹 브라우저에서
Status -> Configuration에 들어가서 prometheus.yml에 추가한 설정코드가 출력되는 결과와 Status -> Targets에서 프로메테우스가 자기 자신의 메트릭을 수집하는 상태와 설정을 통해 연동한 애플리케이션의 메트릭을 수집하는 상태가 나타나는 결과를 확인한다. State에 UP이라고 뜨면 정상적으로 연동되고 있음을 표시, DOWN이면 정상적으로 연동되지 않음을 표시한다.

Configuration에서 prometheus.yml에 추가한 정보 출력 화면

 

 

Targets에서 연동된 애플리케이션의 상태를 보여주는 화면

 

 

이제 http://localhost:9090에서 원하는 메트릭을 검색하면 출력결과를 확인할 수 있다.

http://localhost:9090에서 특정 메트릭을 검색한 결과 화면

 

 

프로메테우스 - 게이지와 카운터

 

  • 게이지(Gauge) - 임의로 오르내릴 수 있는 값 ex) CPU사용량, 메모리 사용량 등
  • 카운터(Counter) - 단순하게 증가하는 단일 누적 값 ex) HTTP 요청 수, 사용자가 정의한 상품주문 수 등

게이지(Guage)의 예시로 요청한 그래프 화면

 


카운터(Counter)의 예시로 요청한 그래프 화면

 

 

프로메테우스도 이렇게 모니터링 대시보드를 보여주지만 카운터의 경우처럼 계속해서 증가하는 값을 저장하는 경우 메트릭 결과를 출력하기 위해서는 특정한 함수나 SQL처럼 RromQL을 작성해야 하는 단점이 있다. 이러한 부분은 그라파나를 사용한다.

그라파나의 경우 다음 글에서 정리하고자 한다.

 


 

현재 액추에이터에 대해 공부하면서 느낀 건 JPA, 시큐리티, 액추에이터 등 제대로 하나를 깊이 있게 배우기 위해서는 JPA면 JPA, 시큐리티면 시큐리티 하나의 주제로만 된 책이나 강의로 공부해야겠다. 액추에이터 시리즈 글이 마무리되면 그다음으로는 어떤 걸 공부해야 할지 고민 중이다.

 

 글에 관해서 틀린 부분이나 문제는 댓글로 알려주시면 감사하겠습니다.

 


출처: 책 -  https://jpub.tistory.com/1458

 

실전 스프링 부트

인류에겐 이런 스프링 부트 가이드북이 필요했다 방대한 스프링 부트 공식 문서 중 실무에서 잘 쓰이는 팁을 찾기란 어렵다. 이 책은 초급에서 중급 수준의 독자를 대상으로 스프링 부트의 기본

jpub.tistory.com

출처: 인강 - https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC-%ED%99%9C%EC%9A%A9?#curriculum

 

스프링 부트 - 핵심 원리와 활용 | 김영한 - 인프런

김영한 | 실무에 필요한 스프링 부트는 이 강의 하나로 모두 정리해드립니다., 백엔드 개발자를 위한 스프링 부트 끝판왕! 실무에 필요한 내용을 모두 담았습니다.  [임베딩 영상] 김영한의 스

www.inflearn.com