개발놀이터

Spring Actuator 본문

Spring/Spring

Spring Actuator

마늘냄새폴폴 2023. 7. 18. 21:20

이번 프로젝트에서 프로메테우스와 그라파나로 모니터링 환경을 구축했는데 어떤 포스팅에서 Spring Actuator를 사용해서 의미있는 모니터링을 하고싶다는 글을 봤습니다. 

 

엑추에이터..? 이게 뭐지? 궁금해서 공부해보고 포스팅하려고 합니다! 그리고 실제로 시각화 툴과 조합해서 이용해보도록 하겠습니다. 

 

Spring Actuator?

 

Spring Actuator는 우리의 애플리케이션을 모니터링하고, 메트릭스를 수집하고, 트래픽을 관찰하고, 우리의 데이터베이스의 상태를 모니터링할 수 있는 스프링의 프로젝트 중 하나입니다. 

 

이 라이브러리를 사용하면 실제로 아무것도 구현하지 않아도 프로덕션 레벨의 도구를 사용할 수 있다는 엄청난 장점이 있습니다. 

 

Actuator는 주로 구동중인 애플리케이션에 대한 설정 정보들을 노출하는데 사용됩니다. 헬스체크, 메트릭스, 정보, 덤프, 환경 기타 등등 다양한 것들을 노출하죠. 

 

Actuator는 HTTP 엔드포인트나 JMX 빈으로 애플리케이션과 상호작용할 수 있습니다. 

 

cf) node-exporter와 차이점

아마 프로메테우스와 그라파나를 사용하신 분들이라면 익숙하실 node-exporter와 비슷한 부분이 있어보입니다. 

 

하지만 이 둘은 엄연히 다릅니다. node-exporter는 프로메테우스를 위한 머신 메트릭스의 exporter입니다. 프로메테우스의 exporter인 node-exporter는 하드웨어 레벨이나 OS레벨의 모니터링을 도와줍니다. 예를 들어 CPU 사용량이나 메모리 사용량, 디스크 I/O, 네트워크 등등 다양한 하드웨어적 정보를 보여주죠. 

 

프로메테우스와 그라파나, node-exporter를 이용한 모니터링 환경 구축은 아래의 링크를 참고해주세요!

 

https://coding-review.tistory.com/436

 

Spring Actuator 시작하기

Spring Actuator는 정말 간단합니다. 우리가 추가적으로 코드를 작성할 필요가 없다고 앞에서 말씀드렸죠? 그냥 설정만 해주시면 자연스럽게 사용할 수 있습니다. 

 

한번 시작해보죠!

 

1. 의존성 추가

	implementation 'org.springframework.boot:spring-boot-starter-actuator'
	runtimeOnly 'io.micrometer:micrometer-registry-prometheus'

저는 gradle을 사용했습니다. 위와같이 적으시면 1단계는 끝입니다. 

 

2. application.yml 설정 추가

management:
  endpoints:
    web:
      exposure:
        include: beans

자 이제 끝입니다! 

 

이제 서버를 띄우고 /actuator/beans 를 입력해보면?

 

이게 뭔...

네 json으로 제공되는 정보들은 눈으로 읽을 수가 없습니다. 처음 보면 이딴게... 모니터링..? 이라는 말이 절로 나옵니다. 

 

네! 그래서 시각화 툴과 같이 사용해야합니다. 

 

Spring Actuator 시각화

우리는 프로메테우스와 그라파나를 이용할겁니다. 

 

먼저 application.yml에 추가해줄 것이 있습니다. 

 

management:
  endpoints:
    web:
      exposure:
        include: prometheus

include 부분에 prometheus를 입력해줍니다. 

 

그리고 prometheus.yml에서 우리 프로젝트를 job_name으로 추가해줘야합니다. 

global:
  scrape_interval: 15s
  scrape_timeout: 15s
  evaluation_interval: 2m
  external_labels:
    monitor: 'codelab-monitor'
  query_log_file: query_log_file.log
rule_files:
  - "rule.yml"
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 10s
    scrape_timeout: 10s
    metrics_path: '/metrics'
    honor_labels: false
    honor_timestamps: false
    scheme: 'http'
    params:
      user-id: ['kyoungsuk3254@naver.com']
    static_configs:
      - targets: ['{IP 입력}:9090']
        labels:
          service: 'monitor-1'
  - job_name: 'node'
    static_configs:
      - targets: ['{IP 입력}:9100']
  - job_name: 'spring-actuator'
    static_configs:
      - targets: ['{IP 입력}:8080']
    metrics_path: '/actuator/prometheus'

만약 localhost 라면 IP부분에 localhost를 적어주면 됩니다. 실제로 배포된 서버라면 퍼블릭 IP를 적어주면 됩니다. 

 

자 이제 프로메테우스를 시작해봅시다. 

 

자 이렇게 띄웠으면 그라파나로 넘어갑니다. 

 

Data sources를 선택하는 부분은 넘어가도록 하겠습니다. 아래의 링크를 확인해주세요!

 

https://coding-review.tistory.com/436

 

바로 대쉬보드로 넘어가죠. 

 

import 주소에 위와같이 입력해주고 Load를 클릭합니다. 

 

그리고 우리가 설정한 Data sources를 프로메테우스로 설정해준다음 import를 누르면!

 

이렇게 이쁜 대쉬보드가 생깁니다. 

 

Spring Actuator에서 제공하는 지표

끝내기 전에 Actuator에서 제공하는 지표에 대해서 간단하게 정리하고 마무리짓도록 하겠습니다. 

 

  1. I/O
    1. HTTP 요청
    2. HTTP 에러 (4xx, 5xx)
    3. 지연시간
  2. JVM 메모리
    1. JVM heap 영역
    2. JVM non-heap 영역
  3. JVM Misc (여기서 Misc는 그냥 잡동사니 정도로 해석하시면 되고 JVM에 관련한 잡동사니를 넣었다고 보시면 됩니다. )
    1. CPU 사용률
    2. JVM 부하
    3. 스레드 (실제 운영되는 스레드, 데몬 스레드)
    4. 스레드 상태 (블로킹, 생성, 실행중)
    5. GC 부하
    6. 로그 트레이스
  4. JVM 메모리 풀 (heap 영역입니다. 저는 Java 11이라 G1 GC로 인식하는 듯 합니다. 아마 Java 17이라면 Z GC일지는 모르겠습니다.)
    1. GC 에덴 영역
    2. GC 올드 영역
    3. GC 서바이버 영역
  5. JVM 메모리 풀 (non-heap 영역입니다.)
    1. Metaspace
  6. GC
  7. 클래스 로더

 

정말 다양한 것들을 알려줍니다. 

 

 

마치며

이번엔 스프링에서 제공하는 Actuator에 대해서 알아봤습니다. 정말 다양한 지표들을 제공해준다는 것에 깜짝 놀랐습니다. 아마 하드웨어를 체크하는 node-exporter와 함께 요긴하게 사용할 듯 합니다. 

 

여러분도 Spring Actuator를 모니터링 도구로 사용해보시는건 어떨까요? 

 

긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 되세요~

 

 

출처

https://hudi.blog/spring-boot-actuator-prometheus-grafana-set-up/

 

Spring Boot Actuator, Prometheus, Grafana를 사용한 스프링부트 모니터링 환경 구축

이 포스팅에서는 Spring Actuator, Prometheus, Grafana를 사용하여 스프링부트 애플리케이션과 관련된 여러 메트릭을 수집하고, 시각화하여 모니터링할 수 있는 환경을 구축한다. 이 글에서는 각각의 컨

hudi.blog