Preloader image

Este é um exemplo de como usar MicroProfile Custom Health Check em TomEE.

Health Feature

Os links de status (Health checks) são usados para verificar os estados dos serviços e recursos que uma aplicação depende ou mesmo expor seus status. Por exemplo, em um ambiente de cluster, onde um nó não íntegro precisa ser descartado (terminated, shutdown) e eventualmente substituído por outra instância íntegra.

Por padrão, microprofile-health-api proporciona a saida básica de um nó simplesmente acessando o endpoint http://host:port/health.

{"checks":[],"outcome":"UP","status":"UP"}

Para fornecer uma saída personalizada, digamos que temos uma API do tempo, e se o serviço se tornar indisponível, devemos relatar o serviço como inativo (DOWN).

Para iniciar com uma saída personalizada, é necessário implementar a interface HealthCheck, transforme a classe em um bean gerenciado anotando-a com @ApplicationScoped e @Health para ativar a verificação personalizada. Veja mais detalhes aqui GeronimoHealthExtension.java

@Health
@ApplicationScoped
public class WeatherServiceHealthCheck implements HealthCheck {

    @Inject WeatherGateway weatherGateway;

    @Override
    public HealthCheckResponse call() {
        HealthCheckResponseBuilder responseBuilder = HealthCheckResponse.named("OpenWeatherMap");
        try {
            WeatherApiStatus status = weatherGateway.getApiStatus();
            return responseBuilder.withData("weatherServiceApiUrl", status.getUrl())
                    .withData("weatherServiceApiVersion", status.getVersion())
                    .withData("weatherServiceMessage", status.getMessage())
                    .up().build();
        } catch (WeatherException e) {
            return responseBuilder.withData("weatherServiceErrorMessage", e.getMessage()).down().build();
        }
    }
}

No exemplo acima, o link de status é OpenWeatherMap (somente ilustrativo) que fornece uma plano de assinatura para acessar seus serviços e, se o limite de chamadas for excedido, a API ficará indisponível até sua renovação.

Exemplos

Executando o aplicativo
    mvn clean install tomee:run

Exemplo 1

Quando acessado o endpoint /health, OpenWeatherMap nos diz que nossas chamadas restantes estão acabando e que devemos tomar uma ação antes que fique indisponível.

curl http://localhost:8080/mp-custom-healthcheck/health
{
   "checks":[
      {
         "data":{
            "weatherServiceApiVersion":"2.5",
            "weatherServiceMessage":"Your account will become unavailable soon due to limitation of your
                                    subscription type. Remaining API calls are 1",
            "weatherServiceApiUrl":"http://api.openweathermap.org/data/2.5/"
         },
         "name":"OpenWeatherMap",
         "state":"UP"
      }
   ],
   "outcome":"UP",
   "status":"UP"
}

Exemplo 2

A API do tempo ainda está funcionando bem.

curl http://localhost:8080/mp-custom-healthcheck/weather/day/status
Hi, today is a sunny day!

Exemplo 3

Quando acessamos novamente o endpoint /health, OpenWeatherMap nos diz que nossa conta está temporariamente bloqueada e esse serviço é relatado como inativo (DOWN).

curl http://localhost:8080/mp-custom-healthcheck/health
{
   "checks":[
      {
         "data":{
            "weatherServiceErrorMessage":"Your account is temporary blocked due to exceeding of
            requests limitation of your subscription type. Please choose the proper subscription
            http://openweathermap.org/price"
         },
         "name":"weatherservice",
         "state":"DOWN"
      }
   ],
   "outcome":"DOWN",
   "status":"DOWN"
}

Exemplo 4

A API do tempo parou.

curl http://localhost:8080/mp-custom-healthcheck/weather/day/status
Weather Service is unavailable at moment, retry later.
Executando os testes

Você pode também testar usando WeatherServiceTest.java disponível no projeto.

mvn clean test
[INFO] Results:
[INFO]
[INFO] Tests run: 4, Failures: 0, Errors: 0, Skipped: