본문 바로가기
스프링부트/액추에이터

1. 스프링 부트 액추에이터

by amobu0 2024. 6. 1.
개발오류는 IDE에서 알려주지만 운영 상태에서의 오류는 어떻게 아는 거지?
DB 등 다른 곳에 문제가 생기면?

 

 

단순히 스프링부트와 관련된 프로젝트를 만들고 배우면서 궁금증이 생기기 시작했다. 이런 궁금증 해소를 위해 찾아본 책과 인터넷 강의를 글로 정리하고, 내가 다시 읽어볼 것을 대비해 계속 공부하고 부족한 부분이나 개념은 보완해 나가려고 한다.

 

 

서비스를 실제 운영 단계에 올리게 되면 개발자들이 해야 하는 또 다른 중요한 업무는 서비스에 문제가 없는지 모니터링하고 지표들을 심어서 감시하는 활동이다. 스프링부트는 개발자들이 개발에만 집중할 수 있게 수많은 자동구성기능을 제공하는 만큼 spring-boot-starter-actuator 의존관계를 통해 모니터링 기능도 지원해주고 있다. 스프링 부트 액추에이터를 사용하면 스프링 부트 애플리케이션을 모니터링하고 상호작용할 수 있다. 고객에게 실제 서비스가 나가지 않은 상태에서는 모니터링 기능이 없어도 상관없지만 운영환경에서 서비스할 때 필요한 이런 기능들을 필수로 준비를 해야 한다.

 

 

먼저 build.gradle에 의존관계를 추가한다.

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

 

 

 

다음으로 application.properties 또는 application.yml 파일에 아래의 코드를 입력하면 액추에이터가 제공하는 모든 엔드포인트를 웹으로 노출한다. 

 

management.endpoints.web.exposure.include=*

 

 

다양한 엔드포인트

각각의 엔드포인트를 통해서 개발자는 애플리케이션 내부의 수많은 기능을 관리하고 모니터링할 수 있다.

 

beans : 스프링 컨테이너에 등록된 스프링 빈을 보여준다.

conditions : condition을 통해서 빈을 등록할 때 평가 조건과 일치하거나 일치하지 않는 이유를 표시한다.

configprops: @configurationproperties를 보여준다.

env: environment 정보를 보여준다.

health: 애플리케이션 헬스 정보를 보여준다.

Info : 에를리케이션 정보를 보여준다.

loggers: 애플리케이션 로거 설정을 보여주고 변경도 할 수 있다.

httpexchanges: HTTP 호출 응답 정보를 보여준다. HttpExchangeRepository를 구현한 빈을 별도로 등록해야 한다.

metrics: 애플리케이션 메트릭 정보를 보여준다.

mappings: @RequestMapping 정보를 보여준다.

threaddump: 스레드 덤프를 실행해서 보여준다.

shutdown: 애플리케이션을 종료한다. 이 기능은 기본으로 비활성화되어 있다.

 

 

만약 필요한 엔드포인트만 노출하고 싶다면 * 대신 필요한 이름을 쉼표로 연결해서 입력하면 된다.

management.endpoints.web.exposure.include=info, health

 

include와 exclude를 사용해서 액추에이터의 노출을 설정할 수 있다.

management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=health, info, loggers

 

include의 값을 *로 지정해서 모든 엔드포인트를 노출하고, exclude의 값을 health, info, loggers로 지정해서 노출을 제외하므로, 결과적으로 health, info, logger를 제외한 모든 엔드포인트가 웹으로 노출된다.

 

 

management.endpoints.web.exposure.include=* 로 설정하고 애플리케이션 실행 후 http://localhost:8080/actuator/health에 접속하면 Health 엔드포인트는 status: UP을 반환한다. UP은 애플리케이션의 전반적인 상태가 정상이고 애플리케이션의 모든 구성 요소가 접속 가능한 상태라는 것을 의미한다.

 

웹 브라우저가 출력한 애플리케이션의 상태 정보

 

 

Health 엔드포인트 탐구

http://localhost:8080/actuator/health

 

헬스 정보를 사용하면 애플리케이션에 문제가 발생했을 때 문제를 빠르게 인지할 수 있다. 이름에서 알 수 있는 것처럼 health 엔드포인트에 접근하면 애플리케이션과 애플리케이션에서 사용하는 여러 컴포넌트의 상태를 전반적으로 파악할 수 있다. 스프링부트는 애플리케이션 컴포넌트로 다양한 healthindicator 구현체를 제공한다. 이중 DishSpaceHealthIndicator와 PingHealthIndicator 같은 일부 구현체는 항상 기본으로 포함된다.

 

액추에이터는 db, mongo, redis, diskspace, ping과 같은 수많은 헬스 기능을 기본으로 제공한다.

아래의 코드로 설정하고 http://localhost:8080/actuator/health에 접속하면 상태 상세 정보가 출력된다.

management.endpoint.health.show-details=always

 

management.endpoint.health.show-details=always

  • Always - 상태 상세 정보를 항상 표시한다.
  • Never - 기본값이며 상태 상세 정보를 표시하지 않는다.
  • When-authorized - 애플리케이션에서 인증되고 application.properties 파일의 management.endpoint.health.roles 지정한 역할을 가지고 있는 사용자가 접근할 때만 상태 상세 정보를 표시힌다.

 

스프링부트는 클래스패스에 있는 의존 관계에 따라 조건적으로 HealthIndicator 활성화한다. 예를 들어 관계형 데이터베이스를 사용한다면 스프링 부트는 자동 구성을 통해 DataSourceHealthIndicator 추가한다. ( management.endpoint.health.show-details always 설정되어야 한다.)

 

Status 필드 상태정보

  • DOWN - 컴포넌트를 정상적으로 사용할 수 없는 상태
  • OUT-OF-SERVICE - 컴포넌트가 일시적으로 동작하지 않는 상태
  • UP - 컴포넌트가 의도한 대로 동작하는 상태
  • UNKNOWN - 컴포넌트 상태를 알 수 없는 상태

 

스프링부트는 특정 순서를 따라서 애플리케이션의 상태를 집계한다. 그래서 DOWN이 우선순위가 가장 높고, UNKNOWN이 가장 낮다. HealthIndicators 항목 중 하나라도 상태가 DOWN이면 애플리케이션의 집약된 상태도 DOWN이 된다.

 

 

info 엔드포인트 탐구

http://localhost:8080/actuator/info

 

스프링 부트가 제공하는 info 엔드포인트를 통해 애플리케이션 관련 정보를 확인할 수 있다. info앤드포인트는 기본적으로 아무 정보도 제공하지 않는다. http://localhost:8080/actuator/info에 접속하면 웹 브라우저는 {}로 응답한다.

 

management.info.env.enabled=true와 springBoot {buildInfo()}를 추가한다.

application.properties에 추가된 코드 사진

 

management.info.env.enabled=true
info 환경 정보 표시 활성화 (스프링 부트 2.6 이상에서만 설정 가능)

 

 

 

build.gradle 파일에 아래의 코드가 추가된 사진

 

springBoot {
	buildInfo()
}

 

추가된 코드의 결과 build -> resources -> META-INF 폴더에  build.info.properties 파일 자동 생성

 

추가된 코드로 build 폴더에 자동으로 build.info.properties파일이 생성되는 것을 확인할 수 있다.

 

 

 

 

 

웹브라우저에 java버전과 os버전도 같이 출력해 보기 위해 코드를 더 추가해 보았다.

java, os 정보를 출력하기 위해 application.propertiese에 추가한 코드

management.info.java.enabled=true
management.info.os.enabled=true

 

 

이제 http://localhost:8080/actuator/info에 접속하면 아래의 사진처럼 출력된 모습을 볼 수 있다.

build / java /os 정보가 출력된 웹 브라우저

 

 

httpexchange 엔드포인트 탐구

http://localhost:8080/actuator/info

 

httpexchanges 엔드포인드틀 통해 HTTP 요청과 응답의 과거 기록을 확인할 수 있다. HttpExchangeRepository 인터페이스의 구현체를 빈으로 등록하면 httpchanges 엔드포인트를 사용할 수 있다. 스프링 부트는 기본으로 InMemoryHttpExchangeResitory 구현체를 제공한다.

(주의! 해당 빈을 등록하지 않으면 httpexchanges 엔드포인트가 활성화 되지 않는다.)

 

httpexchanges를 사용하기 위해 구현체를 @Bean으로 등록한 사진

 

에플리케이션을 재시작하고 http://localhost:8080/actuator에 접속하면 아래의 사진과 같이 httpexchanges 엔드포인트가 생성된 것을 확인할 수 있다.

 

http://localhost:8080/actuator에 생성된 httpexchanges 엔드포인트

 

이 구현체는 최대 100개의 HTTP 요청을 제공한다. 최대 요청이 넘어가면 과거 요청을 삭제한다. setCapacity()로 최대 요청수를 변경할 수 있다. 이 기능은 매우 단순하고 기능에 제한이 많기 때문에 개발 단계에서만 사용하고, 실제 운영 서비스에서는 전문적인 모니터링 툴이나 핀포인트(네이버에서 만듦), Zipkin같은 다른 기술을 사용하는 것이 좋다. 

 

 

액추에이터 보안

액추에이터를 공부하면서 책에서는 컨텍스트 루트(경로)와 포트 변경이 왜 필요한건지 몰랐는데 인강에서 이 이유를 알게 되었다.

 

액추에이터가 제공하는 기능들은 애플리케이션의 내부 정보를 너무 많이 노출한다. 그래서 외부 인터넷망이 공개된 곳에 액추에이터의 엔트포인트를 공개하는 것은 보안상 좋은 방법이 아니다. 액추에이터의 엔드포인트들은 외부 인터넷에서 접근이 불가능하게 막고, 내부에서만 접근 가능한 내부망을 사용하는 것이 안전하다.

내부망 
특정 조직, 기업 내부에서 사용되는 사설 네트워크로, 사설IP 주소 범위를 사용한다. 내부 통신과 자원 공유를 위해 내부에서는 들어갈 수 있게 하고 외부에서는 못 들어오게 설정되어 있는 인터넷망

 

예를 들어 외부 인터넷 망을 통해서 8080 포트에만 접근할 수 있고, 다른 포트는 내부망에서만 접근할 수 있다면 액추에이터에 다른 포트를 설정하면 된다. 액추에이터의 기능을 애플리케이션 서버와는 다른 포트에서 실행하려면 예를 들어 아래의 코드를 application.properties에 추가하면 바뀐 경로로 접속이 가능하다. 추가로 컨텍스트 루트도 함께 바꿔 보았다.

 

//http://localhost:8081/amobu0
management.server.port=8081
management.endpoints.web.base-path=/amobu0

 

설정 값으로 컨텍스트 루트 및 포트가 변경된 모습

 

 

포트를 분리하는것이 어렵고 어쩔 수 없이 외부 인터넷 망을 통해서 접근해야 한다면 /actuator 경로에 서블릿 필터, 스프링 인터셉터 또는 스프링 시큐리티를 통해서 인증된 사용가만 접근 가능하도록 추가로 개발 해야한다.


 

 

글이 너무 길어지면 가독성이 떨이지기 때문에 마이크로미터, 그라파나, 프로메테우스, 메트릭 등은 다른 글에서 작성하려고 한다.

 

글에 관해서 틀린 부분이나 문제는 댓글로 알려주시면 감사하겠습니다.

 

 


 

출처: 책 -  https://jpub.tistory.com/1458

 

실전 스프링 부트

인류에겐 이런 스프링 부트 가이드북이 필요했다 방대한 스프링 부트 공식 문서 중 실무에서 잘 쓰이는 팁을 찾기란 어렵다. 이 책은 초급에서 중급 수준의 독자를 대상으로 스프링 부트의 기본

jpub.tistory.com

출처: 인강 - https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%ED%95%B5%EC%8B%AC%EC%9B%90%EB%A6%AC-%ED%99%9C%EC%9A%A9?#curriculum

 

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

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

www.inflearn.com