We will find a way, we always have.

-interstellar

Spring

[Spring] 액추에이터 Actuator

Redddy 2024. 8. 5. 02:06

프로덕션 준비 기능

지금까지 미션을 하면서 열심히 돌아가는 쓰레기를 목표로 코드를 짜고 그 다음에 열심히 또 리팩터링을 해 클린코드로 만들어 나갔다. 하지만 이제는 비즈니스 요구사항만 충족할 게 아니라 서비스에 문제가 있는지 없는지 모니터링해야 한다.  

 

프로덕션을 운영 환경에 배포할 때 준비해야 하는 것들이 있는데 이들을 프로덕션 준비 기능이라고 한다.

 

  • 지표(metric), 추적(trace), 감사(auditing)
  • 모니터링

 

애플리케이션이 잘 살아있는지, 커넥션 풀이 얼마나 사용되고 있는지 등을 확인할 수 있다. 

 

액추에이터 의존성 추가

 

스프링 프로젝트에 액추에이터를 설정하려면 아래처럼 의존성을 추가해주면 된다. 

 

 

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

 

 

 

API 확인

 

스프링 실행 시키고 localhost:8080/actuator로 접근하면 아래와 같은 JSON을 뿌려준다. 그리고 /actuator/health로 가보면 현재 서버가 잘 돌아가고 있는지 알려준다. 

 

 

 

현재 기능은 헬스 상태를 확인하는 기능 뿐이다. 더 많은 기능을 제공하는데 이런 기능이 웹 환경에서 보이도록 하려면 아래 처럼 application.yml을 수정해야 한다. 

 

management:
  endpoints:
    web:
      exposure:
        include: "*"

 

 

설정하고 /actuator로 접근하니 아까보다 더 많은 정보를 제공하는 것을 볼 수 있었다.

 

빼곡

 

 

예시로 actuator/beans 로 접근하면 등록된 빈들을 살펴볼 수 있다.

 

 

 

이제 로그찍고 파악하는 것이 아니라 액추에이터를 활용해 빈등록이 제대로 되었는지 확인할 수 있다. 

 

엔드포인트 활성화 및 노출

 

엔드포인트는 대부분 활성화가 기본값이다. 하지만 shutdown 엔드포인트는 off가 기본값이다. 이 엔드포인트가 실행되면 서버가 shutdown 되버린다. 😂

 

활성화가 되어 있다고 전부 노출되는 것이 아니라 앞서 작성했던 것처럼 설정파일에서 exposure 해주어야 한다. 노출방법도 HTTP로 할 것인지 JMX로 할 것인지 정할 수 있다.

 

활성화가 되어 있는 것들만 노출된다. 

 

 

 

설정 파일을 변경하여 shutdown을 활성화 해주었더니 이전에는 노출되지 않았던 shutdown이 노출되었다. 

 

그리고 포스트맨으로 shutdown POST 요청을 날리니 서버가 내려갔다. 

 

 

 

include를 통해 노출할 엔드포인트를 표현하고 exclude를 통해 제외할 엔드포인트를 설정할 수 있다.

 

 

엔드포인트

  • beans : 스프링 컨테이너에 등록된 스프링 빈을 보여준다.
  • conditions : condition 을 통해서 빈을 등록할 때 평가 조건과 일치하거나 일치하지 않는 이유를 표시한다.
  • configprops : @ConfigurationProperties 를 보여준다.
  • env : Environment 정보를 보여준다.
  • health : 애플리케이션 헬스 정보를 보여준다.
  • httpexchanges : HTTP 호출 응답 정보를 보여준다. HttpExchangeRepository 를 구현한 빈을 별 도로 등록해야 한다.
  • info : 애플리케이션 정보를 보여준다.
  • loggers : 애플리케이션 로거 설정을 보여주고 변경도 할 수 있다.
  • metrics : 애플리케이션의 메트릭 정보를 보여준다.
  • mappings : @RequestMapping 정보를 보여준다.
  • threaddump : 쓰레드 덤프를 실행해서 보여준다.
  • shutdown : 애플리케이션을 종료한다. 이 기능은 기본으로 비활성화 되어 있다. ☠

 

이곳에서 다양한 엔드포인트를 확인할 수 있다.

 

 

 

INFO

액추에이터를 활용하여 자바 버전이나 OS 관련 정보를 확인할 수도 있다. 

 

 

 

또한 build.gradle에 아래처럼 내용을 추가한다면 빌드 정보도 확인 가능하다. 

 

 

springBoot {
	buildInfo()
}

 

 

 

 

 

언제 빌드됐는지 버전은 무엇인지 등등 정보를 확인할 수 있다. 

 

깃과 관련하여 아주 유용한 기능도 있다. 

build.gradle에 "com.gorylenko.gradle-git-properties" 를 추가해주고 actuator/info를 확인해보면,,,  마지막 커밋이 무엇인지 확인할 수 있다. 

 

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.3.2'
	id 'io.spring.dependency-management' version '1.1.6'
	id "com.gorylenko.gradle-git-properties" version '2.4.1'
}

 

 

 

 

 

로거

 

yml 파일을 설정하여 로깅 레벨을 변경할 수 있다.

 

 

 

 

 

loggers 엔드포인트를 활용하면 실시간으로 로깅 레벨 변경이 가능하다!!!

 

 

 

/actuator/loggers/{상세 경로}를 통해 GET 요청을 보내면 해당 패키지의 로깅 레벨을 확인할 수 있다. 

 

/actuator/loggers/{상세 경로}를 POST 요청으로 body에 변경하고자 하는 값을 보낸다면 동적으로 레벨이 변경된다!!

 

 

POST 요청

 

GET 요청

 

 

이전에는 DEBUG였던 레벨이 TRACE로 변경되었다. 

 

당연한 이야기겠지만 서버 내렸다가 다시 띄우면 DEBUG로 돌아간다. 

 

 

 

HTTP 요청 응답 기록

메모리에 HTTP 요청 응답을 저장하여 기록하는 방법도 있다. 

 

 

빈 등록을 하고 요청 몇개 보내본다음 actuator/httpexchanges 에 접근하면 어떤 요청들이 왔는지 확인할 수 있다. 

 

 

이는 인메모리에 저장되기 때문에 최대 100개까지 저장되고 초과한다면 이전것을 지우도록 설계되어 있다. setCapacity 메서드를 통해 최대값을 변경할 수도 있다. 

 

 

 

 

보안

액추에이터는 지금까지 보았다시피 많은 정보를 제공하기 때문에 외부에서 액추에이터의 엔드포인트를 공개하는 것은 보안상 좋은 방안이 아니다. 

 

포트를 분리하는 방법

 

management:
  server:
    port: 9292

 

 

8080과 9292 모두 포트가 띄어진것을 확인할 수 있다.

 

 

이제 8080으로는 /actuator 접근이 불가해졌다. 

 

 

액추에이터 URL 경로에 인증 설정

서블릿 필터, 스프링 인터셉터를 활용하여 /actuator 경로 접근을 제한할 수 있다.

 

제일 좋은 방법은 내부망에서만 접근할 수 있도록하는 것이 좋다. 

 

 

참고

 

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

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

www.inflearn.com