Skip to content

Commit

Permalink
[JENKINS-32696] Healthcheck API endpoint causes a new run of health c…
Browse files Browse the repository at this point in the history
…hecks

Instead of reusing previous values
  • Loading branch information
carlossg authored and stephenc committed Feb 3, 2016
1 parent ef2d2f9 commit b06dbe2
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 5 deletions.
32 changes: 30 additions & 2 deletions src/main/java/jenkins/metrics/api/Metrics.java
Expand Up @@ -31,6 +31,7 @@
import com.codahale.metrics.MetricSet;
import com.codahale.metrics.Timer;
import com.codahale.metrics.health.HealthCheck;
import com.codahale.metrics.health.HealthCheck.Result;
import com.codahale.metrics.health.HealthCheckRegistry;
import hudson.init.InitMilestone;
import hudson.init.Initializer;
Expand All @@ -57,19 +58,22 @@

import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.RejectedExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.annotation.Nonnull;

import static com.codahale.metrics.MetricRegistry.name;

/**
Expand Down Expand Up @@ -139,6 +143,26 @@ public static HealthCheckRegistry healthCheckRegistry() {
return plugin.healthCheckRegistry;
}

/**
* Get the last health check results
*
* @return a map with health check name -> health check result
*/
@Nonnull
public static SortedMap<String, Result> getHealthCheckResults() {
Jenkins jenkins = Jenkins.getInstance();
if (jenkins == null) {
LOGGER.warning("Unable to get health check results, client master is not ready (startup or shutdown)");
return Collections.emptySortedMap();
}
HealthChecker healthChecker = jenkins.getExtensionList(PeriodicWork.class).get(HealthChecker.class);
if (healthChecker == null) {
LOGGER.warning("Unable to get health check results, HealthChecker is not available");
return Collections.emptySortedMap();
}
return healthChecker.getSortedHealthCheckResults();
}

/**
* Returns the {@link MetricRegistry} for the current {@link Jenkins}.
*
Expand Down Expand Up @@ -368,7 +392,7 @@ public static class HealthChecker extends PeriodicWork {

private final Timer healthCheckDuration = new Timer();

private Map<String, HealthCheck.Result> healthCheckResults = new HashMap<String, HealthCheck.Result>();
private SortedMap<String, HealthCheck.Result> healthCheckResults = new TreeMap<String, HealthCheck.Result>();

private final Gauge<Integer> healthCheckCount = new Gauge<Integer>() {
public Integer getValue() {
Expand Down Expand Up @@ -398,6 +422,10 @@ public Timer getHealthCheckDuration() {
}

public Map<String, HealthCheck.Result> getHealthCheckResults() {
return getSortedHealthCheckResults();
}

public SortedMap<String, HealthCheck.Result> getSortedHealthCheckResults() {
return healthCheckResults;
}

Expand Down
6 changes: 3 additions & 3 deletions src/main/java/jenkins/metrics/api/MetricsRootAction.java
Expand Up @@ -158,7 +158,7 @@ public HttpResponse doHealthcheck(StaplerRequest req, @QueryParameter("key") Str
key = getKeyFromAuthorizationHeader(req);
}
Metrics.checkAccessKeyHealthCheck(key);
return Metrics.cors(key, new HealthCheckResponse(Metrics.healthCheckRegistry().runHealthChecks()));
return Metrics.cors(key, new HealthCheckResponse(Metrics.getHealthCheckResults()));
}

/**
Expand All @@ -173,7 +173,7 @@ public HttpResponse doHealthcheck(StaplerRequest req, @QueryParameter("key") Str
* return status 200 if everything is OK, 503 (service unavailable) otherwise
*/
public HttpResponse doHealthcheckOk() {
SortedMap<String, HealthCheck.Result> checks = Metrics.healthCheckRegistry().runHealthChecks();
SortedMap<String, HealthCheck.Result> checks = Metrics.getHealthCheckResults();
boolean allOk = true;
for(Map.Entry<String, HealthCheck.Result> entry: checks.entrySet()){
HealthCheck.Result result = entry.getValue();
Expand Down Expand Up @@ -401,7 +401,7 @@ public JsonNode getValue(ObjectReader reader) {
public class Pseudoservlet {

public HttpResponse doHealthcheck() {
return new HealthCheckResponse(Metrics.healthCheckRegistry().runHealthChecks());
return new HealthCheckResponse(Metrics.getHealthCheckResults());
}

public HttpResponse doMetrics() {
Expand Down

0 comments on commit b06dbe2

Please sign in to comment.