1. Actuator란?

 

애플리케이션이 잘 동작하는지, 혹은 지금 상태가 어떤지 확인할 수 있고,  로그 레벨 같은 간단한 정보도 수정할 수 있는 기능을 제공합니다. 사용은 HTTP와 JMX을 활용해서 애플리케이션 외부에서 확인할 수 있습니다. 

 

1-1. 디펜더시 추가

 

actuator를 사용하기 위해선 actuator 디펜던시를 추가해줘야 합니다.

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

 

2. 엔드포인트 

 

저희는 HTTP를 활용해서 접근할 예정입니다. 그렇다면 엔드포인트 즉 모니터링이나 수정을 할 수 있도록 애플리케이션과 연결해주는 연결지점입니다. 기본으로 제공되는 것들도 있고, 사용자가 직접 추가할 수도 있습니다. 기본 제공자 먼저 보겠습니다. springboot actuator endpoints에서 다양한 엔드포인트를 확인하실 수 있고, 저는 자주 사용하는 것에 대해서만 적어보겠습니다. 

 

2-1. HTTP 엔드포인트 열기

 

엔드포인트들을 HTTP로 사용하기 위해선 사용할 수 있도록 설정해줘야 합니다. 설명은 주석으로 달겠습니다. 

management:
  endpoints:
    web:
      exposure: # 웹 HTTP로 접근 가능하게 설정할 범위 지정
        include: "*" # *일 경우 모든 엔드포인트 오픈 보안상의 이유로 몇 가지 지정해서 사용
        exclude: # 제외할 엔드포인트 지정
      base-path: /management # 원래 ip:port/actuator로 접근 가능 이것을 지정함으로써 actuator -> management로 변경

 

이제 위처럼 그냥 다 오픈해놓고, 주요한 것을 알아보겠습니다. 운영 환경에선 애플리케이션의 중요한 정보들이 있기 때문에 열어두시면 안 됩니다.

 

2-2. info

 

application.yml 혹은 properties에 정적 정보를 명시할 수 있습니다. 예를 들어서 애플리케이션의 이름, 버전 배포자를 명시할 수 있습니다.

springboot 2.5.x 까지는 별다른 설정없이 사용할 수 있었지만 2.6.x이후부터는 아래의 설정을 해줘야 합니다. 

management:
  info:
    env:
      enabled: true

 

이제 접두어로 info로 가진 속성들이 나오게 됩니다. 예시로 애플리케이션 이름만 가져오도록 하겠습니다.

 

 

위처럼 나오게 하려면 application.yml을 아래와 같이 수정하면됩니다.  

 

spring:
  application:
    name: for-blog

management:
  info:
    env:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "*"
        exclude:
      base-path: /management
info:
  application:
    application-name: ${spring.application.name}

 

2-3. health

 

애플리케이션의 현재 상태를 가져옵니다. info를 health로 바꿔서 실행합니다. 

 

 

status: UP이 나왔습니다.

 

상태 목록은 아래와 같습니다.

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

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

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

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

 

위의 정보로는 애플리케이션의 자세한 정보를 알지 못합니다. 따라서 application.yml에 추가 설정을 해줍니다.

 

management:
  info:
    env:
      enabled: true
  endpoints:
    web:
      exposure:
        include: "*"
        exclude:
      base-path: /management
  endpoint: # 추가 설정 부분 health에 관해서 자세한 정보를 출력
    health:
      show-details: always # never, always, when_authorized가 있습니다.
                           # never: 어떠한 상황에도 출력 x
                           # always: 항상 출력
                           # when_authorized: 권한이 있을 경우만

 

이제 유의미한 정보를 알 수 있습니다. 

 

 
 
 

2-4. loggers

 

애플리케이션의 로깅 레벨들을 출력해줍니다. /loggers로 보내면 아래와 같이 응답을 받을 수 있습니다. 

 

 

별도의 logger 레벨을 동적으로 변경하길 원한다면 /loggers/{로거명} post로 아래의 json을 보내주시면 됩니다. 

{
    "configuredLevel": 변경사항,
    "effectiveLevel": 변경사항
}

 

2-5. metrics

 

실행중인 애플리케이션의 생성되는 온갖 종류의 메트릭을 제공합니다. 가비지 컬렉션, HTTP 요청 관련 매트릭 등등이 포함됩니다.

 

 

원하는 매트릭의 정보를 자세히 알고 싶다면, /metrics/{매트릭 이름} Get요청으로 보내면 됩니다. 활성화된 스레드 개수를 확인해보기 위해서 jvm.threads.live로 요청을 보냅니다. 

 

 

measurements부터가 주요한 정보입니다. 따라서 지금 26개의 쓰레드가 활성화돼있습니다. 

 

2-6. httptrace

 

최근 요청에 대한 정보를 만들어줍니다. 사용하기 위해선 @Bean으로 InMemoryHttpTraceRepositry을 등록해줘야 합니다. 간단하게 Application이 있는 위치에 등록해줍니다. 요청 정보의 개수를 설정할 수 있고, 출력 순서를 뒤집을 수도 있습니다. 저희는 디폴트 세팅으로 하겠습니다. 

 

@Bean
    public InMemoryHttpTraceRepository inMemoryHttpTraceRepository(){
//        InMemoryHttpTraceRepository inMemoryHttpTraceRepository = new InMemoryHttpTraceRepository();
//        inMemoryHttpTraceRepository.setCapacity(100); // 용량 설정
//        inMemoryHttpTraceRepository.setReverse(false); // default는 true 값 따라서 최근 것이 가장 먼저 보여짐
        return new InMemoryHttpTraceRepository();
    }

 

아무런 요청이나 보내고, 확인해보면 아래와 같은 화면을 받을 수 있습니다. 응답 순서는 최근에 요청한 순서입니다. 따라서 reverse세팅을 주면, 가장 오래된 요청부터 정보가 출력됩니다. 

 

지금까지 Actuator를 활용해서 애플리케이션 정보를 확인하는 방법을 알아봤습니다. Actuator만을 사용해서는 가독성이 떨어지고, 항상 요청을 보내야 하는 문제점이 있습니다. 다음에는 프로메테우스와 그라파나를 연동해서 가독성이 높고 편리하게 만들어보겠습니다. 감사합니다.