You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/01/03 10:34:44 UTC

[camel] 01/06: CAMEL-17338: Tracer - Use source loc:line in logger name. WIP

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

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

commit 1513d95469347450a03b7860afd895b42f431476
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Jan 2 17:15:38 2022 +0100

    CAMEL-17338: Tracer - Use source loc:line in logger name. WIP
---
 .../src/main/java/org/apache/camel/NamedRoute.java |  5 ++
 .../src/main/java/org/apache/camel/spi/Tracer.java | 14 ++++-
 .../camel/impl/engine/CamelInternalProcessor.java  |  9 ++-
 .../apache/camel/impl/engine/DefaultTracer.java    | 65 +++++++++++++++++++---
 .../org/apache/camel/model/RouteDefinition.java    |  1 +
 5 files changed, 80 insertions(+), 14 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/NamedRoute.java b/core/camel-api/src/main/java/org/apache/camel/NamedRoute.java
index e7f4529..4d59294 100644
--- a/core/camel-api/src/main/java/org/apache/camel/NamedRoute.java
+++ b/core/camel-api/src/main/java/org/apache/camel/NamedRoute.java
@@ -31,4 +31,9 @@ public interface NamedRoute {
      */
     String getEndpointUrl();
 
+    /**
+     * Gets the route input
+     */
+    NamedNode getInput();
+
 }
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/Tracer.java b/core/camel-api/src/main/java/org/apache/camel/spi/Tracer.java
index 6c090bf..0aa3329 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/Tracer.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/Tracer.java
@@ -38,7 +38,7 @@ public interface Tracer extends StaticService {
     /**
      * Trace before the route (eg input to route)
      *
-     * @param route    the route
+     * @param route    the route EIP
      * @param exchange the exchange
      */
     void traceBeforeRoute(NamedRoute route, Exchange exchange);
@@ -62,9 +62,19 @@ public interface Tracer extends StaticService {
     /**
      * Trace after the route (eg output from route)
      *
-     * @param route    the route
+     * @param route    the route EIP
      * @param exchange the exchange
      */
+    void traceAfterRoute(NamedRoute route, Exchange exchange);
+
+    /**
+     * Trace after the route (eg output from route)
+     *
+     * @param      route    the route
+     * @param      exchange the exchange
+     * @deprecated          use {@link #traceAfterRoute(NamedRoute, Exchange)}
+     */
+    @Deprecated
     void traceAfterRoute(Route route, Exchange exchange);
 
     /**
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java
index 97ba072..f84bea7 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/CamelInternalProcessor.java
@@ -1010,7 +1010,8 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor implements In
             this.processorDefinition = processorDefinition;
             this.routeDefinition = routeDefinition;
             this.tracingAfterRoute
-                    = routeDefinition != null ? new TracingAfterRoute(tracer, routeDefinition.getRouteId()) : null;
+                    = routeDefinition != null
+                            ? new TracingAfterRoute(tracer, routeDefinition.getRouteId(), routeDefinition) : null;
         }
 
         @Override
@@ -1045,16 +1046,18 @@ public class CamelInternalProcessor extends DelegateAsyncProcessor implements In
 
             private final Tracer tracer;
             private final String routeId;
+            private final NamedRoute node;
 
-            private TracingAfterRoute(Tracer tracer, String routeId) {
+            private TracingAfterRoute(Tracer tracer, String routeId, NamedRoute node) {
                 this.tracer = tracer;
                 this.routeId = routeId;
+                this.node = node;
             }
 
             @Override
             public void onAfterRoute(Route route, Exchange exchange) {
                 if (routeId.equals(route.getId())) {
-                    tracer.traceAfterRoute(route, exchange);
+                    tracer.traceAfterRoute(node, exchange);
                 }
             }
 
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultTracer.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultTracer.java
index 7cf8e6d..73c4bad 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultTracer.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultTracer.java
@@ -21,6 +21,7 @@ import java.util.Objects;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Exchange;
+import org.apache.camel.LineNumberAware;
 import org.apache.camel.NamedNode;
 import org.apache.camel.NamedRoute;
 import org.apache.camel.Route;
@@ -31,6 +32,7 @@ import org.apache.camel.support.PatternHelper;
 import org.apache.camel.support.builder.ExpressionBuilder;
 import org.apache.camel.support.processor.DefaultExchangeFormatter;
 import org.apache.camel.support.service.ServiceSupport;
+import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.StringHelper;
 import org.apache.camel.util.URISupport;
 import org.slf4j.Logger;
@@ -77,7 +79,6 @@ public class DefaultTracer extends ServiceSupport implements CamelContextAware,
     }
 
     @Override
-    @SuppressWarnings("unchecked")
     public void traceBeforeNode(NamedNode node, Exchange exchange) {
         if (shouldTrace(node)) {
             traceCounter++;
@@ -95,7 +96,7 @@ public class DefaultTracer extends ServiceSupport implements CamelContextAware,
             String data = exchangeFormatter.format(exchange);
             sb.append(data);
             String out = sb.toString();
-            dumpTrace(out);
+            dumpTrace(out, node);
         }
     }
 
@@ -121,17 +122,28 @@ public class DefaultTracer extends ServiceSupport implements CamelContextAware,
         boolean original = route.getRouteId().equals(exchange.getFromRouteId());
         String arrow = original ? "*-->" : "--->";
 
+        // we need to capture original source:line-number
+        if (original && camelContext.isDebugging()) {
+            int line = route.getInput().getLineNumber();
+            String loc = route.getInput().getLocation();
+        }
+
         StringBuilder sb = new StringBuilder();
         sb.append(String.format(TRACING_OUTPUT, arrow, route.getRouteId(), label));
         sb.append(" ");
         String data = exchangeFormatter.format(exchange);
         sb.append(data);
         String out = sb.toString();
-        dumpTrace(out);
+        dumpTrace(out, route);
     }
 
     @Override
     public void traceAfterRoute(Route route, Exchange exchange) {
+        // noop
+    }
+
+    @Override
+    public void traceAfterRoute(NamedRoute route, Exchange exchange) {
         if (!traceBeforeAndAfterRoute) {
             return;
         }
@@ -140,20 +152,20 @@ public class DefaultTracer extends ServiceSupport implements CamelContextAware,
         // the sanitizeUri takes a very long time for very long string and the format cuts this to
         // 33 characters, anyway. Cut this to 50 characters. This will give enough space for removing
         // characters in the sanitizeUri method and will be reasonably fast
-        String uri = route.getConsumer().getEndpoint().getEndpointUri();
+        String uri = route.getEndpointUrl();
         String label = "from[" + URISupport.sanitizeUri(StringHelper.limitLength(uri, 50) + "]");
 
         // the arrow has a * if its an exchange that is done
-        boolean original = route.getId().equals(exchange.getFromRouteId());
+        boolean original = route.getRouteId().equals(exchange.getFromRouteId());
         String arrow = original ? "*<--" : "<---";
 
         StringBuilder sb = new StringBuilder();
-        sb.append(String.format(TRACING_OUTPUT, arrow, route.getId(), label));
+        sb.append(String.format(TRACING_OUTPUT, arrow, route.getRouteId(), label));
         sb.append(" ");
         String data = exchangeFormatter.format(exchange);
         sb.append(data);
         String out = sb.toString();
-        dumpTrace(out);
+        dumpTrace(out, route);
     }
 
     @Override
@@ -240,8 +252,43 @@ public class DefaultTracer extends ServiceSupport implements CamelContextAware,
         this.exchangeFormatter = exchangeFormatter;
     }
 
-    protected void dumpTrace(String out) {
-        LOG.info(out);
+    protected String getLoggerName(Object node) {
+        String name = null;
+        if (camelContext.isDebugging() && node instanceof LineNumberAware) {
+            if (node instanceof NamedRoute) {
+                // we want the input from a route as it has the source location / line number
+                node = ((NamedRoute) node).getInput();
+            }
+            String loc = ((LineNumberAware) node).getLocation();
+            int line = ((LineNumberAware) node).getLineNumber();
+            if (line != -1 && loc != null) {
+                // is it a class or file?
+                name = loc;
+                if (loc.contains(":")) {
+                    // file based such as xml and yaml
+                    name = FileUtil.onlyName(loc);
+                    name = FileUtil.stripExt(name);
+                } else {
+                    // classname so let us only grab the name
+                    int pos = name.lastIndexOf('.');
+                    if (pos > 0) {
+                        name = name.substring(pos + 1);
+                    }
+                }
+                name += ":" + line;
+            }
+        }
+        return name;
+    }
+
+    protected void dumpTrace(String out, Object node) {
+        String name = getLoggerName(node);
+        if (name != null) {
+            Logger log = LoggerFactory.getLogger(name);
+            log.info(out);
+        } else {
+            LOG.info(out);
+        }
     }
 
     protected boolean shouldTracePattern(NamedNode definition) {
diff --git a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java
index f318336..b19c0af 100644
--- a/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java
+++ b/core/camel-core-model/src/main/java/org/apache/camel/model/RouteDefinition.java
@@ -716,6 +716,7 @@ public class RouteDefinition extends OutputDefinition<RouteDefinition> implement
     // Properties
     // -----------------------------------------------------------------------
 
+    @Override
     public FromDefinition getInput() {
         return input;
     }