Spring

[Spring]의 엑추에이터 엔드포인트(Actuator Endpoint)란?

마닐라 2022. 4. 1. 17:47

엔드포인트(Endpoint)

An endpoint is simply one end of a communication channel.

(stackoverflow)

 

단순히 커뮤니케이션 채널의 한쪽 끝이라고 설명하고 있습니다.

개발하는 입장에서 보자면 서비스를 이용할 때 한쪽 끝에 해당하는 URI라고 볼 수 있습니다.

 

스프링 부트의 엑추에이터 엔드포인트란 애플리케이션의 상태를 관리할 수 있는 URI를 말합니다.

엑추에이터 엔드포인트를 사용하면 애플리케이션을 쉽게 모니터링할 수 있습니다.

스프링 부트는 여러가지 엔드포인트를 내장하고 있으며 자체 엔드포인트도 추가할 수 있습니다. 

 

사용을 위해서는 아래의 의존성을 추가해야 합니다.

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

아래 엔드포인트들은 사용하는 기술에 상관없이 지원합니다.

ID Description
auditevents 현재 애플리케이션에 대한 감사audit 이벤트들의 정보를 노출한다. AuditEventRepository 빈이 있어야 한다.
beans 애플리케이션에 있는 전체 스프링 빈들을 보여준다.
caches 사용 가능한 캐시들을 노출한다.
conditions 설정과 자동 설정 클래스들에서 평가한 조건들과 함께, 그 조건이 매칭되거나 매칭되지 않은 이유를 보여준다.
configprops 모든 @ConfigurationProperties에 있는 정보들을 모아서 보여준다.
env 스프링의 ConfigurableEnvironment에 있는 프로퍼티들을 노출한다.
flyway 적용시킨 모든 Flyway 데이터베이스 마이그레이션들을 보여준다. Flyway 빈이 하나 이상 필요하다.
health 애플리케이션의 상태 정보를 보여준다.
httptrace HTTP trace 정보를 보여준다 (기본적으로는 HTTP request-response exchange를 마지막 100개까지 표기). HttpTraceRepository 빈이 있어야 한다.
info 애플리케이션 정보를 보여주며, 애플리케이션 정보는 임의로 추가할 수 있다.
integrationgraph Spring Integration graph를 보여준다. spring-integration-core 의존성이 필요하다.
loggers 애플리케이션에 있는 로거 설정을 조회하고 변경한다.
liquibase 적용시킨 모든 Liquibase 데이터베이스 마이그레이션들을 보여준다. Liquibase 빈이 하나 이상 필요하다.
metrics 현재 애플리케이션의 ‘메트릭’ 정보를 보여준다.
mappings 모든 @RequestMapping path 정보를 모아서 보여준다.
quartz Quartz 스케줄러 job들에 관한 정보를 보여준다.
scheduledtasks 애플리케이션에 있는 스케줄링된 테스크들을 보여준다.
sessions 스프링 세션 기반 세션 저장소에서 사용자 세션을 검색하고 삭제할 수 있다. 스프링 세션을 사용하는 서블릿 웹 애플리케이션이 필요하다.
shutdown 애플리케이션을 graceful하게 종료시킬 수 있다. 기본적으로는 비활성화한다.
startup ApplicationStartup으로 수집한 startup 단계 데이터를 보여준다. SpringApplication에 BufferingApplicationStartup을 설정해줘야 한다.
threaddump 스레드 덤프를 수행한다.

 

웹 애플리케이션에선 (스프링 MVC, 스프링 웹플럭스, Jersey) 아래와 같은 엔드포인트들도 이용할 수 있습니다.

ID Description
heapdump hprof 힙 덤프 파일을 반환한다. HotSpot JVM이 필요하다.
jolokia HTTP를 통해 JMX 빈을 노출한다 (클래스패스에 Jolokia가 있을 땐 웹플럭스에선 사용할 수 없다). jolokia-core 의존성이 필요하다.
logfile 로그 파일에 있는 내용들을 반환한다 (logging.file.name이나 logging.file.path 프로퍼티를 설정해줬다면). HTTP Range 헤더를 사용해서 로그 파일에 있는 내용 일부만 조회할 수도 있다.
prometheus 메트릭을 프로메테우스 서버에서 스크랩할 수 있는 포맷으로 노출한다. micrometer-registry-prometheus 의존성이 필요하다.

 

위와 같이 많은 엔드포인트가 존재하는데 엔드포인트는 시스템과 관련된 사항이므로 상태 정보를 아무에게나 노출하면 안됩니다. 확인된 사용자에게만 actuator 정보를 노출시켜야 합니다. 2가지 방법으로 설정이 가능합니다.

  1. management.server.port, management.server.address 값을 수정해서 해당 ip, address에 한해 ACL를 걺
  2. spring-security를 이용하여 management.endpoints.web.base-path(기본값 /actuator)에 대해 권한을 확인

2가지 동시에 설정이 가능하고 상황에 맞게 설정을 해야합니다.

 

spring boot actuator는 기본적으로 클라우드 환경에서 관리자가 각종 애플리케이션 상태를 파악하기 쉽도록 설계되어 있습니다. 때문에 필요한 경우 외부 UI를 구성한 다른 도메인명을 가진 Web Application에서 각각의 서비스 애플리케이션의 상태를 파악하기 위해서 actuator 정보를 요청할 수도 있습니다.

이럴 때 CORS를 설정하여 사용할 수 있습니다.

 

https://inseongdev.tistory.com/102?category=891108 

 

CORS이란?

API로 정보를 받아오기 위해 프론트에서 HTTP 요청을 보냈을 때 미리 어떤 설정을 해주지 않으면 CORS 문제로 막히게 된다. Postman으로 요청을 보내거나 스프링 같은 백엔드에서 HTTP 요청을 보내면

inseongdev.tistory.com

 

http://other-domain.com 의 actuator에 대한 GET, POST 요청을 허용할 경우는 아래와 같습니다.

management.endpoints.web.cors.allowed-origins=http://other-domain.com
management.endpoints.web.cors.allowed-methods=GET,POST

 

엔드포인트의 숫자가 많기 때문에 주요 엔드포인트를 짧게 확인해보겠습니다.

 

Health Endpoint

health Endpoint의 경우 애플리케이션의 상태 정보를 보여준다고 나와있는데 애플리케이션이 의존하고 있는 시스템의 Health Check도 함께 파악할 수 있습니다. 아래 정보는 설정한 DataSource의 Health Check입니다.

{  
   "status":"UP",
   "details":{  
      "db":{  
         "status":"UP",
         "details":{  
            "database":"H2",
            "hello":1
         }
      }
   }
}

 

dataSource 외에도 Disk, ElasticSearch, Redis 등의 health Check도 확인 가능합니다.

 

Metrics Endpoint

metrics 엔드포인트는 아래와 같은 정보들을 확인할 수 있습니다.

  • JVM 정보
    • thread 수
    • GC 정보
    • heap 정보
  • DBCP 정보
  • PROCESS 관련 정보
  • CPU
    • USAGE
    • LOAD
  • FILE
    • 최대 사용가능한 File Descriptor 수
    • 현재 사용중인 File Descriptor 수

 

 

 

 

출처

https://supawer0728.github.io/2018/05/12/spring-actuator/

https://godekdls.github.io/Spring%20Boot/endpoints/