Actuator
Spring Boot 에서는 Spring Boot Actuator라는 자체 모니터링 툴을 제공한다.
웹 상태 모니터링과 metric, taffic 정보, database 상태 등을 알 수 있다.
1. 엔드 포인트 종류 (EndPoints List)
actuator에서 제공하는 모니터링을 많다. 그 중 유용하게 쓰일 것 같은 모니터링 요소만 간단하게 살펴보자.
ID | Description |
beans | application의 전체 Spring beans를 출력 |
caches | 사용가능한 cache를 노출 |
conditions | configuration 또는 auto-configuration 되는 class들의 성공 여부와 이유를 설명 |
env | Spring Boot의 현재 환경설정 정보(application.yml의 정보 등)를 출력 |
health | application의 현재 상태를 보여줍니다. |
httptrace | http를 trace한 정보를 노출(기본적으로 최신 100건의 reqest-response를 보여줍니다.) |
mappings | Request와 mapping되어있는 handler 정보를 가져옵니다. |
sessions | Spring Session이 가지고 있는 정보를 가져옵니다. |
threaddump | threaddump를 가져옴 |
logfile | log를 가져옵니다. |
metrics | metrics 정보를 노출합니다. |
더 많은 엔드 포인트 종류를 원한다면 : https://docs.spring.io/spring-boot/docs/2.1.8.RELEASE/reference/html/production-ready-endpoints.html#production-ready-endpoints-enabling-endpoints
참고자료 : http://forward.nhnent.com/hands-on-labs/java.spring-boot-actuator/04-endpoint.html
actuator에서 제공하는 List는 민감한 정보들이 포함되어 있다. 그래서 보안에 신경을 써야한다. Role을 설정하여 특정 사용자만 접근하는 식으로 말이다.
actuator 정보는 메모리에 저장된다. 실제 운영에서 잘 사용하기 의해서는 영구 저장소에 저장해야 한다. 그래서 영구히 정보를 저장하기 위해서 DB나 file 등에 저장하는게 좋다.
2. 사용방법 (사전 준비)
📌 build.gradle
implementation 'org.springframework.boot:spring-boot-starter-actuator:2.6.7'
@Bean
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier, ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier, EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties, WebEndpointProperties webEndpointProperties, Environment environment) {
List<ExposableEndpoint<?>> allEndpoints = new ArrayList();
Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
allEndpoints.addAll(webEndpoints);
allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
String basePath = webEndpointProperties.getBasePath();
EndpointMapping endpointMapping = new EndpointMapping(basePath);
boolean shouldRegisterLinksMapping = this.shouldRegisterLinksMapping(webEndpointProperties, environment, basePath);
return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes, corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath), shouldRegisterLinksMapping, null);
}
private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties, Environment environment, String basePath) {
return webEndpointProperties.getDiscovery().isEnabled() && (StringUtils.hasText(basePath) || ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
}
WebMvcEndpointHandlerMapping을 빈 등록 해야한다.
actuator 기본 url : http://localhost:8080/actuator
📌 application yml
management:
endpoints:
web:
exposure:
include: "*"
exclude:
- "bean"
- "dev"
base-path: "/secure/actuator"
스프링 부트에서는 yml 설정으로 EndPoint를 제어할 수 있다.
'include'는 엔드 포인트를 포함하겠다는 의미다. 'exclude'는 배제하겠다는 의미다.
include 값을 "*" 으로 하면 모든 엔드포인트를 사용하겠다는 의미다. 특정 엔트 포인트만 사용하고 싶다면 'env', 'bean' 처럼 쓰고 싶은 엔드 포인트를 include 값으로 명시하면 된다.
기본 url인 http://localhost:8080/actuator을 그대로 쓰면 정보 유출 위험이 있으므로 management.endpoints.web.base-path를 이용하여 임의의 경로로 바꿔준다.
3. 사용법
🔍 /health EndPoint
애플리케이션의 상태 정보를 표시한다. 필수적으로 사용하는 엔드포인트다.
기본 값은 DB Connection 이슈와 Disk space of lack의 따라 정보를 알려준다.
그리고 custom하게 health 정보를 줄 수 있다.
💡 heathcheck 커스텀 방법 1
📌 HealthCheck
@Component
public class HealthCheck implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0){
return Health.down()
.withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
public int check() {
// our logic to check health
return '0';
}
}
HealthIndicator 안터페이스를 상속받아서 위에 check 부분에 로직을 추가함으로써 custom하게 health check를 설정할 수 있다. 예를 들어 관련된 DB나 cassandra, redis 부분 체크도 넣으면 해당 부분도 health chekc가 되니 가장 자주 쓰일 수 있다.
💡 heathcheck 커스텀 방법 2
@Component
public class ApplicationHealthIndicator implements HealthIndicator {
private final AtomicReference<Health> healthRefer = new AtomicReference<>(Health.down().build());
@Override
public Health health() {
return healthRefer.get();
}
public void setHealth(Health health) {
this.healthRefer.set(health);
}
}
📌 컨트롤러
@Slf4j
@RestController
@RequestMapping(path = "/health")
@RequiredArgsConstructor
public class L7CheckApi {
private final ApplicationHealthIndicator healthIndicator;
@PutMapping(path = "/up")
public void up() {
final Health up = Health.up().build();
healthIndicator.setHealth(up);
}
@PutMapping(path = "/down")
public void down() {
final Health down = Health.down().build();
healthIndicator.setHealth(down);
}
}
put /health/up : 상태를 up으로 변경한다.
put /health/down : 상태를 down으로 변경한다.
🔍 /info
properties에 입력하면 버전 정보와 내용들을 info로 보여줄 수 있다.
참고자료 : https://www.baeldung.com/spring-boot-info-actuator-custom
📌 application.yml
info:
app:
name: Spring Sample Application
description : This is my first spring boot application
version: 1.0.0
{
"app": {
"description": "This is my first spring boot application",
"version": "1.0.0",
"name": "Spring Sample Application"
}
}
🔍 /metrics
OS에 관련된 정보와 JVM과 application level의 metric 정보를 볼 수 있다.
memory, heap, processors, threads, class loaded, classes unloaded, thread pools 등등
4. 보안
actuator의 정보들은 공개되면 안되므로 security로 막는것이 좋다.
📌 build.gradle
compile 'org.springframework.boot:spring-boot-starter-security'
📌 시큐리티 설정 추가
@Configuration
@AllArgsConstructor
public class SecuritySecureConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(UrlConstants.SECURE + "/**").authenticated()
.anyRequest().permitAll()
.and()
.httpBasic()
.and()
.csrf().disable();
}
}
📌 application.yml
spring:
security:
user:
name: {{usrename}}
password: {{password}}
👀 참고 자료
https://blog.naver.com/PostView.nhn?blogId=dg110&logNo=221363263124
https://sabarada.tistory.com/23
https://cheese10yun.github.io/spring-actuator/
https://jinn-blog.tistory.com/73
https://truehong.tistory.com/124
http://forward.nhnent.com/hands-on-labs/java.spring-boot-actuator/04-endpoint.html
'[ Spring ] > REST API' 카테고리의 다른 글
[Spring] Spring Security를 이용한 인증 처리 (0) | 2022.05.11 |
---|---|
[Spring] HAL Explorer를 이용한 Hateoas 기능 구현 (0) | 2022.05.11 |
[Spring] Rest API Documentation을 위한 Swagger 사용 (0) | 2022.05.10 |
[Spring] API 구현을 위한 Hateoas 적용 (0) | 2022.05.10 |
[Spring] Rest Api Version 관리 (0) | 2022.05.10 |