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 2016/03/29 14:45:12 UTC

[05/12] camel git commit: CAMEL-9759: camel-zipkin - Instrument Camel. Work in progress.

CAMEL-9759: camel-zipkin - Instrument Camel. Work in progress.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a336ee9c
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a336ee9c
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a336ee9c

Branch: refs/heads/master
Commit: a336ee9cc39f22fccfeca27f6219672ffe564a95
Parents: 3a4087c
Author: Claus Ibsen <da...@apache.org>
Authored: Tue Mar 29 09:18:55 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Mar 29 14:41:54 2016 +0200

----------------------------------------------------------------------
 components/camel-zipkin/pom.xml                 | 23 ++++++
 .../zipkin/ZipkinClientRequestAdapter.java      |  2 +-
 .../zipkin/ZipkinClientResponseAdaptor.java     |  2 +-
 .../camel/zipkin/ZipkinEventNotifier.java       | 20 ++++-
 .../org/apache/camel/zipkin/ZipkinHelper.java   |  3 +
 .../zipkin/ZipkinLoggingSpanCollector.java      |  5 +-
 .../zipkin/ZipkinServerRequestAdapter.java      |  2 +-
 .../zipkin/ZipkinServerResponseAdapter.java     |  2 +-
 .../camel/zipkin/ZipkinRouteConcurrentTest.java | 72 ++++++++++++++++++
 .../camel/zipkin/ZipkinRouteScribeTest.java     | 73 ------------------
 .../apache/camel/zipkin/ZipkinRouteTest.java    | 72 ------------------
 .../camel/zipkin/ZipkinSimpleRouteTest.java     | 66 ++++++++++++++++
 .../scribe/ZipkinRouteConcurrentScribe.java     | 79 ++++++++++++++++++++
 .../zipkin/scribe/ZipkinSimpleRouteScribe.java  | 73 ++++++++++++++++++
 .../src/test/resources/log4j.properties         |  4 +-
 15 files changed, 343 insertions(+), 155 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/pom.xml b/components/camel-zipkin/pom.xml
index 567626a..bd82334 100644
--- a/components/camel-zipkin/pom.xml
+++ b/components/camel-zipkin/pom.xml
@@ -67,4 +67,27 @@
 
   </dependencies>
 
+  <profiles>
+    <profile>
+      <id>scribe-test</id>
+      <build>
+        <plugins>
+          <plugin>
+            <artifactId>maven-surefire-plugin</artifactId>
+            <configuration>
+              <childDelegation>false</childDelegation>
+              <useFile>true</useFile>
+              <forkCount>1</forkCount>
+              <reuseForks>true</reuseForks>
+              <forkedProcessTimeoutInSeconds>300</forkedProcessTimeoutInSeconds>
+              <includes>
+                <include>**/*ScribeTest.java</include>
+              </includes>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
 </project>

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinClientRequestAdapter.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinClientRequestAdapter.java b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinClientRequestAdapter.java
index 5254578..08e1679 100644
--- a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinClientRequestAdapter.java
+++ b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinClientRequestAdapter.java
@@ -65,6 +65,6 @@ public final class ZipkinClientRequestAdapter implements ClientRequestAdapter {
     @Override
     public Collection<KeyValueAnnotation> requestAnnotations() {
         String msgId = exchange.getIn().getMessageId();
-        return Collections.singletonList(KeyValueAnnotation.create("CamelMessageId", msgId));
+        return Collections.singletonList(KeyValueAnnotation.create("camel.message.id", msgId));
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinClientResponseAdaptor.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinClientResponseAdaptor.java b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinClientResponseAdaptor.java
index daddeff..296c021 100644
--- a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinClientResponseAdaptor.java
+++ b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinClientResponseAdaptor.java
@@ -37,7 +37,7 @@ public class ZipkinClientResponseAdaptor implements ClientResponseAdapter {
     @Override
     public Collection<KeyValueAnnotation> responseAnnotations() {
         if (exchange.getException() != null) {
-            return Collections.singletonList(KeyValueAnnotation.create("CamelZipkinFailed", exchange.getException().getMessage()));
+            return Collections.singletonList(KeyValueAnnotation.create("camel.failure", exchange.getException().getMessage()));
         } else {
             return Collections.emptyList();
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinEventNotifier.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinEventNotifier.java b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinEventNotifier.java
index 30b8ca1..97c57c2 100644
--- a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinEventNotifier.java
+++ b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinEventNotifier.java
@@ -25,6 +25,7 @@ import com.github.kristofa.brave.ClientSpanThreadBinder;
 import com.github.kristofa.brave.Sampler;
 import com.github.kristofa.brave.SpanCollector;
 import com.twitter.zipkin.gen.Span;
+import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.management.event.ExchangeCompletedEvent;
@@ -37,6 +38,21 @@ import org.apache.camel.util.EndpointHelper;
 
 import static org.apache.camel.builder.ExpressionBuilder.routeIdExpression;
 
+/**
+ * To use zipkin with Camel then setup this {@link org.apache.camel.spi.EventNotifier} in your Camel application.
+ * <p/>
+ * Events (span) are captured for incoming and outgoing messages being sent to/from Camel.
+ * This means you need to configure which which Camel endpoints that maps to zipkin service names.
+ * The mapping can be configured using
+ * <ul>
+ *     <li>route id - A Camel route id</li>
+ *     <li>endpoint url - A Camel endpoint url</li>
+ * </ul>
+ * For both kinds you can use wildcards and regular expressions to match, which is using the rules from
+ * {@link EndpointHelper#matchPattern(String, String)} and {@link EndpointHelper#matchEndpoint(CamelContext, String, String)}
+ * <p/>
+ * At least one mapping must be configured, you can use <tt>*</tt> to match all incoming and outgoing messages.
+ */
 public class ZipkinEventNotifier extends EventNotifierSupport {
 
     private float rate = 1.0f;
@@ -79,8 +95,8 @@ public class ZipkinEventNotifier extends EventNotifierSupport {
         this.serviceMappings = serviceMappings;
     }
 
-    public void addServiceMapping(String routeId, String serviceName) {
-        serviceMappings.put(routeId, serviceName);
+    public void addServiceMapping(String pattern, String serviceName) {
+        serviceMappings.put(pattern, serviceName);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinHelper.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinHelper.java b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinHelper.java
index d5c8c57..2fe33e4 100644
--- a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinHelper.java
+++ b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinHelper.java
@@ -19,6 +19,9 @@ package org.apache.camel.zipkin;
 import com.github.kristofa.brave.IdConversion;
 import com.github.kristofa.brave.SpanId;
 
+/**
+ * Helper class.
+ */
 public final class ZipkinHelper {
 
     private ZipkinHelper() {

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinLoggingSpanCollector.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinLoggingSpanCollector.java b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinLoggingSpanCollector.java
index 71d551a..f77156c 100644
--- a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinLoggingSpanCollector.java
+++ b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinLoggingSpanCollector.java
@@ -16,8 +16,6 @@
  */
 package org.apache.camel.zipkin;
 
-import java.text.SimpleDateFormat;
-import java.util.Date;
 import java.util.LinkedHashSet;
 import java.util.Set;
 
@@ -28,6 +26,9 @@ import com.twitter.zipkin.gen.Span;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * To collect zipkin span's using a logger.
+ */
 public class ZipkinLoggingSpanCollector implements SpanCollector {
 
     private final Set<BinaryAnnotation> defaultAnnotations = new LinkedHashSet<BinaryAnnotation>();

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinServerRequestAdapter.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinServerRequestAdapter.java b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinServerRequestAdapter.java
index c6ec850..fa67ddb 100644
--- a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinServerRequestAdapter.java
+++ b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinServerRequestAdapter.java
@@ -63,7 +63,7 @@ public class ZipkinServerRequestAdapter implements ServerRequestAdapter {
     @Override
     public Collection<KeyValueAnnotation> requestAnnotations() {
         String msgId = exchange.getIn().getMessageId();
-        return Collections.singletonList(KeyValueAnnotation.create("CamelMessageId", msgId));
+        return Collections.singletonList(KeyValueAnnotation.create("camel.message.id", msgId));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinServerResponseAdapter.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinServerResponseAdapter.java b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinServerResponseAdapter.java
index 8cb5b67..2ba8594 100644
--- a/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinServerResponseAdapter.java
+++ b/components/camel-zipkin/src/main/java/org/apache/camel/zipkin/ZipkinServerResponseAdapter.java
@@ -37,7 +37,7 @@ public class ZipkinServerResponseAdapter implements ServerResponseAdapter {
     @Override
     public Collection<KeyValueAnnotation> responseAnnotations() {
         if (exchange.getException() != null) {
-            return Collections.singletonList(KeyValueAnnotation.create("failure", exchange.getException().getMessage()));
+            return Collections.singletonList(KeyValueAnnotation.create("camel.failure", exchange.getException().getMessage()));
         } else {
             return Collections.emptyList();
         }

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteConcurrentTest.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteConcurrentTest.java b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteConcurrentTest.java
new file mode 100644
index 0000000..6db0a0e
--- /dev/null
+++ b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteConcurrentTest.java
@@ -0,0 +1,72 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.zipkin;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.NotifyBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class ZipkinRouteConcurrentTest extends CamelTestSupport {
+
+    private ZipkinEventNotifier zipkin;
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        zipkin = new ZipkinEventNotifier();
+        zipkin.addServiceMapping("seda:foo", "foo");
+        zipkin.addServiceMapping("seda:bar", "bar");
+        zipkin.setSpanCollector(new ZipkinLoggingSpanCollector());
+        context.getManagementStrategy().addEventNotifier(zipkin);
+
+        return context;
+    }
+
+    @Test
+    public void testZipkinRoute() throws Exception {
+        NotifyBuilder notify = new NotifyBuilder(context).whenDone(5).create();
+
+        for (int i = 0; i < 5; i++) {
+            template.sendBody("seda:foo", "Hello World");
+        }
+
+        assertTrue(notify.matches(30, TimeUnit.SECONDS));
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("seda:foo?concurrentConsumers=5").routeId("foo")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(1000,2000)}"))
+                        .to("seda:bar");
+
+                from("seda:bar?concurrentConsumers=5").routeId("bar")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(0,500)}"));
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteScribeTest.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteScribeTest.java b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteScribeTest.java
deleted file mode 100644
index 94d2ca4..0000000
--- a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteScribeTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.zipkin;
-
-import java.util.concurrent.TimeUnit;
-
-import com.github.kristofa.brave.scribe.ScribeSpanCollector;
-import org.apache.camel.CamelContext;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.NotifyBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.Test;
-
-public class ZipkinRouteScribeTest extends CamelTestSupport {
-
-    private ZipkinEventNotifier zipkin;
-
-    @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = super.createCamelContext();
-
-        zipkin = new ZipkinEventNotifier();
-        zipkin.addServiceMapping("seda:foo", "foo");
-        zipkin.addServiceMapping("seda:bar", "bar");
-        zipkin.setSpanCollector(new ScribeSpanCollector("192.168.99.101", 9410));
-        context.getManagementStrategy().addEventNotifier(zipkin);
-
-        return context;
-    }
-
-    @Test
-    public void testZipkinRoute() throws Exception {
-        NotifyBuilder notify = new NotifyBuilder(context).whenDone(10).create();
-
-        for (int i = 0; i < 5; i++) {
-            template.sendBody("seda:foo", "Hello World");
-        }
-
-        assertTrue(notify.matches(60, TimeUnit.SECONDS));
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("seda:foo").routeId("foo")
-                        .log("routing at ${routeId}")
-                        .delay(simple("${random(1000,2000)}"))
-                        .to("seda:bar");
-
-                from("seda:bar").routeId("bar")
-                        .log("routing at ${routeId}")
-                        .delay(simple("${random(0,500)}"));
-            }
-        };
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteTest.java b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteTest.java
deleted file mode 100644
index 15a4a41..0000000
--- a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinRouteTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- * <p/>
- * http://www.apache.org/licenses/LICENSE-2.0
- * <p/>
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.zipkin;
-
-import java.util.concurrent.TimeUnit;
-
-import org.apache.camel.CamelContext;
-import org.apache.camel.RoutesBuilder;
-import org.apache.camel.builder.NotifyBuilder;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.test.junit4.CamelTestSupport;
-import org.junit.Test;
-
-public class ZipkinRouteTest extends CamelTestSupport {
-
-    private ZipkinEventNotifier zipkin;
-
-    @Override
-    protected CamelContext createCamelContext() throws Exception {
-        CamelContext context = super.createCamelContext();
-
-        zipkin = new ZipkinEventNotifier();
-        zipkin.addServiceMapping("seda:foo", "foo");
-        zipkin.addServiceMapping("seda:bar", "bar");
-        zipkin.setSpanCollector(new ZipkinLoggingSpanCollector());
-        context.getManagementStrategy().addEventNotifier(zipkin);
-
-        return context;
-    }
-
-    @Test
-    public void testZipkinRoute() throws Exception {
-        NotifyBuilder notify = new NotifyBuilder(context).whenDone(10).create();
-
-        for (int i = 0; i < 5; i++) {
-            template.sendBody("seda:foo", "Hello World");
-        }
-
-        assertTrue(notify.matches(30, TimeUnit.SECONDS));
-    }
-
-    @Override
-    protected RoutesBuilder createRouteBuilder() throws Exception {
-        return new RouteBuilder() {
-            @Override
-            public void configure() throws Exception {
-                from("seda:foo?concurrentConsumers=5").routeId("foo")
-                        .log("routing at ${routeId}")
-                        .delay(simple("${random(1000,2000)}"))
-                        .to("seda:bar");
-
-                from("seda:bar?concurrentConsumers=5").routeId("bar")
-                        .log("routing at ${routeId}")
-                        .delay(simple("${random(0,500)}"));
-            }
-        };
-    }
-}

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinSimpleRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinSimpleRouteTest.java b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinSimpleRouteTest.java
new file mode 100644
index 0000000..0c719cc
--- /dev/null
+++ b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinSimpleRouteTest.java
@@ -0,0 +1,66 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.zipkin;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.NotifyBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class ZipkinSimpleRouteTest extends CamelTestSupport {
+
+    private ZipkinEventNotifier zipkin;
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        zipkin = new ZipkinEventNotifier();
+        zipkin.addServiceMapping("seda:dude", "dude");
+        zipkin.setSpanCollector(new ZipkinLoggingSpanCollector());
+        context.getManagementStrategy().addEventNotifier(zipkin);
+
+        return context;
+    }
+
+    @Test
+    public void testZipkinRoute() throws Exception {
+        NotifyBuilder notify = new NotifyBuilder(context).whenDone(5).create();
+
+        for (int i = 0; i < 5; i++) {
+            template.sendBody("seda:dude", "Hello World");
+        }
+
+        assertTrue(notify.matches(30, TimeUnit.SECONDS));
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("seda:dude").routeId("dude")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(1000,2000)}"));
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinRouteConcurrentScribe.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinRouteConcurrentScribe.java b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinRouteConcurrentScribe.java
new file mode 100644
index 0000000..d371547
--- /dev/null
+++ b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinRouteConcurrentScribe.java
@@ -0,0 +1,79 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.zipkin.scribe;
+
+import java.util.concurrent.TimeUnit;
+
+import com.github.kristofa.brave.scribe.ScribeSpanCollector;
+import org.apache.camel.CamelContext;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.NotifyBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.zipkin.ZipkinEventNotifier;
+import org.junit.Test;
+
+/**
+ * Integration test requires running Zipkin/Scribe running
+ *
+ * The easiest way is to run using zipkin-docker: https://github.com/openzipkin/docker-zipkin
+ */
+public class ZipkinRouteConcurrentScribe extends CamelTestSupport {
+
+    private ZipkinEventNotifier zipkin;
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        zipkin = new ZipkinEventNotifier();
+        zipkin.addServiceMapping("seda:foo", "foo");
+        zipkin.addServiceMapping("seda:bar", "bar");
+        zipkin.setSpanCollector(new ScribeSpanCollector("192.168.99.101", 9410));
+        context.getManagementStrategy().addEventNotifier(zipkin);
+
+        return context;
+    }
+
+    @Test
+    public void testZipkinRoute() throws Exception {
+        NotifyBuilder notify = new NotifyBuilder(context).whenDone(5).create();
+
+        for (int i = 0; i < 5; i++) {
+            template.sendBody("seda:foo", "Hello World");
+        }
+
+        assertTrue(notify.matches(60, TimeUnit.SECONDS));
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("seda:foo").routeId("foo")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(1000,2000)}"))
+                        .to("seda:bar");
+
+                from("seda:bar").routeId("bar")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(0,500)}"));
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinSimpleRouteScribe.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinSimpleRouteScribe.java b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinSimpleRouteScribe.java
new file mode 100644
index 0000000..3d91927
--- /dev/null
+++ b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinSimpleRouteScribe.java
@@ -0,0 +1,73 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * <p/>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p/>
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.zipkin.scribe;
+
+import java.util.concurrent.TimeUnit;
+
+import com.github.kristofa.brave.scribe.ScribeSpanCollector;
+import org.apache.camel.CamelContext;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.NotifyBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.apache.camel.zipkin.ZipkinEventNotifier;
+import org.junit.Test;
+
+/**
+ * Integration test requires running Zipkin/Scribe running
+ *
+ * The easiest way is to run using zipkin-docker: https://github.com/openzipkin/docker-zipkin
+ */
+public class ZipkinSimpleRouteScribe extends CamelTestSupport {
+
+    private ZipkinEventNotifier zipkin;
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        zipkin = new ZipkinEventNotifier();
+        zipkin.addServiceMapping("seda:dude", "dude");
+        zipkin.setSpanCollector(new ScribeSpanCollector("192.168.99.101", 9410));
+        context.getManagementStrategy().addEventNotifier(zipkin);
+
+        return context;
+    }
+
+    @Test
+    public void testZipkinRoute() throws Exception {
+        NotifyBuilder notify = new NotifyBuilder(context).whenDone(10).create();
+
+        for (int i = 0; i < 5; i++) {
+            template.sendBody("seda:dude", "Hello World");
+        }
+
+        assertTrue(notify.matches(30, TimeUnit.SECONDS));
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("seda:dude").routeId("dude")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(1000,2000)}"));
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/a336ee9c/components/camel-zipkin/src/test/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/test/resources/log4j.properties b/components/camel-zipkin/src/test/resources/log4j.properties
index 69b028b..5d05c44 100644
--- a/components/camel-zipkin/src/test/resources/log4j.properties
+++ b/components/camel-zipkin/src/test/resources/log4j.properties
@@ -18,11 +18,11 @@
 #
 # The logging properties used
 #
-log4j.rootLogger=INFO, out
+log4j.rootLogger=INFO, file
 
 #log4j.logger.org.apache.camel=DEBUG
 #log4j.logger.org.apache.camel.zipkin=DEBUG
-log4j.logger.com.github.kristofa.brave=DEBUG
+#log4j.logger.com.github.kristofa.brave=DEBUG
 
 # CONSOLE appender not used by default
 log4j.appender.out=org.apache.log4j.ConsoleAppender