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

Posted by '김용환'
,