[번역] 스프링 부트 액추에이터

in spring-boot •  3 years ago 

https://www.baeldung.com/spring-boot-actuators/를 번역함.



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가 재설계되었으며 새롭고 흥미로운 엔드포인트가 추가되었습니다.

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

추가 읽기:

Spring Boot 웹 애플리케이션 구성

Spring Boot 애플리케이션에 대한 몇 가지 더 유용한 구성.더 읽기 →

스프링 부트로 커스텀 스타터 만들기

맞춤형 Spring Boot 스타터 생성에 대한 빠르고 실용적인 가이드입니다.더 읽기 →

스프링 부트에서 테스트

단위 테스트를 효율적으로 작성하기 위해 Spring Boot가 테스트를 지원하는 방법에 대해 알아보세요.더 읽기 →

2. 액추에이터란?

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

이 종속성으로 인해 앱 모니터링, 메트릭 수집, 트래픽 이해 또는 데이터베이스 상태가 간단해집니다.

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

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

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

2.1. 시작하기

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

메이븐에서:

<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는 기본 의도를 유지하지만 모델을 단순화하고 기능을 확장하며 더 나은 기본값을 통합합니다.

첫째, 이 버전은 기술에 구애받지 않습니다. 또한 애플리케이션 모델과 병합하여 보안 모델을 단순화합니다.

다양한 변경 사항 중 일부는 중단된다는 점을 염두에 두는 것이 중요합니다. 여기에는 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는 이제 보안 구성을 일반 앱 보안 규칙과 공유하므로 보안 모델이 크게 간소화됩니다.

따라서 Actuator 보안 규칙을 조정하려면 /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 는 사용자 로그인/로그아웃과 같은 보안 감사 관련 이벤트를 나열합니다. 또한 다른 필드 중에서 기본 또는 유형별로 필터링할 수 있습니다.
  • /beans 는 BeanFactory 에서 사용 가능한 모든 빈을 반환합니다 . /audievents 와 달리 필터링을 지원하지 않습니다.
  • /conditions (이전에는 / autoconfig 로 알려짐)는 자동 구성 과 관련된 조건 보고서를 작성합니다.
  • /configprops를 사용하면 모든 @ConfigurationProperties 빈 을 가져올 수 있습니다 .
  • /env 는 현재 환경 속성을 반환합니다. 또한 단일 속성을 검색할 수 있습니다.
  • /flyway 는 Flyway 데이터베이스 마이그레이션에 대한 세부 정보를 제공합니다.
  • /health 는 애플리케이션의 상태를 요약합니다.
  • /heapdump 는 애플리케이션에서 사용하는 JVM에서 힙 덤프를 빌드하고 반환합니다.
  • /info 는 일반 정보를 반환합니다. 사용자 지정 데이터, 빌드 정보 또는 최신 커밋에 대한 세부 정보일 수 있습니다.
  • / liquibase의 같은 동작합니다 / 이동 경로 하지만 Liquibase합니다.
  • /logfile 은 일반 애플리케이션 로그를 반환합니다.
  • /logger를 사용하면 애플리케이션의 로깅 수준을 쿼리하고 수정할 수 있습니다.
  • /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 로  설정하면  링크 목록을 보기 위해 /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. 스프링 부트 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는 새로운 기술 불가지론적 패러다임을 지원하기 위해 이를 달성하는 방법을 재설계했습니다.

애플리케이션에서 기능 플래그를 쿼리, 활성화 및 비활성화하는 Actuator 끝점을 만들어 보겠습니다 .

@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 로 장식해야 합니다 .

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

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

애플리케이션에서 이전 엔드포인트로 애플리케이션을 실행하면 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에서 읽거나 쓸 수 있습니다.

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

작동시키려면 Actuator는 Spring MVC가 HTTP를 통해 엔드포인트를 노출해야 합니다. 다른 기술은 지원되지 않습니다.

4.1. 끝점

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

또한 대부분의 끝점은 민감합니다. 즉, 완전히 공개되지 않거나 대부분의 정보가 생략됩니다. 반면 /info 와 같이 소수는 아닙니다 .

다음은 Boot가 기본적으로 제공하는 가장 일반적인 엔드포인트 중 일부입니다.

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

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

4.2. 기존 엔드포인트 구성

endpoints.[endpoint name].[사용자 정의할 속성] 형식을 사용하여 속성으로 각 끝점을 사용자 정의할 수 있습니다 .

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

  • 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 인터페이스를 구현하는 모든 빈에서 수집됩니다 .

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

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

또한 애플리케이션과 관련된 모든 유형의 사용자 지정 상태 데이터를 수집하고 /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;
}
}

출력은 다음과 같습니다.

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

로그인 시도 및 기타 보안 관련 이벤트는 감사 이벤트로 Actuator에서 즉시 사용할 수 있습니다.

4.6. 새 엔드포인트 생성

Spring Boot에서 제공하는 기존 끝점을 사용하는 것 외에도 완전히 새로운 끝점을 만들 수도 있습니다.

먼저 새 엔드포인트가 Endpoint<T> 인터페이스를 구현하도록 해야 합니다 .

@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;
}
}

이 새 끝점에 액세스하기 위해 해당 ID 를 사용하여 매핑합니다. 다시 말해서 /customEndpoint 를 치면서 실행할 수 있습니다.

산출:

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

4.7. 추가 사용자 정의

보안을 위해 비표준 포트를 통해 액추에이터 끝점을 노출하도록 선택할 수 있습니다. management.port 속성을 사용하여 쉽게 구성할 수 있습니다.

또한 이미 언급했듯이 1.x에서. Actuator는 Spring Security를 ​​기반으로 하지만 나머지 애플리케이션과는 독립적인 자체 보안 모델을 구성합니다.

따라서 management.address 속성을 변경 하여 네트워크를 통해 엔드포인트에 액세스할 수 있는 위치를 제한할 수 있습니다.

#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

게다가 /info를 제외한 모든 내장 엔드포인트 는 기본적으로 민감합니다.

애플리케이션이 Spring Security를 ​​사용하는 경우 application.properties 파일 에서 기본 보안 속성(사용자 이름, 비밀번호 및 역할)을 정의하여 이러한 엔드포인트를 보호할 수 있습니다 .

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

5. 결론

이 기사에서는 Spring Boot Actuator에 대해 이야기했습니다. 우리는 Actuator가 의미하는 것과 그것이 우리에게 무엇을 하는지 정의하는 것으로 시작했습니다.

다음으로, 우리는 현재 Spring Boot 버전 2.x용 Actuator에 초점을 맞추어 사용 방법, 수정 및 확장 방법에 대해 논의했습니다. 또한 이 새로운 반복에서 찾을 수 있는 중요한 보안 변경 사항에 대해서도 이야기했습니다. 우리는 몇 가지 인기 있는 엔드포인트와 이러한 엔드포인트가 어떻게 변경되었는지에 대해 논의했습니다.

그런 다음 이전 Spring Boot 1 버전에서 Actuator에 대해 논의했습니다.

마지막으로 Actuator를 커스터마이징하고 확장하는 방법을 시연했습니다.

항상 그렇듯이 이 기사에 사용된 코드는 Spring Boot 2.x 및 Spring Boot 1.x 용 GitHub에서 찾을 수 있습니다 .



Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!