package com.airbnb.airpal.resources; import com.codahale.metrics.health.HealthCheck; import com.codahale.metrics.health.HealthCheckRegistry; import io.dropwizard.jersey.caching.CacheControl; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import java.util.Map; import java.util.SortedMap; @Path("/health") @Produces(MediaType.APPLICATION_JSON) public class HealthResource { private final HealthCheckRegistry registry; @Inject public HealthResource(HealthCheckRegistry registry) { this.registry = registry; } @GET @CacheControl(mustRevalidate = true, noCache = true, noStore = true) public Response health() { final SortedMap<String, HealthCheck.Result> results = registry.runHealthChecks(); if (results.isEmpty()) { return Response.status(new NotImplementedStatus()).entity(results).build(); } else { if (isAllHealthy(results)) { return Response.status(Response.Status.OK).entity(results).build(); } else { return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(results).build(); } } } private static boolean isAllHealthy(Map<String, HealthCheck.Result> results) { for (HealthCheck.Result result : results.values()) { if (!result.isHealthy()) { return false; } } return true; } private static final class NotImplementedStatus implements Response.StatusType { @Override public int getStatusCode() { return 501; } @Override public String getReasonPhrase() { return "Not Implemented"; } @Override public Response.Status.Family getFamily() { return Response.Status.Family.SERVER_ERROR; } } }