Programming/Monitoring

Spring Boot Actuator(+ Micrometor) 모니터링 시스템 구축 1편

Jan92 2023. 9. 9. 18:28

스프링 부트 모니터링 시스템 구축 - Spring Boot Actuator, Micrometor

 

actuator, prometheus, grafana

해당 포스팅에서는 스프링 부트 프로젝트를 기반으로 하여 'spring-boot-actuator', 'Prometheus', 'Grafana'를 연동한 모니터링 시스템 구축에 대한 전체적인 흐름과 각각의 기능 그리고 실제 연동 방법에 대해서 살펴볼 예정입니다.

 

하나의 포스팅에서 다루기는 많은 내용이기 때문에 시리즈로 이어지며, 해당 포스팅에서는 Actuator에 대한 자세한 내용과 Micrometor의 역할에 대해 간단하게 다루고, 이어지는 포스팅에서 Prometheus와 Grafana에 대해 다뤄 볼 예정입니다.

 

 


모니터링(Monitoring) 시스템

'모니터링'이란 시스템 상의 상태 변화를 지속적으로 감시하는 것을 뜻하는데요. '모니터링의 목적'은 감시하는 시스템의 상태, 가용성 또는 변화를 확인하고 대비하는 것을 말합니다.

 

모니터링하는 데이터에 대한 구체적인 예시로는 cpu에 대한 정보나 jvm memory, database connections, disk 용량과 같은 자원적인 부분과 loggings, api 요청 정보 등이 있으며, 그 외에도 필요에 따라 다양한 데이터에 대한 모니터링을 할 수 있습니다.

그리고 이러한 데이터의 변화를 확인함으로써 '빠른 장애 탐지', '다운타임의 최소화', '애플리케이션 개선' 등의 이점을 가질 수 있습니다.

 

 

대부분의 모니터링 시스템은 기본적으로 '데이터 수집', '통합', '시각화'의 단계로 되어 있는데요.

여기서 구현할 예시에서는 actuator를 통해 실행 중인 애플리케이션에 대한 운영 정보를 노출하며, prometheus에서는 actuator로부터 애플리케이션의 메트릭을 수집 및 통합하는 작업을 수행합니다.

(actuator와 prometheus 사이에 micrometor 라이브러리를 통해 prometheus에 맞는 메트릭이 전달됩니다.)

 

그리고 grafana에서는 prometheus에서 수집 및 통합한 메트릭을 최종적으로 시각화하는 작업이 수행됩니다.

 

 


Actuator 활성화

spring actuator docs

spring 공식 문서의 설명처럼 스프링 부트에는 spring-boot-actuator 모듈을 통해 애플리케이션을 모니터링하고 관리하는 데 도움이 되는 다양한 기능(애플리케이션 상태, 환경, 메트릭 등)을 제공하며, HTTP endpoints 또는 JMX를 통해 상호 작용 할 수 있습니다.

(해당 포스팅에서는 HTTP endpoints에 중점을 두고 살펴봅니다.)

 

 

//gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-actuator'
}

(gradle 의존성 추가)

 

 

/actuator

위 의존성만 추가하면 spring boot actuator가 바로 활성화되며, 의존성 추가 후 애플리케이션을 실행하여 '/actuator' 경로로 요청하면 다음과 같이 actuator에서 기본적으로 노출된 기능(health)을 볼 수 있습니다.

(json 데이터를 깔끔하게 보기 위해 chrome에서 JSON Viewer라는 확장 프로그램을 사용하였습니다.)

 

 

//actuator 기본 경로 변경
management.endpoints.web.base-path = /management

액츄에이터의 기본 경로(/actuator)management.endpoints.web.base-path 속성을 통해서도 변경할 수 있는데요.

보안적인 측면에서도 default 값인 '/actuator'를 그대로 사용하는 것보다 변경하여 사용하는 것이 더 좋습니다.

 

 

//actuator 접근 포트 변경
management.server.port= 8081

접근 경로뿐만 아니라 actuator에 대한 접근 포트도 변경할 수 있는데요.

보안 강화를 위해 변경된 포트에 대해서는 내부망을 통해서만 접근할 수 있도록 조치할 수 있으며, 포트 변경이 불가능한 경우 filter를 사용하거나 spring security 등을 통해 인가된 사용자만 접근할 수 있도록 조치할 수 있습니다.

 

 


Actuator 다양한 기능과 설정

actuator 전체 기능 노출

 

//actuator 전체 기능 노출
management.endpoints.web.exposure.include= *

기본적으로 노출된 health 외에 actuator의 모든 기능을 노출하기 위해서는 Asterisk(*)를 통해 다음과 같이 활성화할 수 있는데요.

 

 

endpoint description
/beans 애플리케이션에 등록된 모든 Spring Bean의 목록을 표시합니다.
/conditions condition을 통해 Bean을 등록할 때 평가된 조건과 일치하거나 일치하지 않는 이유를 표시합니다.
/env Environment 정보를 확인할 수 있습니다.
/health 애플리케이션의 상태 정보를 확인할 수 있습니다.
/httpexchanges HTTP 호출 응답 정보를 확인할 수 있으며, HttpExchangeRepository를 구현한 Bean을 별도로 등록해야 합니다.
/info 애플리케이션 정보를 확인할 수 있습니다.
/loggers 애플리케이션의 로거 설정을 확인할 수 있으며, 변경도 가능합니다.
/metrics 애플리케이션의 메트릭 정보를 확인할 수 있습니다.
/mappings @RequestMapping에 대한 정보를 확인할 수 있습니다.
/threaddump thread dump에 대한 정보를 확인할 수 있습니다.
/shutdown 애플리케이션을 종료할 수 있으며, 해당 기능은 기본적으로 비활성화 되어 있습니다.

(여기서 thread dump는 JVM에서 활성화된 모든 스레드의 목록을 말합니다.)

 

위 표는 actuator의 주요 기능들을 정리한 것으로 내용 외 전체 기능들에 대해서는 아래 공식 문서를 참고하시면 됩니다.

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

 

 

***

하지만 실제로 액츄에이터를 사용할 때는 불필요한 기능을 제외하고 필요한 기능만 include 해서 사용하는 것이 좋은데요.

각각의 endpoint는 활성화 여부(enabled/disabled)를 결정할 수 있고, 노출 여부(exposed)를 결정할 수 있습니다.

(enabled 된 endpoint를 expose 해야 사용할 수 있게 됩니다.)

 

 

//actuator의 기본 설정 사용 여부
management.endpoints.enbaled-by-default = false

우선 actuator의 shutdown을 제외한 나머지 endpoints에 대해서 enabled 되어 있는 것이 기본 설정인데요.

때문에 management.endpoints.enabled-by-default 속성 값을 false로 주어 기본 설정을 따르지 않겠다고 설정합니다.

 

 

//특정 endpoint 활성화 여부
management.endpoint.[endpoint name].enabled = true

//노출 시킬 endpoints 설정
management.endpoints.web.exposure.include = info, health

그리고 필요한 endpoint의 경우 management.endpoint.[endpoint name].enabled 속성을 true로 설정함으로써 활성화할 수 있으며, management.endpoints.web.exposure.include 속성을 통해 노출할 수 있습니다.

 

 

//jmx에 대한 노출 제외 여부
management.endpoints.jmx.exposure.exclude = *

추가로 앞서 액츄에이터는 HTTP endpoints 또는 JMX를 통해 상호 작용 할 수 있다고 했는데요.

여기서는 JMX를 사용하지 않기 때문에 jmx.exposure.exclude 속성을 Asterisk(*)를 통해 전체 노출되지 않도록 설정합니다.

 

 


health, metrics

위에서 살펴본 actuator 각각의 기능은 설명한 내용과 같으며, 복잡하지 않기 때문에 직접 접근하여 확인해 볼 수 있는데요.

여기서는 actuator의 몇 가지 기능(health, metrics)에 대해서만 조금 더 살펴보겠습니다.

 

 

1. health

health 기능을 통해서는 애플리케이션의 상태 정보(status)를 아래 4가지 값으로 확인할 수 있는데요.

이 상태 값은 단순히 애플리케이션이 요청에 응답할 수 있는지 판단하는 것을 넘어서 애플리케이션이 사용하는 데이터베이스가 응답하는지, 디스크 사용량에는 문제가 없는지 등의 정보를 종합해서 판단됩니다.

 

UP: 시스템이 작동 중이고 접근 가능

DOWN: 시스템이 작동하지 않거나 접근할 수 없음

UNKNOWN: 시스템의 상태가 분명하지 않음

OUT_OF_SERVICE: 시스템에 접근할 수 있지만 현재 사용할 수 없음

 

 

actuator health

 

//health에 대한 더 자세한 정보 노출
management.endpoint.health.show-details= always

//각각의 health component에 대한 상태만 노출
management.endpoint.health.show-components= always

show-details 속성 값을 always로 설정하여 health에 대한 더 자세한 정보를 확인할 수 있으며, show-components 속성 값을 always로 설정하면 세부 정보를 빼고 각각의 health component에 대한 상태만 노출할 수도 있습니다.

 

 

 

2. metrics

metrics 데이터 일부

'/metrics' endpoint를 통해 실행 중인 애플리케이션의 jvm memory, jvm thread, process cpu, disk, database connections, tomcat sessions 등 다양한 종류의 메트릭이 제공되는 것을 확인할 수 있는데요.

 

 

/metrics/hikaricp.connections

다음과 같이 '/actuator/metrics/{metric name}' 경로를 통해 각각의 메트릭에 대한 자세한 정보를 확인할 수 있습니다.

 

 


Micrometor 역할

해당 포스팅에서는 Prometheus라는 모니터링 툴을 사용하지만, 실제로는 프로메테우스 외에도 다양한 모니터링 툴이 존재하는데요.

문제는 각각의 모니터링 툴마다 metric을 받는 형태가 다르다는 것입니다.

 

이러한 문제를 해결하기 위해 사용하는 것이 바로 'Micrometor'인데요.

 

 

micrometor

마이크로미터는 '애플리케이션 메트릭 파사드'라고 불리는데, 애플리케이션의 metric(측정 지표)을 micrometor가 정한 표준 방법으로 모아서 제공합니다.

쉽게 말하자면, 추상화를 통해 구현체를 쉽게 변경할 수 있도록 한 것으로 SLF4J와 유사합니다.

(로깅 관련 시스템에서 SLF4J가 있다면 메트릭에서는 Micrometor가 있다고 볼 수 있습니다.)

 

마이크로미터는 Prometheus 외에도 JMX, AppOptics, Azure Monitor, Atlas, CloudWatch, Datadog, Elastic, Ganglia, SignalFx, Wavefront 등의 다양한 모니터링 시스템을 지원합니다.

 

 

spring boot 2.x 버전부터 spring-boot-actuator는 메트릭 수집에 micrometor 라이브러리를 기본으로 내장해서 사용하는데요.

spring-boot-actuator는 micrometor가 제공하는 지표 수집을 @AutoConfiguration을 통해 자동으로 등록해 줍니다.

 

//gradle
dependencies {
    implementation 'io.micrometer:micrometer-registry-prometheus'
}

prometheus에서 사용되는 메트릭을 수집할 때는 위 micrometor-registry-prometheus 의존성을 추가하여 사용할 수 있습니다.

 

 

/actuator/prometheus

위 의존성을 추가하면 프로메테우스에 metric을 전달하기 위한 '/prometheus'라는 endpoint가 생기고, 해당 endpoint에 접근하면 다음과 같은 데이터를 볼 수 있습니다.

 

 

여기까지 actuator에 대한 내용과 micrometor 역할에 대한 간단한 내용이며, prometheus와 grafana에 대한 내용 이어서 포스팅하겠습니다.

추가로 micrometor의 세부적인 기능과 custom metric을 만드는 등의 내용에 대해서도 따로 포스팅하도록 하겠습니다.

 

 

< 이어지는 포스팅 >

2023.09.15 - [Programming/Monitoring] - Prometheus 개념 및 특징 정리, 모니터링 시스템 구축 2편

 

< 참고 자료 >

https://techblog.woowahan.com/9232/

 

(해당 포스팅은 김영한 님의 '스프링 부트 - 핵심 원리와 활용' 강의 내용을 기반으로 하여 추가적으로 공부한 것을 정리한 내용입니다.)