programing

스프링 부트 상태에 커스텀 상태 체크를 추가하는 방법

golfzon 2023. 4. 4. 22:39
반응형

스프링 부트 상태에 커스텀 상태 체크를 추가하는 방법

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

이렇게 하면 응용 프로그램에 몇 가지 유용한 엔드포인트가 추가됩니다.그 중 하나가 /health입니다.애플리케이션을 시작하고 /health 엔드포인트로 이동하면 이미 일부 데이터가 반환되는 것을 볼 수 있습니다.

{
    "status":"UP",
    "diskSpace": {
        "status":"UP",
        "free":56443746,
        "threshold":1345660
    }
}

스프링 부트 상태에 커스텀 상태 체크를 추가하는 방법

커스텀 헬스체크를 쉽게 추가할 수 있습니다.새로운 Java 클래스를 만들고 AbstractHealthIndicator에서 확장하여 doHealthCheck 메서드를 구현하기만 하면 됩니다.메서드는 몇 가지 유용한 메서드와 함께 전달된 빌더를 가져옵니다.상태가 정상이면 builder.up()을 호출하고 정상이면 builder.down()을 호출합니다.건강을 체크하기 위해 무엇을 할지는 전적으로 당신에게 달려 있습니다.서버에 ping을 하거나 파일을 체크하고 싶은 경우가 있습니다.

@Component
public class CustomHealthCheck extends AbstractHealthIndicator {
    @Override
    protected void doHealthCheck(Health.Builder bldr) throws Exception {
        // TODO implement some check
        boolean running = true;
        if (running) {
          bldr.up();
        } else {
          bldr.down();
        }
    }
}

이는 새로운 헬스체크를 활성화하기에 충분합니다(@ComponentScan이 어플리케이션에 있는지 확인합니다).응용 프로그램을 다시 시작하고 브라우저를 /health 끝점으로 이동하면 새로 추가된 상태 점검이 표시됩니다.

{
    "status":"UP",
    "CustomHealthCheck": {
        "status":"UP"
    },
    "diskSpace": {
        "status":"UP",
        "free":56443746,
        "threshold":1345660
    }
}

Spring Boot 2 이후x

@yuranos87에서 설명한 바와 같이 Spring Boot 2.X에서는 액튜에이터의 개념이 변경되었지만 구현으로 커스텀 헬스체크를 쉽게 추가할 수 있습니다.HealthIndicator또는 사후 대응 어플리케이션의 경우ReactiveHealthIndicator:

@Component
public class CacheHealthIndicator implements HealthIndicator {

@Override
public Health health() {
    long result = checkSomething();
    if (result <= 0) {
        return Health.down().withDetail("Something Result", result).build();
    }
    return Health.up().build();      
  }
}

또는

@Component
public class CacheHealthIndicator implements ReactiveHealthIndicator {

@Override
public Mono<Health> health() {
    return Mono.fromCallable(() -> checkSomething())
        .map(result -> {
            if (result <= 0) {
                return Health.down().withDetail("Something Result", result).build();
            }
            return Health.up().build();
        });
   }
}

또한 다음을 사용하여 엔드포인트를 추가하거나 확장할 수 있습니다.@Endpoint또는@EndpointWebExtension. 여기서 엔드포인트는info,health더 많이요.따라서 를 사용하여 커스텀헬스 체크를 추가할 수 있습니다.@Endpoint하지만 더 쉽게 할 수 있습니다.HealthIndicator.

사용자 지정 상태 점검 및 사용자 지정 끝점에 대한 자세한 내용은 스프링 부팅 설명서를 참조하십시오.

애플리케이션 속성을 설정하는 것을 잊지 말아 주세요.설정하지 않으면 고객 상태 표시기가 표시되지 않습니다.

management.endpoint.health.show-details=always

스프링 부트 2X가 액튜에이터를 대폭 변경했습니다.기존 엔드포인트를 확장하기 위한 보다 우수한 새로운 메커니즘은@EndpointWebExtension.

즉, 헬스 엔드 포인트는 액튜에이터 자체에 의해 바로 사용할 수 있기 때문에 확장하기가 좀 까다롭습니다.beans 초기화 프로세스를 조작하지 않으면 어플리케이션은 2개의 내선번호가 표시되며 어느 것을 선택해야 할지 알 수 없기 때문에 기동할 수 없습니다.보다 쉬운 방법은 정보를 사용하여 확장하는 것입니다.

@Component
@EndpointWebExtension(endpoint = InfoEndpoint.class)
public class InfoWebEndpointExtension {
   @Value("${info.build.version}")
   private String versionNumber;
   @Value("${git.commit.id}")
   private String gitCommit;
   @Value("${info.build.name}")
   private String applicationName;
   ...
   @ReadOperation
   public WebEndpointResponse<Map> info() {

URL도 다시 매핑할 수 있습니다.내 경우 /health보다 /status를 선호하며 /actuator/를 경로에 넣고 싶지 않습니다.

management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.info=status

가 /info를 선호하는 또 다른 이유는 /health의 기본값인 다음과 같은 중첩 구조를 얻지 못하기 때문입니다.

{
"status": {
    "status": "ON",

언급URL : https://stackoverflow.com/questions/44849568/how-to-add-a-custom-health-check-in-spring-boot-health

반응형