Actuactor 는 L7 체크 또는 애플리케이션 Health 체크에 도움이 되는 Spring Boot 자원이다.
1. 단순 Actuactor 예제
pom.xml 추가
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
소스 추가
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class HealthChecker implements HealthIndicator {
@Override
public Health health() {
boolean isOk = check();
if (!isOk) {
return Health.down().withDetail("Error Code", 10000).build();
}
return Health.up().build();
}
public boolean check() {
return true;
}
}
성공시(check() 리턴이 true) 결과 리턴 값
{"status": "UP"}
그리고, curl로 확인하면 다음과 같다.
$ calhost:8080/health
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Application-Context: application
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Tue, 26 May 2015 15:18:38 GMT
{"status":"UP"}
실패시(check() 리턴이 false) 결과 리턴값
{
"status": "DOWN"}그리고, curl로 확인하면 다음과 같다.
$ curl -i http://localhost:8080/health
HTTP/1.1 503 Service Unavailable
Server: Apache-Coyote/1.1
X-Application-Context: application
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Tue, 26 May 2015 15:18:15 GMT
Connection: close
{"status":"DOWN"}
2. 응답 상태 코드 변경 (response header)
application.properties 에 추가하면 health check 실패시 500 에러 발생한다.
endpoints.health.mapping.DOWN: INTERNAL_SERVER_ERROR
curl 요청
$ curalhost:8080/health
HTTP/1.1 500 Internal Server Error
Server: Apache-Coyote/1.1
X-Application-Context: application
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Tue, 26 May 2015 15:23:45 GMT
Connection: close
{"status":"DOWN"}
endpoints.health.mapping.DOWN의 값에 아무거나 넣을 수 없다. Spring의 HttpStatus 상수 값을 넣어야 작동된다.
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/http/HttpStatus.html
예를 들어 그냥 숫자만 넣거나 HttpStatus 상수 값을 넣지 않는다면, 다음과 같은 에러가 발생한다.
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'endpoints.health.CONFIGURATION_PROPERTIES': Could not bind properties to [unknown] (target=endpoints.health, ignoreInvalidFields=false, ignoreUnknownFields=true, ignoreNestedProperties=false); nested exception is org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'endpoints.health' on field 'mapping[DOWN]': rejected value ["501"]; codes [typeMismatch.endpoints.health.mapping[DOWN],typeMismatch.endpoints.health.mapping,typeMismatch.mapping[DOWN],typeMismatch.mapping,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [endpoints.health.mapping[DOWN],mapping[DOWN]]; arguments []; default message [mapping[DOWN]]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'org.springframework.http.HttpStatus' for property 'mapping[DOWN]'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type org.springframework.http.HttpStatus for value '"501"'; nested exception is java.lang.IllegalArgumentException: No enum constant org.springframework.http.HttpStatus."501"]
at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:303)
at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:250)
이외, DB나 Nosql과 같은 서버의 Health 체크를 할 수 있다.
예를 들어, DataSourceHealthIndicator (https://github.com/spring-projects/spring-boot/blob/master/spring-boot-actuator/src/main/java/org/springframework/boot/actuate/health/DataSourceHealthIndicator.java) 도 있다. 소스 보면 알겠지만, select 1 로 validation한다.
AbstractHealthIndicator(http://docs.spring.io/autorepo/docs/spring-boot/1.2.0.M1/api/org/springframework/boot/actuate/health/AbstractHealthIndicator.html)를 이용하여 다양한 Data Access에 대한 확장을 할 수 있다.
3. 정보를 볼 수 있는 다른 URL
health 뿐 아니라. info, beans, dump, env, metrics, trace... 등 다양하게 쓸 수 있고,
security 를 이용하여 인증처리를 해야만 볼 수 있게도 한다.
예를 들어,
http://localhost:8080/trace 를 요청하면, 어떤 url로 요청이 들어왔는지 100개 정보를 보여주고,
http://localhost:8080/dump 는 쓰레드 덤프를 요청한다.
info* 정보를 properties에 추가하면, /info 요청을 보내면, info*설정 값을 웹으로 볼 수 있다.
application.properties
info.app.name=TestService
info.app.description=test test
info.app.version=1.0.0-snapshot
{"app": {"description": "test test","name": "TestService","version": "1.0.0-snapshot"}
}
출처 :
http://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html
'general java' 카테고리의 다른 글
spring cglib default 생성자 (0) | 2015.06.03 |
---|---|
java.lang.NoClassDefFoundError: org/junit/runners/model/MultipleFailureException (0) | 2015.05.31 |
STS(spring tool suite)에서 spring boot 애플리케이션 지원 (0) | 2015.05.27 |
[gradle] maven repository에서 pom /jar 못 읽어 올 때, (0) | 2015.05.22 |
[spring boot] logback.xml과 application.yml의 로그 설정 우선 순위 (0) | 2015.05.22 |