You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2021/01/28 15:11:13 UTC

[karaf-decanter] branch master updated: [KARAF-7007] Refactore Decanter Camel tracer as a intercept strategy

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

jbonofre pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/karaf-decanter.git


The following commit(s) were added to refs/heads/master by this push:
     new 8504b6a  [KARAF-7007] Refactore Decanter Camel tracer as a intercept strategy
     new ff9b30c  Merge pull request #227 from jbonofre/KARAF-7007
8504b6a is described below

commit 8504b6adb25a56151702e8cb5ff4f091bf0cffe4
Author: jbonofre <jb...@apache.org>
AuthorDate: Thu Jan 28 09:57:21 2021 +0100

    [KARAF-7007] Refactore Decanter Camel tracer as a intercept strategy
---
 ...Handler.java => DecanterInterceptStrategy.java} | 51 ++++++++++++----------
 ...est.java => DecanterInterceptStrategyTest.java} | 33 +++++---------
 collector/camel/src/test/resources/sample.xml      |  2 +-
 .../itests/collector/CamelCollectorTest.java       | 18 +++-----
 .../src/main/asciidoc/user-guide/collectors.adoc   | 34 ++++++++-------
 5 files changed, 63 insertions(+), 75 deletions(-)

diff --git a/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/DecanterTraceEventHandler.java b/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/DecanterInterceptStrategy.java
similarity index 68%
rename from collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/DecanterTraceEventHandler.java
rename to collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/DecanterInterceptStrategy.java
index e658528..bea43d8 100644
--- a/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/DecanterTraceEventHandler.java
+++ b/collector/camel/src/main/java/org/apache/karaf/decanter/collector/camel/DecanterInterceptStrategy.java
@@ -19,28 +19,42 @@ package org.apache.karaf.decanter.collector.camel;
 import java.net.InetAddress;
 import java.util.HashMap;
 
+import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.processor.interceptor.TraceEventHandler;
-import org.apache.camel.processor.interceptor.TraceInterceptor;
+import org.apache.camel.spi.InterceptStrategy;
 import org.osgi.service.event.Event;
 import org.osgi.service.event.EventAdmin;
 
-public class DecanterTraceEventHandler implements TraceEventHandler {
+public class DecanterInterceptStrategy implements InterceptStrategy {
 
-    private EventAdmin eventAdmin;
+    private EventAdmin dispatcher;
     private DefaultExchangeExtender dextender = new DefaultExchangeExtender();
     private DecanterCamelEventExtender extender;
 
     @Override
-    public void traceExchange(ProcessorDefinition<?> node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange) throws Exception {
+    public Processor wrapProcessorInInterceptors(CamelContext context, ProcessorDefinition<?> definition, Processor target, Processor nextTarget) throws Exception {
+        Processor answer = new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                send(exchange);
+                target.process(exchange);
+            }
+        };
+        return answer;
+    }
+
+    private void send(Exchange exchange) {
         HashMap<String, Object> data = new HashMap<>();
         data.put("type", "camelTracer");
         data.put("karafName", System.getProperty("karaf.name"));
-        data.put("hostAddress", InetAddress.getLocalHost().getHostAddress());
-        data.put("hostName", InetAddress.getLocalHost().getHostName());
-        data.put("nodeId", node.getId());
+        try {
+            data.put("hostAddress", InetAddress.getLocalHost().getHostAddress());
+            data.put("hostName", InetAddress.getLocalHost().getHostName());
+        } catch (Exception e) {
+            // no-op
+        }
         data.put("timestamp", System.currentTimeMillis());
         new DefaultExchangeExtender().extend(data, exchange);
         for (String property : exchange.getProperties().keySet()) {
@@ -58,30 +72,19 @@ public class DecanterTraceEventHandler implements TraceEventHandler {
             }
         }
         Event event = new Event("decanter/collect/camel/tracer", data);
-        eventAdmin.postEvent(event);
-    }
-
-    @Override
-    public Object traceExchangeIn(ProcessorDefinition<?> node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange) throws Exception {
-        traceExchange(node, target, traceInterceptor, exchange);
-        return null;
-    }
-
-    @Override
-    public void traceExchangeOut(ProcessorDefinition<?> node, Processor target, TraceInterceptor traceInterceptor, Exchange exchange, Object traceState) throws Exception {
-        traceExchange(node, target, traceInterceptor, exchange);
+        dispatcher.postEvent(event);
     }
     
-    public EventAdmin getEventAdmin() {
-        return eventAdmin;
+    public EventAdmin getDispatcher() {
+        return dispatcher;
     }
 
     public void setExtender(DecanterCamelEventExtender extender) {
         this.extender = extender;
     }
 
-    public void setEventAdmin(EventAdmin eventAdmin) {
-        this.eventAdmin = eventAdmin;
+    public void setDispatcher(EventAdmin dispatcher) {
+        this.dispatcher = dispatcher;
     }
     
     public void setIncludeBody(boolean includeBody) {
diff --git a/collector/camel/src/test/java/org/apache/karaf/decanter/collector/camel/DecanterTraceEventHandlerTest.java b/collector/camel/src/test/java/org/apache/karaf/decanter/collector/camel/DecanterInterceptStrategyTest.java
similarity index 78%
rename from collector/camel/src/test/java/org/apache/karaf/decanter/collector/camel/DecanterTraceEventHandlerTest.java
rename to collector/camel/src/test/java/org/apache/karaf/decanter/collector/camel/DecanterInterceptStrategyTest.java
index faac1d9..60f816e 100644
--- a/collector/camel/src/test/java/org/apache/karaf/decanter/collector/camel/DecanterTraceEventHandlerTest.java
+++ b/collector/camel/src/test/java/org/apache/karaf/decanter/collector/camel/DecanterInterceptStrategyTest.java
@@ -24,26 +24,24 @@ import javax.json.JsonObject;
 import javax.json.JsonReader;
 
 import org.apache.camel.Exchange;
-import org.apache.camel.LoggingLevel;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.processor.interceptor.TraceEventHandler;
-import org.apache.camel.processor.interceptor.Tracer;
+import org.apache.camel.spi.InterceptStrategy;
 import org.apache.karaf.decanter.marshaller.json.JsonMarshaller;
 import org.junit.Assert;
 import org.junit.Test;
 import org.osgi.service.event.Event;
 
-public class DecanterTraceEventHandlerTest {
+public class DecanterInterceptStrategyTest {
 
     @Test
     public void testTracer() throws Exception {
         JsonMarshaller marshaller = new JsonMarshaller();
         MockEventAdmin eventAdmin = new MockEventAdmin();
-        DecanterTraceEventHandler handler = new DecanterTraceEventHandler();
-        handler.setEventAdmin(eventAdmin);
-        DefaultCamelContext camelContext = createCamelContext(handler);
+        DecanterInterceptStrategy tracer = new DecanterInterceptStrategy();
+        tracer.setDispatcher(eventAdmin);
+        DefaultCamelContext camelContext = createCamelContext(tracer);
 
         ProducerTemplate template = camelContext.createProducerTemplate();
         template.sendBodyAndHeader("direct:start", "TEST", "header", "test");
@@ -73,21 +71,20 @@ public class DecanterTraceEventHandlerTest {
     public void testTracerWithExtender() throws Exception {
         MockEventAdmin eventAdmin = new MockEventAdmin();
         TestExtender extender = new TestExtender();
-        DecanterTraceEventHandler handler = new DecanterTraceEventHandler();
-        handler.setExtender(extender);
-        handler.setEventAdmin(eventAdmin);
-        DefaultCamelContext camelContext = createCamelContext(handler);
+        DecanterInterceptStrategy tracer = new DecanterInterceptStrategy();
+        tracer.setExtender(extender);
+        tracer.setDispatcher(eventAdmin);
+        DefaultCamelContext camelContext = createCamelContext(tracer);
 
         ProducerTemplate template = camelContext.createProducerTemplate();
         template.sendBodyAndHeader("direct:start", "TEST", "header", "test");
 
-        Assert.assertEquals(2, eventAdmin.getPostEvents().size());
+        Assert.assertEquals(1, eventAdmin.getPostEvents().size());
 
         Assert.assertEquals("test", eventAdmin.getPostEvents().get(0).getProperty("extender-test"));
-        Assert.assertEquals("test", eventAdmin.getPostEvents().get(1).getProperty("extender-test"));
     }
 
-    private DefaultCamelContext createCamelContext(TraceEventHandler handler) throws Exception {
+    private DefaultCamelContext createCamelContext(InterceptStrategy tracer) throws Exception {
         RouteBuilder builder = new RouteBuilder() {
             @Override
             public void configure() throws Exception {
@@ -97,13 +94,7 @@ public class DecanterTraceEventHandlerTest {
         DefaultCamelContext camelContext = new DefaultCamelContext();
         camelContext.setName("test-context");
         camelContext.addRoutes(builder);
-        Tracer tracer = new Tracer();
-        tracer.setEnabled(true);
-        tracer.setTraceOutExchanges(true);
-        tracer.setLogLevel(LoggingLevel.OFF);
-        tracer.addTraceHandler(handler);
-        camelContext.setTracing(true);
-        camelContext.setDefaultTracer(tracer);
+        camelContext.addInterceptStrategy(tracer);
         camelContext.start();
         return camelContext;
     }
diff --git a/collector/camel/src/test/resources/sample.xml b/collector/camel/src/test/resources/sample.xml
index 1d6af23..dd0b5c3 100644
--- a/collector/camel/src/test/resources/sample.xml
+++ b/collector/camel/src/test/resources/sample.xml
@@ -21,7 +21,7 @@
 
     <reference id="dispatcher" interface="org.osgi.service.event.EventAdmin"/>
 
-    <bean id="traceHandler" class="org.apache.karaf.decanter.collector.camel.DecanterTraceEventHandler">
+    <bean id="traceHandler" class="org.apache.karaf.decanter.collector.camel.DecanterInterceptStrategy">
         <property name="dispatcher" ref="dispatcher"/>
     </bean>
 
diff --git a/itest/src/test/java/org/apache/karaf/decanter/itests/collector/CamelCollectorTest.java b/itest/src/test/java/org/apache/karaf/decanter/itests/collector/CamelCollectorTest.java
index 2ac30a0..2b211d2 100644
--- a/itest/src/test/java/org/apache/karaf/decanter/itests/collector/CamelCollectorTest.java
+++ b/itest/src/test/java/org/apache/karaf/decanter/itests/collector/CamelCollectorTest.java
@@ -16,13 +16,11 @@
  */
 package org.apache.karaf.decanter.itests.collector;
 
-import org.apache.camel.LoggingLevel;
 import org.apache.camel.ProducerTemplate;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.processor.interceptor.Tracer;
 import org.apache.karaf.decanter.collector.camel.DecanterEventNotifier;
-import org.apache.karaf.decanter.collector.camel.DecanterTraceEventHandler;
+import org.apache.karaf.decanter.collector.camel.DecanterInterceptStrategy;
 import org.apache.karaf.itests.KarafTestSupport;
 import org.apache.karaf.jaas.boot.principal.RolePrincipal;
 import org.junit.Assert;
@@ -78,8 +76,8 @@ public class CamelCollectorTest extends KarafTestSupport {
 
         // create route with tracer
         EventAdmin eventAdmin = getOsgiService(EventAdmin.class);
-        DecanterTraceEventHandler handler = new DecanterTraceEventHandler();
-        handler.setEventAdmin(eventAdmin);
+        DecanterInterceptStrategy tracer = new DecanterInterceptStrategy();
+        tracer.setDispatcher(eventAdmin);
 
         RouteBuilder routeBuilder = new RouteBuilder() {
             @Override
@@ -90,20 +88,14 @@ public class CamelCollectorTest extends KarafTestSupport {
         DefaultCamelContext camelContext = new DefaultCamelContext();
         camelContext.setName("context-test");
         camelContext.addRoutes(routeBuilder);
-        Tracer tracer = new Tracer();
-        tracer.setEnabled(true);
-        tracer.setTraceOutExchanges(true);
-        tracer.setLogLevel(LoggingLevel.OFF);
-        tracer.addTraceHandler(handler);
-        camelContext.setTracing(true);
-        camelContext.setDefaultTracer(tracer);
+        camelContext.addInterceptStrategy(tracer);
         camelContext.start();
 
         // send a exchange into the route
         ProducerTemplate producerTemplate = camelContext.createProducerTemplate();
         producerTemplate.sendBodyAndHeader("direct:test", "This is a test", "testHeader", "testValue");
 
-        Assert.assertEquals(2, received.size());
+        Assert.assertEquals(1, received.size());
 
         Assert.assertEquals("decanter/collect/camel/tracer", received.get(0).getTopic());
         Assert.assertEquals("context-test", received.get(0).getProperty("camelContextName"));
diff --git a/manual/src/main/asciidoc/user-guide/collectors.adoc b/manual/src/main/asciidoc/user-guide/collectors.adoc
index 10d9831..713d19a 100644
--- a/manual/src/main/asciidoc/user-guide/collectors.adoc
+++ b/manual/src/main/asciidoc/user-guide/collectors.adoc
@@ -467,19 +467,25 @@ Decanter provides a Camel Tracer Handler that you can set on a Camel Tracer. It
 
 ===== Camel Tracer
 
-If you enable the tracer on a Camel route, all tracer events (exchanges on each step of the route) are sent to the
-appenders.
+Decanter Camel Tracer is actually an intercept strategy.
 
-The `decanter-collector-camel` feature provides the Camel Tracer Handler:
+It catches all exchanges in the route. If you enable the tracer on a Camel route, all events (exchanges on each step of the route) are sent to the dispatcher.
+
+The `decanter-collector-camel` feature provides the Decanter Camel intercept strategy:
 
 ----
 karaf@root()> feature:install decanter-collector-camel
 ----
 
-Now, you can use the Decanter Camel Tracer Handler in a tracer that you can use in routes.
+You just have to register Decanter intercept strategy in your Camel Context:
+
+----
+DecanterInterceptStrategy decanterCamelTracer = new DecanterInterceptStrategy();
+decanterCamelTracer.setDispatcher(eventAdmin);
+camelContext.addInterceptStrategy(decanterCamelTracer);
+----
 
-For instance, the following route definition shows how to enable tracer on a route, and use the Decanter Tracer Handler
-in the Camel Tracer:
+This is an example of a complete route with Decanter Camel intercept strategy:
 
 ----
 <?xml version="1.0" encoding="UTF-8"?>
@@ -487,18 +493,14 @@ in the Camel Tracer:
 
     <reference id="dispatcher" interface="org.osgi.service.event.EventAdmin"/>
 
-    <bean id="traceHandler" class="org.apache.karaf.decanter.collector.camel.DecanterTraceEventHandler">
+    <bean id="decanterInterceptor" class="org.apache.karaf.decanter.collector.camel.DecanterInterceptStrategy">
         <property name="dispatcher" ref="dispatcher"/>
     </bean>
 
-    <bean id="tracer" class="org.apache.camel.processor.interceptor.Tracer">
-        <property name="traceHandler" ref="traceHandler"/>
-        <property name="enabled" value="true"/>
-        <property name="traceOutExchanges" value="true"/>
-        <property name="logLevel" value="OFF"/>
-    </bean>
-
-    <camelContext trace="true" xmlns="http://camel.apache.org/schema/blueprint">
+    <camelContext xmlns="http://camel.apache.org/schema/blueprint">
+       <interceptStrategy>
+          <bean ref="decanterInterceptor"/>
+        </interceptStrategy>
         <route id="test">
             <from uri="timer:fire?period=10000"/>
             <setBody><constant>Hello World</constant></setBody>
@@ -519,7 +521,7 @@ public interface DecanterCamelEventExtender {
 }
 ----
 
-You can inject your extender using `setExtender(myExtender)` on the `DecanterTraceEventHandler`. Decanter will automatically
+You can inject your extender using `setExtender(myExtender)` on the `DecanterInterceptStrategy`. Decanter will automatically
 call your extender to populate extra properties.
 
 ===== Camel Event Notifier