You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by gh...@apache.org on 2019/01/03 16:05:32 UTC
svn commit: r1850248 - in /felix/trunk/healthcheck: api/ core/
core/src/main/java/org/apache/felix/hc/core/impl/
core/src/main/java/org/apache/felix/hc/core/impl/executor/
core/src/main/java/org/apache/felix/hc/core/impl/executor/async/
core/src/main/j...
Author: ghenzler
Date: Thu Jan 3 16:05:31 2019
New Revision: 1850248
URL: http://svn.apache.org/viewvc?rev=1850248&view=rev
Log:
FELIX-5952 various improvements
Added:
felix/trunk/healthcheck/webconsoleplugin/bnd.bnd
Modified:
felix/trunk/healthcheck/api/bnd.bnd
felix/trunk/healthcheck/core/bnd.bnd
felix/trunk/healthcheck/core/pom.xml
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/JmxAdjustableStatusHealthCheck.java
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/async/AsyncHealthCheckExecutor.java
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/HealthCheckExecutorServlet.java
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/ResultHtmlSerializer.java
felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanCreator.java
felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/impl/executor/HealthCheckExecutorImplTest.java
Modified: felix/trunk/healthcheck/api/bnd.bnd
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/api/bnd.bnd?rev=1850248&r1=1850247&r2=1850248&view=diff
==============================================================================
--- felix/trunk/healthcheck/api/bnd.bnd (original)
+++ felix/trunk/healthcheck/api/bnd.bnd Thu Jan 3 16:05:31 2019
@@ -1,4 +1,4 @@
-Bundle-Category: felix
+Bundle-Category: healthcheck
Bundle-Description: ${project.description}
Modified: felix/trunk/healthcheck/core/bnd.bnd
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/bnd.bnd?rev=1850248&r1=1850247&r2=1850248&view=diff
==============================================================================
--- felix/trunk/healthcheck/core/bnd.bnd (original)
+++ felix/trunk/healthcheck/core/bnd.bnd Thu Jan 3 16:05:31 2019
@@ -1,4 +1,4 @@
-Bundle-Category: felix
+Bundle-Category: healthcheck
Bundle-Description: ${project.description}
Modified: felix/trunk/healthcheck/core/pom.xml
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/pom.xml?rev=1850248&r1=1850247&r2=1850248&view=diff
==============================================================================
--- felix/trunk/healthcheck/core/pom.xml (original)
+++ felix/trunk/healthcheck/core/pom.xml Thu Jan 3 16:05:31 2019
@@ -58,7 +58,7 @@
<plugin>
<groupId>biz.aQute.bnd</groupId>
<artifactId>bnd-maven-plugin</artifactId>
- <version>4.0.0</version>
+ <version>4.1.0</version>
<executions>
<execution>
<goals>
@@ -80,10 +80,12 @@
<plugin>
<groupId>biz.aQute.bnd</groupId>
<artifactId>bnd-baseline-maven-plugin</artifactId>
+ <version>4.1.0</version>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
+ <version>0.8.2</version>
<executions>
<execution>
<id>prepare-agent-integration</id>
@@ -99,6 +101,7 @@
<plugin>
<groupId>org.apache.servicemix.tooling</groupId>
<artifactId>depends-maven-plugin</artifactId>
+ <version>1.4.0</version>
<executions>
<execution>
<goals>
@@ -188,7 +191,7 @@
<artifactId>org.apache.felix.utils</artifactId>
<version>1.11.0</version>
<scope>provided</scope>
- </dependency>
+ </dependency>
<!-- START test scope dependencies -->
Modified: felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/JmxAdjustableStatusHealthCheck.java
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/JmxAdjustableStatusHealthCheck.java?rev=1850248&r1=1850247&r2=1850248&view=diff
==============================================================================
--- felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/JmxAdjustableStatusHealthCheck.java (original)
+++ felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/JmxAdjustableStatusHealthCheck.java Thu Jan 3 16:05:31 2019
@@ -72,7 +72,7 @@ public class JmxAdjustableStatusHealthCh
@Deactivate
protected final void deactivate(final ComponentContext context) {
unregisterMbean();
- unregisterDynamicTestingHealthCheck();
+ unregisterDynamicHealthCheck();
}
private void registerMbean() {
@@ -92,9 +92,9 @@ public class JmxAdjustableStatusHealthCh
}
/* synchronized as potentially multiple users can run JMX operations */
- private synchronized void registerDynamicTestingHealthCheck(Result.Status status, String[] tags) {
- unregisterDynamicTestingHealthCheck();
- HealthCheck healthCheck = new DynamicTestingHealthCheck(status);
+ private synchronized void registerDynamicHealthCheck(Result.Status status, String[] tags) {
+ unregisterDynamicHealthCheck();
+ HealthCheck healthCheck = new AdhocStatusOnlyHealthCheck(status);
Dictionary<String, Object> props = new Hashtable<String, Object>();
props.put(HealthCheck.NAME, "JMX-adjustable Check");
props.put(HealthCheck.TAGS, tags);
@@ -104,7 +104,7 @@ public class JmxAdjustableStatusHealthCh
}
/* synchronized as potentially multiple users can run JMX operations */
- private synchronized void unregisterDynamicTestingHealthCheck() {
+ private synchronized void unregisterDynamicHealthCheck() {
if (this.healthCheckRegistration != null) {
this.healthCheckRegistration.unregister();
this.healthCheckRegistration = null;
@@ -112,11 +112,11 @@ public class JmxAdjustableStatusHealthCh
}
}
- class DynamicTestingHealthCheck implements HealthCheck {
+ class AdhocStatusOnlyHealthCheck implements HealthCheck {
private final Result.Status status;
- DynamicTestingHealthCheck(Result.Status status) {
+ AdhocStatusOnlyHealthCheck(Result.Status status) {
this.status = status;
}
@@ -209,15 +209,15 @@ public class JmxAdjustableStatusHealthCh
if (OP_RESET.equals(actionName)) {
tags = Arrays.asList("");
status = STATUS_INACTIVE;
- unregisterDynamicTestingHealthCheck();
- LOG.info("JMX-adjustable Health Check for testing was reset");
+ unregisterDynamicHealthCheck();
+ LOG.info("JMX-adjustable Health Check was reset");
return "Reset successful";
} else if (OP_ADD_CRITICAL_RESULT_FOR_TAGS.equals(actionName)) {
String[] newTags = params[0].toString().split("[,; ]+");
tags = Arrays.asList(newTags);
Status critical = Result.Status.CRITICAL;
status = critical.toString();
- registerDynamicTestingHealthCheck(critical, newTags);
+ registerDynamicHealthCheck(critical, newTags);
LOG.info("Activated JMX-adjustable Health Check with status CRITICAL and tags " + StringUtils.join(tags, ","));
return "Added check with result CRITICAL";
} else if (OP_ADD_WARN_RESULT_FOR_TAGS.equals(actionName)) {
@@ -225,7 +225,7 @@ public class JmxAdjustableStatusHealthCh
tags = Arrays.asList(newTags);
Status warn = Result.Status.WARN;
status = warn.toString();
- registerDynamicTestingHealthCheck(warn, newTags);
+ registerDynamicHealthCheck(warn, newTags);
LOG.info("Activated JMX-adjustable Health Check with status WARN and tags " + StringUtils.join(tags, ","));
return "Added check with result WARN";
} else {
Modified: felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java?rev=1850248&r1=1850247&r2=1850248&view=diff
==============================================================================
--- felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java (original)
+++ felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/HealthCheckResultCache.java Thu Jan 3 16:05:31 2019
@@ -133,7 +133,7 @@ public class HealthCheckResultCache {
private long getEffectiveTtl(HealthCheckMetadata metadata, long globalTtl) {
final long ttl;
Long hcTtl = metadata.getResultCacheTtlInMs();
- if (hcTtl != null && hcTtl > 0) {
+ if (hcTtl != null && hcTtl > -1) {
ttl = hcTtl;
} else {
ttl = globalTtl;
@@ -150,8 +150,8 @@ public class HealthCheckResultCache {
HealthCheckMetadata healthCheckMetadata = origResult.getHealthCheckMetadata();
Long warningsStickForMinutes = healthCheckMetadata.getWarningsStickForMinutes();
- if (warningsStickForMinutes != null) {
- logger.debug("Taking into account sticky results (up to {} min old) for health check ", warningsStickForMinutes,
+ if (warningsStickForMinutes != null && warningsStickForMinutes > 0) {
+ logger.debug("Taking into account sticky results (up to {} min old) for health check {}", warningsStickForMinutes,
healthCheckMetadata.getName());
List<HealthCheckExecutionResult> nonOkResultsFromPast = new ArrayList<HealthCheckExecutionResult>();
long cutOffTime = System.currentTimeMillis() - (warningsStickForMinutes * 60 * 1000);
Modified: felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/async/AsyncHealthCheckExecutor.java
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/async/AsyncHealthCheckExecutor.java?rev=1850248&r1=1850247&r2=1850248&view=diff
==============================================================================
--- felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/async/AsyncHealthCheckExecutor.java (original)
+++ felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/executor/async/AsyncHealthCheckExecutor.java Thu Jan 3 16:05:31 2019
@@ -142,7 +142,7 @@ public class AsyncHealthCheckExecutor im
quartzCronScheduler = new QuartzCronScheduler(healthCheckExecutorThreadPool);
LOG.info("Created quartz scheduler for async HC");
} else {
- LOG.warn("Can not schedule async health check with cron expression since quartz library is not on classpath");
+ LOG.warn("Can not schedule async health check '{}' with cron expression '{}' since quartz library is not on classpath", descriptor.getName(), descriptor.getAsyncCronExpression());
return false;
}
}
@@ -194,13 +194,7 @@ public class AsyncHealthCheckExecutor im
if (isAsync(healthCheckMetadata)) {
ExecutionResult result = asyncResultsByDescriptor.get(healthCheckMetadata);
if (result == null) {
-
- result = new ExecutionResult(healthCheckMetadata,
- new Result(Result.Status.OK, "Async Health Check with cron expression '"
- + healthCheckMetadata.getAsyncCronExpression() + "' has not yet been executed."),
- 0L);
-
- asyncResults.add(result);
+ result = handleMissingResult(healthCheckMetadata);
}
asyncResults.add(result);
// remove from HC collection to not execute the check in HealthCheckExecutorImpl
@@ -218,6 +212,27 @@ public class AsyncHealthCheckExecutor im
}
+ private ExecutionResult handleMissingResult(HealthCheckMetadata healthCheckMetadata) {
+ ExecutionResult result;
+ if(isAsyncCron(healthCheckMetadata)) {
+ if(registeredJobs.containsKey(healthCheckMetadata)) {
+ result = new ExecutionResult(healthCheckMetadata,
+ new Result(Result.Status.OK, "Async Health Check with cron expression '" + healthCheckMetadata.getAsyncCronExpression() +
+ "' has not yet been executed."), 0L);
+ } else {
+ result = new ExecutionResult(healthCheckMetadata,
+ new Result(Result.Status.WARN, "Async Health Check with cron expression '" + healthCheckMetadata.getAsyncCronExpression() +
+ "' is never executed because quartz bundle is missing."), 0L);
+ }
+
+ } else {
+ result = new ExecutionResult(healthCheckMetadata,
+ new Result(Result.Status.OK, "Async Health Check with interval '" + healthCheckMetadata.getAsyncIntervalInSec() +
+ "' has not yet been executed."), 0L);
+ }
+ return result;
+ }
+
public void updateWith(HealthCheckExecutionResult result) {
if (isAsync(result.getHealthCheckMetadata())) {
asyncResultsByDescriptor.put(result.getHealthCheckMetadata(), (ExecutionResult) result);
@@ -234,7 +249,7 @@ public class AsyncHealthCheckExecutor im
}
private boolean isAsyncInterval(HealthCheckMetadata healthCheckMetadata) {
- return healthCheckMetadata.getAsyncIntervalInSec() != null;
+ return healthCheckMetadata.getAsyncIntervalInSec() != null && healthCheckMetadata.getAsyncIntervalInSec() > 0L;
}
private boolean classExists(String className) {
Modified: felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/HealthCheckExecutorServlet.java
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/HealthCheckExecutorServlet.java?rev=1850248&r1=1850247&r2=1850248&view=diff
==============================================================================
--- felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/HealthCheckExecutorServlet.java (original)
+++ felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/HealthCheckExecutorServlet.java Thu Jan 3 16:05:31 2019
@@ -336,7 +336,7 @@ public class HealthCheckExecutorServlet
throws IOException {
response.setContentType(CONTENT_TYPE_HTML);
response.setCharacterEncoding("UTF-8");
- response.setHeader(STATUS_HEADER_NAME, overallResult.toString());
+ response.setHeader(STATUS_HEADER_NAME, overallResult.getStatus().toString());
response.getWriter().append(this.htmlSerializer.serialize(overallResult, executionResults, getHtmlHelpText(), includeDebug));
}
Modified: felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/ResultHtmlSerializer.java
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/ResultHtmlSerializer.java?rev=1850248&r1=1850247&r2=1850248&view=diff
==============================================================================
--- felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/ResultHtmlSerializer.java (original)
+++ felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/core/impl/servlet/ResultHtmlSerializer.java Thu Jan 3 16:05:31 2019
@@ -55,7 +55,7 @@ public class ResultHtmlSerializer {
"<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' /><style>" + styleString +
"</style></head><body><h1>System Health</h1>");
- writer.println("<p><span class=\"" + getClassForStatus(overallResult.getStatus()) + "\"><strong>Overall Result: "
+ writer.println("<p><span class=\"" + getClassForStatus(overallResult.getStatus()) + "\" style=\"padding:4px\"><strong>Overall Result: "
+ overallResult.getStatus() + "</strong></span></p>");
final DateFormat dfShort = new SimpleDateFormat("HH:mm:ss.SSS");
Modified: felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanCreator.java
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanCreator.java?rev=1850248&r1=1850247&r2=1850248&view=diff
==============================================================================
--- felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanCreator.java (original)
+++ felix/trunk/healthcheck/core/src/main/java/org/apache/felix/hc/jmx/impl/HealthCheckMBeanCreator.java Thu Jan 3 16:05:31 2019
@@ -27,6 +27,7 @@ import java.util.Map;
import javax.management.DynamicMBean;
+import org.apache.commons.lang3.StringUtils;
import org.apache.felix.hc.api.HealthCheck;
import org.apache.felix.hc.core.impl.executor.ExtendedHealthCheckExecutor;
import org.osgi.framework.BundleContext;
@@ -174,10 +175,10 @@ public class HealthCheckMBeanCreator {
}
private Registration getRegistration(final ServiceReference<HealthCheck> ref) {
- final Object nameObj = ref.getProperty(HealthCheck.MBEAN_NAME);
- if (nameObj != null) {
+ final String hcMBeanName = (String) ref.getProperty(HealthCheck.MBEAN_NAME);
+ if (StringUtils.isNotBlank(hcMBeanName)) {
final HealthCheckMBean mbean = new HealthCheckMBean(ref, executor);
- return new Registration(nameObj.toString().replace(',', '.'), mbean);
+ return new Registration(hcMBeanName.replace(',', '.'), mbean);
}
return null;
}
Modified: felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/impl/executor/HealthCheckExecutorImplTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/impl/executor/HealthCheckExecutorImplTest.java?rev=1850248&r1=1850247&r2=1850248&view=diff
==============================================================================
--- felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/impl/executor/HealthCheckExecutorImplTest.java (original)
+++ felix/trunk/healthcheck/core/src/test/java/org/apache/felix/hc/core/impl/executor/HealthCheckExecutorImplTest.java Thu Jan 3 16:05:31 2019
@@ -52,7 +52,7 @@ public class HealthCheckExecutorImplTest
private HealthCheckFuture future;
@Mock
- private HealthCheckMetadata HealthCheckMetadata;
+ private HealthCheckMetadata healthCheckMetadata;
@Spy
private HealthCheckResultCache healthCheckResultCache = new HealthCheckResultCache();
@@ -61,8 +61,9 @@ public class HealthCheckExecutorImplTest
public void setup() {
initMocks(this);
- when(future.getHealthCheckMetadata()).thenReturn(HealthCheckMetadata);
- when(HealthCheckMetadata.getTitle()).thenReturn("Test Check");
+ when(future.getHealthCheckMetadata()).thenReturn(healthCheckMetadata);
+ when(healthCheckMetadata.getTitle()).thenReturn("Test Check");
+ when(healthCheckMetadata.getResultCacheTtlInMs()).thenReturn(null);
// 2 sec normal timeout
healthCheckExecutorImpl.setTimeoutInMs(2000L);
@@ -78,7 +79,7 @@ public class HealthCheckExecutorImplTest
Collection<HealthCheckExecutionResult> results = new TreeSet<HealthCheckExecutionResult>();
when(future.isDone()).thenReturn(true);
- ExecutionResult testResult = new ExecutionResult(HealthCheckMetadata, new Result(Result.Status.OK, "test"), 10L);
+ ExecutionResult testResult = new ExecutionResult(healthCheckMetadata, new Result(Result.Status.OK, "test"), 10L);
when(future.get()).thenReturn(testResult);
healthCheckExecutorImpl.collectResultsFromFutures(futures, results);
@@ -174,6 +175,6 @@ public class HealthCheckExecutorImplTest
}
private void addResultToCache(Status status) {
- healthCheckResultCache.updateWith(new ExecutionResult(HealthCheckMetadata, new Result(status, "Status " + status), 1000));
+ healthCheckResultCache.updateWith(new ExecutionResult(healthCheckMetadata, new Result(status, "Status " + status), 1000));
}
}
Added: felix/trunk/healthcheck/webconsoleplugin/bnd.bnd
URL: http://svn.apache.org/viewvc/felix/trunk/healthcheck/webconsoleplugin/bnd.bnd?rev=1850248&view=auto
==============================================================================
--- felix/trunk/healthcheck/webconsoleplugin/bnd.bnd (added)
+++ felix/trunk/healthcheck/webconsoleplugin/bnd.bnd Thu Jan 3 16:05:31 2019
@@ -0,0 +1,10 @@
+Bundle-Category: healthcheck
+
+Bundle-Description: ${project.description}
+
+Bundle-DocURL: https://felix.apache.org
+
+Bundle-License: Apache License, Version 2.0
+
+Bundle-Vendor: The Apache Software Foundation
+