[Spring] 스프링부트 엑츄에이터(Actuator)란?

엑츄에이터란?

서비스를 운영하면서 장애는 언제든지 발생할 수 있지만, 이 장애를 잘 대응하는 것이 중요하다.

서비스에 문제가 없는지 모니터링하고 지표들을 심어서 감시하여 장애에 대응할 수 있다.

 

운영 환경에서 서비스할 때 필요한 이런 기능들을 프로덕션 준비 기능이라 한다.

프로덕션 준비 기능을 통해 애플리케이션이 현재 살아있는지, 로그 정보는 정상 설정 되었는지, 커넥션 풀은 얼마나 사용되고 있는지 등을 확인하여 장애 발생에 미리 대응할 수 있어야 한다.

 

스프링 부트가 제공하는 액츄에이터는 이런 프로덕션 준비 기능을 매우 편리하게 사용할 수 있는 다양한 편의 기능들을 제공한다.

더 나아가서 마이크로미터, 프로메테우스, 그라파나 같은 최근 유행하는 모니터링 시스템과 매우 쉽게 연동할 수 있는 기능도 제공한다.

 

 

엑츄에이터를 사용하기 위해서는 build.gradle에 아래 라이브러리를 추가해야한다.

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

 

엑츄에이터가 제대로 잘동작하는지 확인하기 위해서는 Main 클래스를 실행한뒤 http://localhost:8080/actuator 로 접속하여 확인할 수 있다.

액츄에이터는 /actuator 경로를 통해서 수 많은 기능을 제공하는 것을 볼 수 있다.

 

액츄에이터의 기능들을 웹에 노출

이러한 기능들을 웹 환경에 노출하기 위해서는 application.yml 파일에 다음과 같이 추가해줘야 한다.

( ”*” 모든 엔드 포인트를 웹에 노출 ) 

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

 

특정 엔드포인트를 활성화 하려면 management.endpoint.{엔드포인트명}.enabled=true 를 적용하면 된다.

(endpoints가 아닌 endpoint 임을 주의)

management:
 endpoint:
   shutdown:
     enabled: true
 endpoints:
   web:
    exposure:
     include: "*"

 

엑츄에이터 기능 접근

액츄에이터가 제공하는 기능 하나하나를 엔드포인트라 한다.

각각의 엔드포인트는 /actuator/{엔드포인트명} 과 같은 형식으로 접근할 수 있다.

 

(Ex : http://localhost:8080/actuator/health : 애플리케이션 헬스 정보)


엔드 포인트 종류

액츄에이터가 제공하는 엔드포인트 중에서 자주 사용하는 엔드포인트들을 보면 다음과 같다.

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

 

여기 중 한가지를 간단히 알아보자.

info

info 엔드포인트는 애플리케이션의 기본 정보를 노출한다.

기본으로 제공하는 기능들은 다음과 같다.

java : 자바 런타임 정보
os : OS 정보
env : Environment 에서 info. 로 시작하는 정보
build : 빌드 정보, META-INF/build-info.properties 파일이 필요하다.
git : git 정보, git.properties 파일이 필요하다.

여기서 env , java , os 는 기본으로 비활성화 되어 있기에 사용하려면 설정파일에서 활성화를 해줘야 한다. (info는 다른 항목과 다르게 management 바로 하위 항목임에 주의!)

management:
  info:
    java:
      enabled: true
    os:
      enabled: true
   	env:
      enabled: true

 

git

info에서 제공하는 기능 중 하나인 git을 사용해보자.

git은 빌드 시점에 사용한 git 정보도 노출할 수 있다

 

git 정보 노출을 위해서는 git.properties 파일이 필요하다.

이 파일을 생성하기 위해서는 build.gradle의 plugins에 다음 내용을 추가하면 된다.

( 물론 프로젝트가 git 으로 관리되고 있어야 한다. 그렇지 않으면 빌드 시 오류 발생 )

plugins {
     ...
     id "com.gorylenko.gradle-git-properties" version "2.4.1" //git info
}

 

git push 후 실행 결과를 통해서 이 빌드는 main 브랜치와 754bc78 커밋에서 만들어진 것을 확인할 수 있다.

{
	 "git":{
		 "branch":"main",
		 "commit":{
			 "id":"754bc78",
			 "time":"2023-01-01T00:00:00Z"
	 }
 }
 ...
}

애플리케이션을 배포할 때 가끔 기대와 전혀 다르게 동작할 때가 있는데, 다른 커밋이나 다른 브랜치의 내용이 배포되진 않았는지 이 기능을 통해 확인할 수 있다.

 

matrics

metrics 엔드포인트를 사용하면 기본으로 제공되는 메트릭들을 확인할 수 있다.

수집 된 matric은 프로메테우스와 그라파나에 전달하여 원하는 matric(지표)를 편리하게 사용하고 볼 수 있다.

 

matrics에 더 자세히 알아보려면 아래의 링크를 통해 더 알아보자.

 

[Spring] 마이크로미터(Micrometer)와 메트릭(Matric) 확인

마이크로미터란? 서비스를 운영할 때는 애플리케이션의 CPU, 메모리, 커넥션 사용, 고객 요청수 같은 수 많은 지표들을 확인하는 것이 필요하다. 그래야 어디에 어떤 문제가 발생했는지 사전에

hstory0208.tistory.com

 


엑츄에이터 보안

액츄에이터가 제공하는 기능들은 우리 애플리케이션의 내부 정보를 너무 많이 노출한다.

그래서 외부 인터넷 망이 공개된 곳에 액츄에이터의 엔드포인트를 공개하는 것은 보안상 좋은 방안이 아니다.

액츄에이터의 엔드포인트들은 외부 인터넷에서 접근이 불가능하게 막고, 내부에서만 접근 가능한 내부망을 사용하는 것이 안전하다.

 

엑츄에이터를 다른 포트에서 실행

예를 들어서 외부 인터넷 망을 통해서 8080 포트에만 접근할 수 있고, 다른 포트는 내부망에서만 접근할 수 있다면 액츄에이터에 다른 포트를 설정하면 된다.

액츄에이터의 기능을 애플리케이션 서버와는 다른 포트에서 실행하려면 다음과 같이 설정하면 된다.

이 경우 기존 8080 포트에서는 액츄에이터를 접근할 수 없다.

 

management.server.port=9090

management:
  server:
    port: 9090

 


참고자료 : 스프링 부트 - 핵심 원리와 활용