1. 개요

이 기사에서는 Spring Boot Actuator를 소개합니다. 먼저 기본 사항을 다룬 다음 Spring Boot 2.x 대 1.x에서 사용할 수있는 기능에 대해 자세히 설명합니다.

반응 형 프로그래밍 모델을 활용하여 Spring Boot 2.x 및 WebFlux에서이 모니터링 도구를 사용, 구성 및 확장하는 방법을 배웁니다. 그런 다음 Boot 1.x를 사용하여 동일한 작업을 수행하는 방법에 대해 설명합니다.

Spring Boot Actuator는 첫 번째 Spring Boot 릴리스와 함께 2014 년 4 월부터 사용할 수 있습니다.

Spring Boot 2 출시 와 함께 Actuator가 재 설계되었으며 새롭고 흥미로운 엔드 포인트가 추가되었습니다.

이 가이드는 세 가지 주요 섹션으로 나뉩니다.

2. 액추에이터 란?

본질적으로 Actuator는 생산 준비가 된 기능을 애플리케이션에 제공합니다.

이 의존성으로 인해 앱 모니터링, 메트릭 수집, 트래픽 이해 또는 데이터베이스 상태가 사소 해집니다.

이 라이브러리의 주요 이점은 실제로 이러한 기능을 직접 구현하지 않고도 프로덕션 등급 도구를 얻을 수 있다는 것입니다.

Actuator는 주로 실행중인 애플리케이션에 대한 운영 정보 ( 상태, 메트릭, 정보, 덤프, env 등) 노출 하는 데 사용됩니다 . HTTP 엔드 포인트 또는 JMX 빈을 사용하여 상호 작용할 수 있습니다.

이 의존성이 클래스 경로에 있으면 여러 엔드 포인트를 즉시 사용할 수 있습니다. 대부분의 Spring 모듈과 마찬가지로 다양한 방식으로 쉽게 구성하거나 확장 할 수 있습니다.

2.1. 시작하기

Spring Boot Actuator를 활성화하려면 패키지 관리자에 spring-boot-actuator 의존성을 추가하기 만하면 됩니다.

Maven에서 :

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

버전은 Spring Boot BOM (Bill of Materials)에 지정되어 있으므로 Boot 버전에 관계없이 유효합니다.

3. 스프링 부트 2.x 액추에이터

2.x에서 Actuator는 기본 의도를 유지하지만 모델을 단순화하고 기능을 확장하며 더 나은 기본값을 통합합니다.

첫째,이 버전은 기술에 구애받지 않습니다. 또한 응용 프로그램과 병합하여 Security 모델을 단순화합니다.

다양한 변경 사항 중 일부가 중단된다는 점을 명심하는 것이 중요합니다. 여기에는 HTTP 요청 및 응답과 Java API가 포함됩니다.

마지막으로, 최신 버전은 이제 이전 읽기 / 쓰기 모델과 달리 CRUD 모델을 지원합니다.

3.1. 기술 지원

두 번째 주요 버전으로 Actuator는 이제 기술에 구애받지 않는 반면 1.x에서는 MVC에 연결되어 Servlet API에 연결되었습니다.

2.x에서 Actuator는 MVC에 의존하지 않고 해당 모델을 플러그 가능하고 확장 가능한 것으로 정의합니다.

따라서이 새로운 모델을 통해 MVC와 WebFlux를 기본 웹 기술로 활용할 수 있습니다.

또한 올바른 어댑터를 구현하여 향후 기술을 추가 할 수 있습니다.

마지막으로 JMX는 추가 코드없이 엔드 포인트를 노출하도록 지원됩니다.

3.2. 중요한 변경 사항

이전 버전과 달리 Actuator는 대부분의 엔드 포인트가 비활성화 된 상태로 제공됩니다.

따라서 기본적으로 사용할 수있는 유일한 두 가지는 / health/ info 입니다.

모두 활성화하려면 management.endpoints.web.exposure.include = *를 설정할 수 있습니다. 또는 활성화해야하는 엔드 포인트를 나열 할 수 있습니다.

Actuator는 이제 일반 앱 Security 규칙과 Security 구성을 공유하므로 Security 모델이 크게 단순화됩니다.

따라서 Actuator Security 규칙을 조정하려면 / actuator / ** 항목을 추가하면됩니다 .

@Bean
public SecurityWebFilterChain securityWebFilterChain(
  ServerHttpSecurity http) {
    return http.authorizeExchange()
      .pathMatchers("/actuator/**").permitAll()
      .anyExchange().authenticated()
      .and().build();
}

새로운 Actuator 공식 문서 에서 자세한 내용을 확인할 수 있습니다 .

또한 기본적으로 모든 Actuator 끝점은 이제 / actuator 경로 아래에 배치됩니다 .

이전 버전과 마찬가지로 새 속성 management.endpoints.web.base-path를 사용하여이 경로를 조정할 수 있습니다 .

3.3. 미리 정의 된 끝점

대부분이 이미 1.x에서 사용 가능한 몇 가지 사용 가능한 엔드 포인트를 살펴 보겠습니다.

또한 일부 엔드 포인트가 추가되고 일부는 제거되었으며 일부는 재구성되었습니다 .

  • / auditevents 는 사용자 로그인 / 로그 아웃과 같은 Security 감사 관련 이벤트를 나열합니다. 또한 다른 필드 중에서 주체 또는 유형별로 필터링 할 수 있습니다.
  • / beansBeanFactory 에서 사용 가능한 모든 빈을 반환합니다 . / auditevents 와 달리 필터링을 지원하지 않습니다.
  • / 조건 이전 /로 알려진, 자동 구성은 , 자동 주위 조건에 대한 보고서를 작성합니다.
  • / configprops를 사용하면 모든 @ConfigurationProperties을 가져올 수 있습니다 .
  • / env 는 현재 환경 속성을 반환합니다. 또한 단일 속성을 검색 할 수 있습니다.
  • / flyway 는 Flyway 데이터베이스 마이그레이션에 대한 세부 정보를 제공합니다.
  • / health 는 애플리케이션의 상태를 요약합니다.
  • / heapdump 는 애플리케이션에서 사용하는 JVM에서 힙 덤프를 빌드하고 반환합니다.
  • / info 는 일반 정보를 반환합니다. 사용자 지정 데이터, 빌드 정보 또는 최신 커밋에 대한 세부 정보 일 수 있습니다.
  • / liquibase의 같은 동작합니다 / 이동 경로 하지만 Liquibase합니다.
  • / logfile 은 일반 응용 프로그램 로그를 반환합니다.
  • / loggers를 사용하면 애플리케이션의 로깅 수준을 쿼리하고 수정할 수 있습니다.
  • / metrics 는 우리 응용 프로그램의 메트릭을 자세히 설명합니다. 여기에는 일반 측정 항목과 사용자 지정 측정 항목이 포함될 수 있습니다.
  • / prometheus 는 이전과 같은 메트릭을 반환하지만 Prometheus 서버에서 작동하도록 형식이 지정되었습니다.
  • / scheduledtasks 는 애플리케이션 내의 모든 예약 된 작업에 대한 세부 정보를 제공합니다.
  • / sessions 는 Spring Session을 사용하는 HTTP 세션을 나열합니다.
  • / shutdown 은 응용 프로그램을 정상적으로 종료합니다.
  • / threaddump 는 기본 JVM의 스레드 정보를 덤프합니다.

3.4. 액추에이터 끝점을위한 하이퍼 미디어

Spring Boot는 사용 가능한 모든 액추에이터 엔드 포인트에 대한 링크를 반환하는 검색 엔드 포인트를 추가합니다. 이렇게하면 액추에이터 끝점과 해당 URL을 쉽게 찾을 수 있습니다.

기본적으로이 검색 끝점은 / actuator  끝점을 통해 액세스 할 수 있습니다  .

따라서이 URL에 GET  요청을 보내면  다양한 엔드 포인트에 대한 액추에이터 링크가 반환됩니다.

{
  "_links": {
    "self": {
      "href": "http://localhost:8080/actuator",
      "templated": false
    },
    "features-arg0": {
      "href": "http://localhost:8080/actuator/features/{arg0}",
      "templated": true
    },
    "features": {
      "href": "http://localhost:8080/actuator/features",
      "templated": false
    },
    "beans": {
      "href": "http://localhost:8080/actuator/beans",
      "templated": false
    },
    "caches-cache": {
      "href": "http://localhost:8080/actuator/caches/{cache}",
      "templated": true
    },
    // truncated
}

위에 표시된대로  / actuator 엔드 포인트는 _links  필드 아래에 사용 가능한 모든 액추에이터  엔드 포인트를보고 합니다.

또한 사용자 지정 관리 기본 경로를 구성하는 경우 해당 기본 경로를 검색 URL로 사용해야합니다.

예를 들어 management.endpoints.web.base-path/ mgmt 로  설정 한 경우  링크 List을 보려면 / mgmt  엔드 포인트에 요청을 보내야  합니다.

흥미롭게도 관리 기반 경로가 / 로 설정되면 다른 매핑과의 충돌 가능성을 방지하기 위해 검색 끝 점이 비활성화됩니다.

3.5. 건강 지표

이전 버전과 마찬가지로 사용자 지정 지표를 쉽게 추가 할 수 있습니다. 다른 API와는 반대로 사용자 지정 상태 끝점을 만들기위한 추상화는 변경되지 않습니다. 그러나 새로운 인터페이스 인 ReactiveHealthIndicator 가 추가되어 사후 상태 확인을 구현합니다.

간단한 사용자 지정 반응 상태 확인을 살펴 보겠습니다.

@Component
public class DownstreamServiceHealthIndicator implements ReactiveHealthIndicator {

    @Override
    public Mono<Health> health() {
        return checkDownstreamServiceHealth().onErrorResume(
          ex -> Mono.just(new Health.Builder().down(ex).build())
        );
    }

    private Mono<Health> checkDownstreamServiceHealth() {
        // we could use WebClient to check health reactively
        return Mono.just(new Health.Builder().up().build());
    }
}

상태 표시기의 편리한 기능은 계층 구조의 일부로 집계 할 수 있다는 것입니다.

따라서 이전 예에 따라 모든 다운 스트림 서비스를 다운 스트림 서비스 범주 아래에 그룹화 할 수 있습니다. 이 범주는 모든 중첩 된 서비스 에 도달 할 수있는 한 정상입니다.

보다 심층적 인 내용은 건강 지표에 대한 기사를 확인하십시오 .

3.6. 건강 그룹

Spring Boot 2.2부터는 상태 표시기를 그룹으로 구성하고 모든 그룹 구성원에 동일한 구성을 적용 할 수 있습니다 .

예를 들어, application.properties에 이것을 추가하여 custom  이라는 상태 그룹을 만들 수 있습니다  .

management.endpoint.health.group.custom.include=diskSpace,ping

이렇게하면 사용자 지정  그룹에  diskSpace  및  ping  상태 표시기가 포함됩니다.

이제 / actuator / health  엔드 포인트를 호출 하면 JSON 응답에서 새 상태 그룹에 대해 알려줍니다.

{"status":"UP","groups":["custom"]}

건강 그룹을 사용하면 몇 가지 건강 지표의 집계 결과를 볼 수 있습니다.

이 경우 / actuator / health / custom에 요청을 보내면  다음과 같습니다.

{"status":"UP"}

application.properties 를 통해 더 많은 세부 정보를 표시하도록 그룹을 구성 할 수 있습니다  .

management.endpoint.health.group.custom.show-components=always
management.endpoint.health.group.custom.show-details=always

이제 동일한 요청을 / actuator / health / custom에  보내면 자세한 내용이 표시됩니다.

{
  "status": "UP",
  "components": {
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 499963170816,
        "free": 91300069376,
        "threshold": 10485760
      }
    },
    "ping": {
      "status": "UP"
    }
  }
}

승인 된 사용자에 대해서만 다음 세부 정보를 표시 할 수도 있습니다.

management.endpoint.health.group.custom.show-components=when_authorized
management.endpoint.health.group.custom.show-details=when_authorized

사용자 지정 상태 매핑도 가능합니다.

예를 들어 HTTP 200 OK 응답 대신 207 상태 코드를 반환 할 수 있습니다.

management.endpoint.health.group.custom.status.http-mapping.up=207

여기에서 사용자 지정  그룹 상태가  UP 이면 Spring Boot에 207 HTTP 상태 코드를 반환하도록 지시 합니다.

3.7. Spring Boot 2의 메트릭

Spring Boot 2.0에서는 사내 측정 항목이 Micrometer 지원으로 대체 되었으므로 주요 변경 사항을 예상 할 수 있습니다. 애플리케이션이 GaugeService 또는 CounterService 와 같은 메트릭 서비스를 사용하는 경우 더 이상 사용할 수 없습니다.

대신 Micrometer 와 직접 상호 작용해야 합니다. Spring Boot 2.0에서는 자동 구성된 MeterRegistry 유형의 빈을 얻습니다 .

또한 Micrometer는 이제 Actuator 의존성의 일부이므로 Actuator 의존성이 클래스 경로에있는 한 계속 진행하는 것이 좋습니다.

또한 / metrics 엔드 포인트 에서 완전히 새로운 응답을 받게 됩니다.

{
  "names": [
    "jvm.gc.pause",
    "jvm.buffer.memory.used",
    "jvm.memory.used",
    "jvm.buffer.count",
    // ...
  ]
}

보시다시피 1.x에서 얻은 실제 메트릭이 없습니다.

특정 측정 항목의 실제 값을 얻으려면 이제 원하는 측정 항목 (예 : /actuator/metrics/jvm.gc.pause )으로 이동하여 자세한 응답을 얻을 수 있습니다.

{
  "name": "jvm.gc.pause",
  "measurements": [
    {
      "statistic": "Count",
      "value": 3.0
    },
    {
      "statistic": "TotalTime",
      "value": 7.9E7
    },
    {
      "statistic": "Max",
      "value": 7.9E7
    }
  ],
  "availableTags": [
    {
      "tag": "cause",
      "values": [
        "Metadata GC Threshold",
        "Allocation Failure"
      ]
    },
    {
      "tag": "action",
      "values": [
        "end of minor GC",
        "end of major GC"
      ]
    }
  ]
}

이제 다른 값뿐만 아니라 일부 관련 메타 데이터도 포함하여 메트릭이 훨씬 더 철저합니다.

3.8. / info 끝점 사용자 지정

/ 정보 엔드 포인트는 변경되지 않습니다. 이전과 마찬가지로 각각의 Maven 또는 Gradle 의존성을 사용하여 git 세부 정보를 추가 할 수 있습니다 .

<dependency>
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
</dependency>

마찬가지로 Maven 또는 Gradle 플러그인을 사용하여 이름, 그룹 및 버전을 포함한 빌드 정보를 포함 할 수도 있습니다 .

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>build-info</goal>
            </goals>
        </execution>
    </executions>
</plugin>

3.9. 사용자 지정 끝점 생성

이전에 지적했듯이 사용자 지정 끝점을 만들 수 있습니다. 그러나 Spring Boot 2는 새로운 기술에 구애받지 않는 패러다임을 지원하기 위해이를 달성하는 방법을 재 설계했습니다.

애플리케이션에서 기능 플래그를 쿼리, 활성화 및 비활성화 할 액추에이터 엔드 포인트를 만들어 보겠습니다 .

@Component
@Endpoint(id = "features")
public class FeaturesEndpoint {

    private Map<String, Feature> features = new ConcurrentHashMap<>();

    @ReadOperation
    public Map<String, Feature> features() {
        return features;
    }

    @ReadOperation
    public Feature feature(@Selector String name) {
        return features.get(name);
    }

    @WriteOperation
    public void configureFeature(@Selector String name, Feature feature) {
        features.put(name, feature);
    }

    @DeleteOperation
    public void deleteFeature(@Selector String name) {
        features.remove(name);
    }

    public static class Feature {
        private Boolean enabled;

        // [...] getters and setters 
    }

}

엔드 포인트를 얻으려면 빈이 필요합니다. 이 예에서는이를 위해 @Component 를 사용합니다. 또한이 빈을 @Endpoint 로 장식해야합니다 .

엔드 포인트의 경로는 @Endpointid 매개 변수에 의해 결정됩니다 . 우리의 경우 요청을 / actuator / features로 라우팅합니다 .

준비가되면 다음을 사용하여 작업 정의를 시작할 수 있습니다.

  • @ReadOperation : HTTP GET에 매핑됩니다 .
  • @WriteOperation : HTTP POST에 매핑됩니다 .
  • @DeleteOperation : HTTP DELETE에 매핑됩니다 .

애플리케이션에서 이전 엔드 포인트로 애플리케이션을 실행하면 Spring Boot가이를 등록합니다.

이를 확인하는 빠른 방법은 로그를 확인하는 것입니다.

[...].WebFluxEndpointHandlerMapping: Mapped "{[/actuator/features/{name}],
  methods=[GET],
  produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}"
[...].WebFluxEndpointHandlerMapping : Mapped "{[/actuator/features],
  methods=[GET],
  produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}"
[...].WebFluxEndpointHandlerMapping : Mapped "{[/actuator/features/{name}],
  methods=[POST],
  consumes=[application/vnd.spring-boot.actuator.v2+json || application/json]}"
[...].WebFluxEndpointHandlerMapping : Mapped "{[/actuator/features/{name}],
  methods=[DELETE]}"[...]

이전 로그에서 WebFlux가 새 엔드 포인트를 어떻게 노출하는지 확인할 수 있습니다. MVC로 전환하면 코드를 변경하지 않고도 해당 기술을 위임 할 수 있습니다.

또한이 새로운 접근 방식에서 염두에 두어야 할 몇 가지 중요한 고려 사항이 있습니다.

  • MVC에는 의존성이 없습니다.
  • 이전에 메서드로 존재했던 모든 메타 데이터 ( 민감, 활성화…) 가 더 이상 존재하지 않습니다. 그러나 @Endpoint (id = "features", enableByDefault = false)를 사용하여 엔드 포인트를 활성화하거나 비활성화 할 수 있습니다 .
  • 1.x와는 달리 주어진 인터페이스를 더 이상 확장 할 필요가 없습니다.
  • 이전 읽기 / 쓰기 모델과 달리 이제 @DeleteOperation을 사용하여 DELETE 작업을 정의 할 수 있습니다 .

3.10. 기존 끝점 확장

애플리케이션의 프로덕션 인스턴스가 SNAPSHOT 버전 이 아닌지 확인하고 싶다고 가정 해 보겠습니다 .

이 정보를 반환하는 Actuator 끝점의 HTTP 상태 코드 (예 : / info) 를 변경하여이를 수행하기로 결정합니다 . 우리 앱이 SNAPSHOT 인 경우 다른 HTTP 상태 코드를 받게 됩니다.

@EndpointExtension 어노테이션 또는보다 구체적인 전문화 @EndpointWebExtension 또는 @EndpointJmxExtension을 사용하여 미리 정의 된 끝점의 동작을 쉽게 확장 할 수 있습니다 .

@Component
@EndpointWebExtension(endpoint = InfoEndpoint.class)
public class InfoWebEndpointExtension {

    private InfoEndpoint delegate;

    // standard constructor

    @ReadOperation
    public WebEndpointResponse<Map> info() {
        Map<String, Object> info = this.delegate.info();
        Integer status = getStatus(info);
        return new WebEndpointResponse<>(info, status);
    }

    private Integer getStatus(Map<String, Object> info) {
        // return 5xx if this is a snapshot
        return 200;
    }
}

3.11. 모든 끝점 활성화

HTTP를 사용하여 액추에이터 엔드 포인트에 액세스하려면이를 활성화하고 노출해야합니다.

기본적으로 / shutdown을 제외한 모든 끝 점이 활성화됩니다. / 건강/ 정보 엔드 포인트는 기본적으로 노출되어있다.

모든 엔드 포인트를 노출하려면 다음 구성을 추가해야합니다.

management.endpoints.web.exposure.include=*

특정 엔드 포인트 (예 : / shutdown)  를 명시 적으로 활성화하려면 다음을 사용합니다.

management.endpoint.shutdown.enabled=true

하나 (예 : / loggers )를 제외한 모든 활성화 된 엔드 포인트를 노출하려면 다음을 사용합니다.

management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=loggers

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

1.x에서 Actuator는 읽기 / 쓰기 모델을 따릅니다. 즉, 읽기 / 쓰기가 가능합니다.

예를 들어, 메트릭 또는 애플리케이션의 상태를 검색 할 수 있습니다. 또는 앱을 정상적으로 종료하거나 로깅 구성을 변경할 수 있습니다.

작동하기 위해 Actuator는 HTTP를 통해 엔드 포인트를 노출하기 위해 Spring MVC가 필요합니다. 다른 기술은 지원되지 않습니다.

4.1. 끝점

1.x에서 Actuator는 자체 Security 모델을 제공합니다. Spring Security 구조를 활용하지만 나머지 애플리케이션과 독립적으로 구성해야합니다.

또한 대부분의 엔드 포인트는 민감합니다. 즉, 완전히 공개되지 않거나 대부분의 정보가 생략됩니다. 반면에 / info 와 같이 일부는 그렇지 않습니다 .

다음은 Boot가 바로 사용할 수있는 가장 일반적인 엔드 포인트입니다.

  • / health 는 응용 프로그램 상태 정보 (  인증되지 않은 연결을 통해 액세스 할 때 간단한 상태 , 인증 된 경우 전체 메시지 세부 정보)를 표시합니다. 기본적으로는 민감하지 않습니다.
  • / info 는 랜덤의 응용 프로그램 정보를 표시합니다. 기본적으로는 민감하지 않습니다.
  • / metrics 는 현재 응용 프로그램에 대한 메트릭 정보를 표시합니다. 기본적으로 민감합니다.
  • / trace 는 추적 정보를 표시합니다 (기본적으로 최근 몇 개의 HTTP 요청).

공식 문서에서 기존 엔드 포인트의 전체 List을 찾을 수 있습니다 .

4.2. 기존 끝점 구성

endpoints. [endpoint name]. [property to customize] 형식을 사용하여 속성으로 각 엔드 포인트를 사용자 지정할 수 있습니다 .

세 가지 속성을 사용할 수 있습니다.

  • id : HTTP를 통해이 엔드 포인트에 액세스하는 방법
  • enabled : true이면 액세스 할 수 있습니다. 그렇지 않으면
  • sensitive : true 인 경우 HTTP를 통해 중요한 정보를 표시하려면 권한이 필요합니다.

예를 들어 다음 속성을 추가하면 / beans 엔드 포인트 가 사용자 정의 됩니다 .

endpoints.beans.id=springbeans
endpoints.beans.sensitive=false
endpoints.beans.enabled=true

4.3. / health 끝점

/ 건강 엔드 포인트는 실행중인 응용 프로그램의 건강 상태를 확인하는 데 사용됩니다.

일반적으로 실행중인 인스턴스가 다운되거나 DB와의 연결 문제, 디스크 공간 부족 등과 같은 다른 이유로 인해 비정상 상태가되는 경우 소프트웨어를 모니터링하여 경고합니다.

기본적으로 권한이없는 사용자는 HTTP를 통해 액세스 할 때만 상태 정보를 볼 수 있습니다.

{
    "status" : "UP"
}

이 건강 정보는 애플리케이션 컨텍스트에 구성된 HealthIndicator 인터페이스를 구현하는 모든 Bean에서 수집됩니다 .

HealthIndicator반환하는 일부 정보는 본질적으로 민감하지만 endpoints.health.sensitive = false구성 하여 디스크 공간, 메시징 브로커 연결, 사용자 지정 검사 등과 같은 더 자세한 정보를 노출 할 수 있습니다 .

이것은 1.5.0 미만의 Spring Boot 버전에서만 작동합니다. 1.5.0 이상 버전의 경우 무단 액세스에 대해 management.security.enabled = false설정하여 Security을 비활성화해야 합니다.

또한 애플리케이션에 특정한 모든 유형의 사용자 지정 상태 데이터를 수집하고 / health 엔드 포인트를 통해 자동으로 노출 할 수있는 자체 사용자 지정 상태 표시기를 구현할 수 있습니다 .

@Component("myHealthCheck")
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;
    }
}

출력 결과는 다음과 같습니다.

{
    "status" : "DOWN",
    "myHealthCheck" : {
        "status" : "DOWN",
        "Error Code" : 1
     },
     "diskSpace" : {
         "status" : "UP",
         "free" : 209047318528,
         "threshold" : 10485760
     }
}

4.4. / info 끝점

/ info 엔드 포인트에 표시되는 데이터를 사용자 지정할 수도 있습니다 .

info.app.name=Spring Sample Application
info.app.description=This is my first spring boot application
info.app.version=1.0.0

그리고 샘플 출력 :

{
    "app" : {
        "version" : "1.0.0",
        "description" : "This is my first spring boot application",
        "name" : "Spring Sample Application"
    }
}

4.5. / metrics 끝점

메트릭 엔드 포인트는 OS 및 JVM에 대한 정보와 애플리케이션 수준 메트릭을 게시합니다. 활성화되면 일부 HTTP 메트릭과 함께 메모리, 힙, 프로세서, 스레드,로드 된 클래스, 언로드 된 클래스 및 스레드 풀과 같은 정보를 얻습니다.

이 엔드 포인트의 출력은 다음과 같습니다.

{
    "mem" : 193024,
    "mem.free" : 87693,
    "processors" : 4,
    "instance.uptime" : 305027,
    "uptime" : 307077,
    "systemload.average" : 0.11,
    "heap.committed" : 193024,
    "heap.init" : 124928,
    "heap.used" : 105330,
    "heap" : 1764352,
    "threads.peak" : 22,
    "threads.daemon" : 19,
    "threads" : 22,
    "classes" : 5819,
    "classes.loaded" : 5819,
    "classes.unloaded" : 0,
    "gc.ps_scavenge.count" : 7,
    "gc.ps_scavenge.time" : 54,
    "gc.ps_marksweep.count" : 1,
    "gc.ps_marksweep.time" : 44,
    "httpsessions.max" : -1,
    "httpsessions.active" : 0,
    "counter.status.200.root" : 1,
    "gauge.response.root" : 37.0
}

사용자 지정 메트릭을 수집하기 위해 게이지 (데이터의 단일 값 스냅 샷) 및 카운터 (예 : 메트릭 증가 / 감소)에 대한 지원이 있습니다.

/ metrics 엔드 포인트에 자체 사용자 지정 메트릭을 구현해 보겠습니다 .

성공 및 실패한 로그인 시도를 기록하도록 로그인 흐름을 사용자 정의합니다.

@Service
public class LoginServiceImpl {

    private final CounterService counterService;
    
    public LoginServiceImpl(CounterService counterService) {
        this.counterService = counterService;
    }
	
    public boolean login(String userName, char[] password) {
        boolean success;
        if (userName.equals("admin") && "secret".toCharArray().equals(password)) {
            counterService.increment("counter.login.success");
            success = true;
        }
        else {
            counterService.increment("counter.login.failure");
            success = false;
        }
        return success;
    }
}

Here's what the output might look like:

{
    ...
    "counter.login.success" : 105,
    "counter.login.failure" : 12,
    ...
}

Note that login attempts and other security-related events are available out of the box in Actuator as audit events.

4.6. Creating a New Endpoint

In addition to using the existing endpoints provided by Spring Boot, we can also create an entirely new one.

First, we need to have the new endpoint implement the Endpoint<T> interface:

@Component
public class CustomEndpoint implements Endpoint<List<String>> {
    
    @Override
    public String getId() {
        return "customEndpoint";
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    @Override
    public boolean isSensitive() {
        return true;
    }

    @Override
    public List<String> invoke() {
        // Custom logic to build the output
        List<String> messages = new ArrayList<String>();
        messages.add("This is message 1");
        messages.add("This is message 2");
        return messages;
    }
}

In order to access this new endpoint, its id is used to map it. In other words we could exercise it hitting /customEndpoint.

Output:

[ "This is message 1", "This is message 2" ]

4.7. Further Customization

For security purposes, we might choose to expose the actuator endpoints over a non-standard port — the management.port property can easily be used to configure that.

Also, as we already mentioned, in 1.x. Actuator configures its own security model based on Spring Security but independent from the rest of the application.

Hence, we can change the management.address property to restrict where the endpoints can be accessed from over the network:

#port used to expose actuator
management.port=8081 

#CIDR allowed to hit actuator
management.address=127.0.0.1 

#Whether security should be enabled or disabled altogether
management.security.enabled=false

Besides, all the built-in endpoints except /info are sensitive by default.

If the application is using Spring Security, we can secure these endpoints by defining the default security properties (username, password, and role) in the application.properties file:

security.user.name=admin
security.user.password=secret
management.security.role=SUPERUSER

5. Conclusion

In this article, we talked about Spring Boot Actuator. We began by defining what Actuator means and what it does for us.

Next, we focused on Actuator for the current Spring Boot version 2.x, discussing how to use it, tweak it, and extend it. We also talked about the important security changes that we can find in this new iteration. We discussed some popular endpoints and how they have changed as well.

Then we discussed Actuator in the earlier Spring Boot 1 version.

Lastly, we demonstrated how to customize and extend Actuator.

As always, the code used in this article can be found over on GitHub for both Spring Boot 2.x and Spring Boot 1.x.