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
+