Spring Boot Actuator 엔드포인트

Spring Boot Actuator 엔드포인트를 통해 애플리케이션을 모니터링하고 상호 작용할 수 있습니다. Spring Actuator는 Spring Boot의 하위 모듈로, 애플리케이션에 대해 활성화하거나 비활성화할 수 있는 내장된 엔드포인트를 제공합니다.

Spring Boot Actuator 엔드포인트

Spring Boot Actuator 엔드포인트는 JMX와 HTTP를 통해 노출됩니다. 대부분의 경우 브라우저, CURL 명령, 셸 스크립트 등을 통해 쉽게 접근할 수 있는 HTTP 기반 Actuator 엔드포인트를 사용합니다. 유용한 일부 액추에이터 엔드포인트는 다음과 같습니다:

  1. beans: 이 엔드포인트는 애플리케이션에서 구성된 모든 빈의 목록을 반환합니다.
  2. env: Spring 환경 속성에 대한 정보를 제공합니다.
  3. health: 애플리케이션 상태를 표시합니다.
  4. info: 애플리케이션 정보를 표시합니다. Spring 환경 속성에서 이를 구성할 수 있습니다.
  5. mappings: 모든 @RequestMapping 경로의 목록을 표시합니다.
  6. shutdown: 애플리케이션을 우아하게 종료할 수 있게 합니다.
  7. threaddump: 애플리케이션의 스레드 덤프를 제공합니다.

당신은 여기에서 spring 액추에이터 엔드포인트의 완전한 목록을 얻을 수 있습니다.

Spring Actuator Endpoints Security

“health”와 “info” 엔드포인트만 보안 없이 노출되며, 다른 모든 엔드포인트에 접근하려면 애플리케이션을 스프링 시큐리티로 구성해야 합니다. 이것은 매우 쉽게 달성할 수 있습니다. 튜토리얼의 후반부에서 다룰 것입니다.

Spring Actuator 엔드포인트 활성화

우리의 스프링 부트 프로젝트에 Spring Actuator 종속성을 추가하면 자동으로 액추에이터 엔드포인트가 활성화됩니다. 스프링 애플리케이션에 아래 종속성을 추가하여 스프링 부트 액추에이터 엔드포인트를 활성화하세요.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

이제 애플리케이션을 실행하면 로그에서 액추에이터 엔드포인트가 매핑되는 것을 볼 수 있습니다.

2018-06-19 15:23:20.715  INFO 6493 --- [main] o.s.b.a.e.web.EndpointLinksResolver: Exposing 2 endpoint(s) beneath base path '/actuator'
2018-06-19 15:23:20.723  INFO 6493 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/health],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 15:23:20.724  INFO 6493 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/info],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)

주의하세요. healthinfo 두 개의 엔드포인트만 매핑되었습니다. 아래 이미지는 이러한 액추에이터 엔드포인트의 출력을 보여줍니다. /actuator/info에 데이터가 없다는 것을 주목하셨나요? 그것은 우리가 그것들을 구성하지 않았기 때문입니다. application.properties 파일에 다음 속성을 추가하기만 하면 됩니다.

info.app.name=Spring Actuator Example
info.app.java.version=10
info.app.type=Spring Boot

애플리케이션을 다시 시작하면 다음 출력을 얻게 됩니다.

액추에이터 엔드포인트 기본 경로 사용자 정의

기본적으로 액추에이터 엔드포인트의 기본 경로는 /actuator입니다. 우리는 응용 프로그램 속성 파일에서 management.endpoints.web.base-path를 설정하여 이를 다른 값으로 변경할 수 있습니다.

management.endpoints.web.base-path=/management

다른 액추에이터 엔드포인트 노출

우리는 속성 파일을 통해 다른 액추에이터 엔드포인트를 활성화하거나 비활성화할 수 있습니다. 모든 액추에이터 엔드포인트를 활성화하려면 다음 속성을 추가하십시오.

management.endpoints.web.exposure.include=*

특정 액추에이터 엔드포인트만 활성화하려면 엔드포인트 ID 목록을 제공하십시오.

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

액추에이터 엔드포인트용 스프링 시큐리티

다른 모든 엔드포인트는 적어도 기본 인증이 필요하므로 추가 엔드포인트를 활성화하려면 애플리케이션에 스프링 시큐리티를 추가해야 합니다. 애플리케이션에 다음 종속성을 추가하십시오.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

또한, 애플리케이션 속성 파일에 스프링 시큐리티 사용자 이름과 비밀번호를 추가하십시오.

spring.security.user.name=pankaj
spring.security.user.password=pankaj

애플리케이션을 다시 시작하면 추가적인 엔드포인트가 매핑됩니다.

2018-06-19 16:18:22.211  INFO 6627 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/beans],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 16:18:22.212  INFO 6627 --- [           main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/env],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 16:18:22.212  INFO 6627 --- [           main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/env/{toMatch}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)

이제 보안된 액추에이터 엔드포인트에 액세스하려고 하면 로그인 자격 증명을 제공해야 합니다. 아래 이미지는 beansenv/java.home 엔드포인트의 응답을 보여줍니다.

스프링 액추에이터 사용자 정의 엔드포인트

하나의 Spring Framework의 훌륭한 기능은 확장이 매우 쉽다는 것입니다. 우리는 클래스에 @Endpoint 어노테이션을 사용하여 사용자 정의 액추에이터 엔드포인트를 만들 수 있습니다. 그런 다음 메서드에 @ReadOperation, @WriteOperation, 또는 @DeleteOperation 어노테이션을 사용하여 해당 메서드를 액추에이터 엔드포인트 빈으로 노출해야 합니다. 우리는 @JmxEndpoint@WebEndpoint 어노테이션을 사용하여 기술별 엔드포인트를 만들 수 있습니다. 여기 우리 자체의 사용자 정의 스프링 액추에이터 엔드포인트의 예제가 있습니다.

package com.journaldev.spring;

import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Endpoint(id="myendpoint")
@Component
public class MyCustomEndpoints {

	@ReadOperation
	@Bean
	public String hi() {
		return "Hi from custom endpoint";
	}
}

엔드포인트 ID에 주목했나요? 이것을 활성화할 액추에이터 엔드포인트 목록에 구성해야 합니다. application.properties 파일에서 다음 속성을 업데이트하세요.

management.endpoints.web.exposure.include=health,info,beans,env,myendpoint

이제 애플리케이션을 시작하면 로그에서이 새 엔드포인트가 매핑되었는지 확인하세요.

2018-06-19 17:06:59.743  INFO 6739 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/myendpoint],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)

아래 이미지는 사용자 정의 액추에이터 엔드포인트를 호출할 때의 출력을 보여줍니다.

요약

Spring Boot Actuator는 프로덕션에 적합한 관리 및 정보 모듈입니다. 우리는 손쉽게 확장하여 자체 API를 추가하고 응용 프로그램을 관리할 수 있습니다.

전체 프로젝트를 우리 GitHub 저장소에서 다운로드할 수 있습니다.

Source:
https://www.digitalocean.com/community/tutorials/spring-boot-actuator-endpoints