You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by tp...@apache.org on 2021/06/23 15:35:50 UTC

[nifi] branch main updated: NIFI-4344: Improve bulletin messages with exception details.

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

tpalfy 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 0c748a5  NIFI-4344: Improve bulletin messages with exception details.
0c748a5 is described below

commit 0c748a5a2b366990c544e0580ca8626f0b9e3ed1
Author: Lehel Boér <Le...@hotmail.com>
AuthorDate: Wed Mar 31 20:58:26 2021 +0200

    NIFI-4344: Improve bulletin messages with exception details.
    
    This closes #5093.
    
    Signed-off-by: Tamas Palfy <ta...@gmail.com>
---
 .../logging/repository/StandardLogRepository.java  |  4 +--
 .../apache/nifi/processor/SimpleProcessLogger.java | 26 +++++++++++++----
 .../nifi/processor/TestSimpleProcessLogger.java    | 34 +++++++++++++---------
 .../nifi/controller/tasks/ConnectableTask.java     |  4 +--
 4 files changed, 43 insertions(+), 25 deletions(-)

diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/logging/repository/StandardLogRepository.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/logging/repository/StandardLogRepository.java
index dde2a8c..687cfec 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/logging/repository/StandardLogRepository.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/logging/repository/StandardLogRepository.java
@@ -34,8 +34,6 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 public class StandardLogRepository implements LogRepository {
 
-    public static final int DEFAULT_MAX_CAPACITY_PER_LEVEL = 10;
-
     private final Map<LogLevel, Collection<LogObserver>> observers = new HashMap<>();
     private final Map<String, LogObserver> observerLookup = new HashMap<>();
 
@@ -82,7 +80,7 @@ public class StandardLogRepository implements LogRepository {
         addLogMessage(level, formattedMessage, t);
     }
 
-    private void replaceThrowablesWithMessage(Object[] params) {
+    private void replaceThrowablesWithMessage(final Object[] params) {
         for (int i = 0; i < params.length; i++) {
             if(params[i] instanceof Throwable) {
                 params[i] = ((Throwable) params[i]).getLocalizedMessage();
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/processor/SimpleProcessLogger.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/processor/SimpleProcessLogger.java
index e82309b..0c55241 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/processor/SimpleProcessLogger.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/main/java/org/apache/nifi/processor/SimpleProcessLogger.java
@@ -24,8 +24,14 @@ import org.apache.nifi.logging.LogRepositoryFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.LinkedList;
+import java.util.stream.Collectors;
+
 public class SimpleProcessLogger implements ComponentLog {
 
+    public static final String NEW_LINE_ARROW = "\u21B3";
+    public static final String CAUSES = NEW_LINE_ARROW + " causes: ";
+
     private final Logger logger;
     private final LogRepository logRepository;
     private final Object component;
@@ -58,7 +64,7 @@ public class SimpleProcessLogger implements ComponentLog {
         }
 
         msg = "{} " + msg;
-        final Object[] os = {component, t.toString(), t};
+        final Object[] os = {component, getCauses(t), t};
         logger.warn(msg, os);
         logRepository.addLogMessage(LogLevel.WARN, msg, os, t);
     }
@@ -110,7 +116,7 @@ public class SimpleProcessLogger implements ComponentLog {
         }
 
         msg = "{} " + msg;
-        final Object[] os = {component, t.toString(), t};
+        final Object[] os = {component, getCauses(t), t};
         logger.trace(msg, os);
         logRepository.addLogMessage(LogLevel.TRACE, msg, os, t);
     }
@@ -184,7 +190,7 @@ public class SimpleProcessLogger implements ComponentLog {
         }
 
         msg = "{} " + msg;
-        final Object[] os = {component, t.toString()};
+        final Object[] os = {component, getCauses(t)};
 
         logger.info(msg, os);
         if (logger.isDebugEnabled()) {
@@ -245,12 +251,12 @@ public class SimpleProcessLogger implements ComponentLog {
 
         if (t == null) {
             msg = "{} " + msg;
-            final Object[] os = new Object[] {component};
+            final Object[] os = new Object[]{component};
             logger.error(msg, os);
             logRepository.addLogMessage(LogLevel.ERROR, msg, os);
         } else {
             msg = "{} " + msg + ": {}";
-            final Object[] os = new Object[] {component, t.toString(), t};
+            final Object[] os = new Object[]{component, getCauses(t), t};
             logger.error(msg, os);
             logRepository.addLogMessage(LogLevel.ERROR, msg, os, t);
         }
@@ -301,7 +307,7 @@ public class SimpleProcessLogger implements ComponentLog {
             modifiedArgs = new Object[os.length + 3];
             modifiedArgs[0] = component.toString();
             System.arraycopy(os, 0, modifiedArgs, 1, os.length);
-            modifiedArgs[modifiedArgs.length - 2] = t.toString();
+            modifiedArgs[modifiedArgs.length - 2] = getCauses(t);
             modifiedArgs[modifiedArgs.length - 1] = t;
         }
 
@@ -448,4 +454,12 @@ public class SimpleProcessLogger implements ComponentLog {
         }
     }
 
+    private String getCauses(final Throwable throwable) {
+        final LinkedList<String> causes = new LinkedList<>();
+        for (Throwable t = throwable; t != null; t = t.getCause()) {
+            causes.push(t.toString());
+        }
+        return causes.stream().collect(Collectors.joining(System.lineSeparator() + CAUSES));
+    }
+
 }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/processor/TestSimpleProcessLogger.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/processor/TestSimpleProcessLogger.java
index 2307470..6d2bd1c 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/processor/TestSimpleProcessLogger.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-components/src/test/java/org/apache/nifi/processor/TestSimpleProcessLogger.java
@@ -16,6 +16,15 @@
  */
 package org.apache.nifi.processor;
 
+import org.apache.nifi.logging.LogLevel;
+import org.apache.nifi.reporting.ReportingTask;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+
+import java.lang.reflect.Field;
+
+import static org.apache.nifi.processor.SimpleProcessLogger.NEW_LINE_ARROW;
 import static org.junit.Assert.fail;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
@@ -24,16 +33,13 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.lang.reflect.Field;
+public class TestSimpleProcessLogger {
 
-import org.apache.nifi.logging.LogLevel;
-import org.apache.nifi.reporting.ReportingTask;
-import org.junit.Before;
-import org.junit.Test;
-import org.slf4j.Logger;
+    private static final String EXPECTED_CAUSES = "java.lang.RuntimeException: third" + System.lineSeparator() +
+            NEW_LINE_ARROW + " causes: java.lang.RuntimeException: second" + System.lineSeparator() +
+            NEW_LINE_ARROW + " causes: java.lang.RuntimeException: first";
 
-public class TestSimpleProcessLogger {
-    private final Exception e = new RuntimeException("intentional");
+    private final Exception e = new RuntimeException("first", new RuntimeException("second", new RuntimeException("third")));
 
     private ReportingTask task;
 
@@ -68,7 +74,7 @@ public class TestSimpleProcessLogger {
     @Test
     public void validateDelegateLoggerReceivesThrowableToStringOnError() {
         componentLog.error("Hello {}", e);
-        verify(logger, times(1)).error(anyString(), eq(task), eq(e.toString()), eq(e));
+        verify(logger, times(1)).error(anyString(), eq(task), eq(EXPECTED_CAUSES), eq(e));
     }
 
     @Test
@@ -80,24 +86,24 @@ public class TestSimpleProcessLogger {
     @Test
     public void validateDelegateLoggerReceivesThrowableToStringOnTrace() {
         componentLog.trace("Hello {}", e);
-        verify(logger, times(1)).trace(anyString(), eq(task), eq(e.toString()), eq(e));
+        verify(logger, times(1)).trace(anyString(), eq(task), eq(EXPECTED_CAUSES), eq(e));
     }
 
     @Test
     public void validateDelegateLoggerReceivesThrowableToStringOnWarn() {
         componentLog.warn("Hello {}", e);
-        verify(logger, times(1)).warn(anyString(), eq(task), eq(e.toString()), eq(e));
+        verify(logger, times(1)).warn(anyString(), eq(task), eq(EXPECTED_CAUSES), eq(e));
     }
 
     @Test
     public void validateDelegateLoggerReceivesThrowableToStringOnLogWithLevel() {
         componentLog.log(LogLevel.WARN, "Hello {}", e);
-        verify(logger, times(1)).warn(anyString(), eq(task), eq(e.toString()), eq(e));
+        verify(logger, times(1)).warn(anyString(), eq(task), eq(EXPECTED_CAUSES), eq(e));
         componentLog.log(LogLevel.ERROR, "Hello {}", e);
-        verify(logger, times(1)).error(anyString(), eq(task), eq(e.toString()), eq(e));
+        verify(logger, times(1)).error(anyString(), eq(task), eq(EXPECTED_CAUSES), eq(e));
         componentLog.log(LogLevel.INFO, "Hello {}", e);
         verify(logger, times(1)).info(anyString(), eq(e));
         componentLog.log(LogLevel.TRACE, "Hello {}", e);
-        verify(logger, times(1)).trace(anyString(), eq(task), eq(e.toString()), eq(e));
+        verify(logger, times(1)).trace(anyString(), eq(task), eq(EXPECTED_CAUSES), eq(e));
     }
 }
diff --git a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/tasks/ConnectableTask.java b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/tasks/ConnectableTask.java
index 83dc8f1..916d9a3 100644
--- a/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/tasks/ConnectableTask.java
+++ b/nifi-nar-bundles/nifi-framework-bundle/nifi-framework/nifi-framework-core/src/main/java/org/apache/nifi/controller/tasks/ConnectableTask.java
@@ -251,8 +251,8 @@ public class ConnectableTask {
             } catch (final Throwable t) {
                 // Use ComponentLog to log the event so that a bulletin will be created for this processor
                 final ComponentLog procLog = new SimpleProcessLogger(connectable.getIdentifier(), connectable.getRunnableComponent());
-                procLog.error("{} failed to process session due to {}; Processor Administratively Yielded for {}",
-                    new Object[] {connectable.getRunnableComponent(), t, schedulingAgent.getAdministrativeYieldDuration()}, t);
+                procLog.error("Failed to process session due to {}; Processor Administratively Yielded for {}",
+                    new Object[] {t, schedulingAgent.getAdministrativeYieldDuration()}, t);
                 logger.warn("Administratively Yielding {} due to uncaught Exception: {}", connectable.getRunnableComponent(), t.toString(), t);
 
                 connectable.yield(schedulingAgent.getAdministrativeYieldDuration(TimeUnit.NANOSECONDS), TimeUnit.NANOSECONDS);