You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ex...@apache.org on 2021/06/14 13:53:29 UTC

[nifi] branch main updated: NIFI-8645: Disable LongRunningTaskMonitor by default

This is an automated email from the ASF dual-hosted git repository.

exceptionfactory pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi.git


The following commit(s) were added to refs/heads/main by this push:
     new 48befe2  NIFI-8645: Disable LongRunningTaskMonitor by default
48befe2 is described below

commit 48befe22f6af6791361ed7037b8bda372d0ee5c9
Author: Peter Turcsanyi <tu...@apache.org>
AuthorDate: Tue Jun 1 14:31:51 2021 +0200

    NIFI-8645: Disable LongRunningTaskMonitor by default
    
    This closes #5111
    
    Signed-off-by: David Handermann <ex...@apache.org>
---
 .../java/org/apache/nifi/util/NiFiProperties.java  |  4 ---
 .../src/main/asciidoc/administration-guide.adoc    | 16 ++++++++++
 .../org/apache/nifi/controller/FlowController.java | 35 ++++++++++++++--------
 .../src/main/resources/conf/nifi.properties        |  4 +--
 4 files changed, 41 insertions(+), 18 deletions(-)

diff --git a/nifi-commons/nifi-properties/src/main/java/org/apache/nifi/util/NiFiProperties.java b/nifi-commons/nifi-properties/src/main/java/org/apache/nifi/util/NiFiProperties.java
index 8c8e2fb..329f916 100644
--- a/nifi-commons/nifi-properties/src/main/java/org/apache/nifi/util/NiFiProperties.java
+++ b/nifi-commons/nifi-properties/src/main/java/org/apache/nifi/util/NiFiProperties.java
@@ -384,10 +384,6 @@ public class NiFiProperties extends ApplicationProperties {
     public static final String DEFAULT_ANALYTICS_CONNECTION_SCORE_NAME = "rSquared";
     public static final double DEFAULT_ANALYTICS_CONNECTION_SCORE_THRESHOLD = .90;
 
-    // runtime monitoring defaults
-    public static final String DEFAULT_MONITOR_LONG_RUNNING_TASK_SCHEDULE = "1 min";
-    public static final String DEFAULT_MONITOR_LONG_RUNNING_TASK_THRESHOLD = "5 mins";
-
     // Status repository defaults
     public static final int DEFAULT_COMPONENT_STATUS_REPOSITORY_PERSIST_NODE_DAYS = 14;
     public static final int DEFAULT_COMPONENT_STATUS_REPOSITORY_PERSIST_COMPONENT_DAYS = 3;
diff --git a/nifi-docs/src/main/asciidoc/administration-guide.adoc b/nifi-docs/src/main/asciidoc/administration-guide.adoc
index 3dffe70..d2c945a 100644
--- a/nifi-docs/src/main/asciidoc/administration-guide.adoc
+++ b/nifi-docs/src/main/asciidoc/administration-guide.adoc
@@ -3764,6 +3764,22 @@ These properties determine the behavior of the internal NiFi predictive analytic
 
 |====
 
+[[runtime_monitoring_properties]]
+=== Runtime Monitoring Properties
+
+Long-Running Task Monitor periodically checks the NiFi processor executor threads and produces warning logs and bulletin messages for those that have been running for a longer period of time.
+It can be used to detect possibly stuck / hanging processor tasks.
+Please note the performance impact of the task monitor: it creates a thread dump for every run that may affect the normal flow execution.
+The Long-Running Task Monitor can be disabled via defining no values for its properties, and it is disabled by default.
+To enable it, both `nifi.monitor.long.running.task.schedule` and `nifi.monitor.long.running.task.threshold` properties need to be configured with valid time periods.
+
+|====
+|*Property*|*Description*
+|`nifi.monitor.long.running.task.schedule`|The time period between successive executions of the Long-Running Task Monitor (e.g. `1 min`).
+|`nifi.monitor.long.running.task.threshold`|The time period beyond which a task is considered long-running, i.e. stuck / hanging (e.g. `5 mins`).
+
+|====
+
 [[custom_properties]]
 === Custom Properties
 
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
index 5154963..aea9604 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/FlowController.java
@@ -311,7 +311,7 @@ public class FlowController implements ReportingTaskProvider, Authorizable, Node
     private final StandardFlowManager flowManager;
     private final RepositoryContextFactory repositoryContextFactory;
     private final RingBufferGarbageCollectionLog gcLog;
-    private final FlowEngine longRunningTaskMonitorThreadPool;
+    private final Optional<FlowEngine> longRunningTaskMonitorThreadPool;
 
     /**
      * true if controller is configured to operate in a clustered environment
@@ -781,7 +781,9 @@ public class FlowController implements ReportingTaskProvider, Authorizable, Node
             loadBalanceClientThreadPool = null;
         }
 
-        longRunningTaskMonitorThreadPool = new FlowEngine(1, "Long Running Task Monitor", true);
+        longRunningTaskMonitorThreadPool = isLongRunningTaskMonitorEnabled()
+                ? Optional.of(new FlowEngine(1, "Long Running Task Monitor", true))
+                : Optional.empty();
     }
 
     @Override
@@ -1104,23 +1106,32 @@ public class FlowController implements ReportingTaskProvider, Authorizable, Node
     }
 
     private void scheduleLongRunningTaskMonitor() {
-        final long scheduleMillis = parseDurationPropertyToMillis(NiFiProperties.MONITOR_LONG_RUNNING_TASK_SCHEDULE, NiFiProperties.DEFAULT_MONITOR_LONG_RUNNING_TASK_SCHEDULE);
-        final long thresholdMillis = parseDurationPropertyToMillis(NiFiProperties.MONITOR_LONG_RUNNING_TASK_THRESHOLD, NiFiProperties.DEFAULT_MONITOR_LONG_RUNNING_TASK_THRESHOLD);
+        longRunningTaskMonitorThreadPool.ifPresent(flowEngine -> {
+            try {
+                final long scheduleMillis = parseDurationPropertyToMillis(NiFiProperties.MONITOR_LONG_RUNNING_TASK_SCHEDULE);
+                final long thresholdMillis = parseDurationPropertyToMillis(NiFiProperties.MONITOR_LONG_RUNNING_TASK_THRESHOLD);
 
-        LongRunningTaskMonitor longRunningTaskMonitor = new LongRunningTaskMonitor(getFlowManager(), createEventReporter(), thresholdMillis);
-        longRunningTaskMonitorThreadPool.scheduleWithFixedDelay(longRunningTaskMonitor, scheduleMillis, scheduleMillis, TimeUnit.MILLISECONDS);
+                LongRunningTaskMonitor longRunningTaskMonitor = new LongRunningTaskMonitor(getFlowManager(), createEventReporter(), thresholdMillis);
+                longRunningTaskMonitorThreadPool.get().scheduleWithFixedDelay(longRunningTaskMonitor, scheduleMillis, scheduleMillis, TimeUnit.MILLISECONDS);
+            } catch (Exception e) {
+                LOG.warn("Could not initialize LongRunningTaskMonitor.", e);
+            }
+        });
     }
 
-    private long parseDurationPropertyToMillis(String propertyName, String defaultValue) {
-        long durationMillis;
+    private long parseDurationPropertyToMillis(String propertyName) {
         try {
             final String duration = nifiProperties.getProperty(propertyName);
-            durationMillis = (long) FormatUtils.getPreciseTimeDuration(duration, TimeUnit.MILLISECONDS);
+            return (long) FormatUtils.getPreciseTimeDuration(duration, TimeUnit.MILLISECONDS);
         } catch (final Exception e) {
-            LOG.warn("Could not retrieve value for {}. This property has been set to '{}'", propertyName, defaultValue);
-            durationMillis = (long) FormatUtils.getPreciseTimeDuration(defaultValue, TimeUnit.MILLISECONDS);
+            LOG.warn("Could not retrieve value for {}. Valid values e.g. 60 secs or 1 min.", propertyName);
+            throw e;
         }
-        return durationMillis;
+    }
+
+    private boolean isLongRunningTaskMonitorEnabled() {
+        return StringUtils.isNotBlank(nifiProperties.getProperty(NiFiProperties.MONITOR_LONG_RUNNING_TASK_SCHEDULE))
+                && StringUtils.isNotBlank(nifiProperties.getProperty(NiFiProperties.MONITOR_LONG_RUNNING_TASK_THRESHOLD));
     }
 
     public boolean isStartAfterInitialization(final Connectable component) {
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/conf/nifi.properties b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/conf/nifi.properties
index 12a31e5..772fe12 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/conf/nifi.properties
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-resources/src/main/resources/conf/nifi.properties
@@ -321,5 +321,5 @@ nifi.analytics.connection.model.score.name=${nifi.analytics.connection.model.sco
 nifi.analytics.connection.model.score.threshold=${nifi.analytics.connection.model.score.threshold}
 
 # runtime monitoring properties
-nifi.monitor.long.running.task.schedule=${nifi.monitor.long.running.task.schedule}
-nifi.monitor.long.running.task.threshold=${nifi.monitor.long.running.task.threshold}
+nifi.monitor.long.running.task.schedule=
+nifi.monitor.long.running.task.threshold=