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/5a92de6e
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/5a92de6e
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/5a92de6e

Branch: refs/heads/master
Commit: 5a92de6edb880b610c9c85d72a29175cdbe97e5c
Parents: a336ee9
Author: Claus Ibsen <davscl...@apache.org>
Authored: Tue Mar 29 11:06:56 2016 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Tue Mar 29 14:41:54 2016 +0200

----------------------------------------------------------------------
 .../zipkin/ZipkinClientRequestAdapter.java      |   4 +-
 .../camel/zipkin/ZipkinEventNotifier.java       | 191 ++++++++++++-------
 .../zipkin/ZipkinServerRequestAdapter.java      |   4 +-
 .../zipkin/scribe/ZipkinOneRouteScribe.java     |  80 ++++++++
 .../scribe/ZipkinRouteConcurrentScribe.java     |  10 +-
 .../zipkin/scribe/ZipkinSimpleRouteScribe.java  |   8 +-
 .../zipkin/scribe/ZipkinTimerRouteScribe.java   |  78 ++++++++
 .../src/test/resources/log4j.properties         |   4 +-
 8 files changed, 298 insertions(+), 81 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/5a92de6e/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 08e1679..e6e30477 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
@@ -64,7 +64,7 @@ public final class ZipkinClientRequestAdapter implements 
ClientRequestAdapter {
 
     @Override
     public Collection<KeyValueAnnotation> requestAnnotations() {
-        String msgId = exchange.getIn().getMessageId();
-        return 
Collections.singletonList(KeyValueAnnotation.create("camel.message.id", msgId));
+        String id = exchange.getExchangeId();
+        return 
Collections.singletonList(KeyValueAnnotation.create("camel.exchange.id", id));
     }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/5a92de6e/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 97c57c2..ad0742e 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
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.zipkin;
 
+import java.io.Closeable;
 import java.util.EventObject;
 import java.util.HashMap;
 import java.util.Map;
@@ -23,6 +24,8 @@ import java.util.Map;
 import com.github.kristofa.brave.Brave;
 import com.github.kristofa.brave.ClientSpanThreadBinder;
 import com.github.kristofa.brave.Sampler;
+import com.github.kristofa.brave.ServerSpan;
+import com.github.kristofa.brave.ServerSpanThreadBinder;
 import com.github.kristofa.brave.SpanCollector;
 import com.twitter.zipkin.gen.Span;
 import org.apache.camel.CamelContext;
@@ -35,6 +38,8 @@ import org.apache.camel.management.event.ExchangeSendingEvent;
 import org.apache.camel.management.event.ExchangeSentEvent;
 import org.apache.camel.support.EventNotifierSupport;
 import org.apache.camel.util.EndpointHelper;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.ServiceHelper;
 
 import static org.apache.camel.builder.ExpressionBuilder.routeIdExpression;
 
@@ -45,8 +50,8 @@ import static 
org.apache.camel.builder.ExpressionBuilder.routeIdExpression;
  * 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>
+ * <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)}
@@ -122,6 +127,19 @@ public class ZipkinEventNotifier extends 
EventNotifierSupport {
                 braves.put(serviceName, brave);
             }
         }
+
+        ServiceHelper.startService(spanCollector);
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        super.doStop();
+
+        // stop and close collector
+        ServiceHelper.stopAndShutdownService(spanCollector);
+        if (spanCollector instanceof Closeable) {
+            IOHelper.close((Closeable) spanCollector);
+        }
     }
 
     @Override
@@ -134,16 +152,7 @@ public class ZipkinEventNotifier extends 
EventNotifierSupport {
         String answer = null;
 
         String id = routeIdExpression().evaluate(exchange, String.class);
-        for (Map.Entry<String, String> entry : serviceMappings.entrySet()) {
-            String pattern = entry.getKey();
-            if (EndpointHelper.matchPattern(pattern, id)) {
-                answer = entry.getValue();
-                break;
-            }
-        }
-
-        if (answer == null) {
-            id = exchange.getFromRouteId();
+        if (id != null) {
             for (Map.Entry<String, String> entry : serviceMappings.entrySet()) 
{
                 String pattern = entry.getKey();
                 if (EndpointHelper.matchPattern(pattern, id)) {
@@ -153,24 +162,41 @@ public class ZipkinEventNotifier extends 
EventNotifierSupport {
             }
         }
 
+        if (answer == null) {
+            id = exchange.getFromRouteId();
+            if (id != null) {
+                for (Map.Entry<String, String> entry : 
serviceMappings.entrySet()) {
+                    String pattern = entry.getKey();
+                    if (EndpointHelper.matchPattern(pattern, id)) {
+                        answer = entry.getValue();
+                        break;
+                    }
+                }
+            }
+        }
+
         if (answer == null && endpoint != null) {
             String url = endpoint.getEndpointUri();
-            for (Map.Entry<String, String> entry : serviceMappings.entrySet()) 
{
-                String pattern = entry.getKey();
-                if (EndpointHelper.matchEndpoint(exchange.getContext(), url, 
pattern)) {
-                    answer = entry.getValue();
-                    break;
+            if (url != null) {
+                for (Map.Entry<String, String> entry : 
serviceMappings.entrySet()) {
+                    String pattern = entry.getKey();
+                    if (EndpointHelper.matchEndpoint(exchange.getContext(), 
url, pattern)) {
+                        answer = entry.getValue();
+                        break;
+                    }
                 }
             }
         }
 
         if (answer == null && exchange.getFromEndpoint() != null) {
             String url = exchange.getFromEndpoint().getEndpointUri();
-            for (Map.Entry<String, String> entry : serviceMappings.entrySet()) 
{
-                String pattern = entry.getKey();
-                if (EndpointHelper.matchEndpoint(exchange.getContext(), url, 
pattern)) {
-                    answer = entry.getValue();
-                    break;
+            if (url != null) {
+                for (Map.Entry<String, String> entry : 
serviceMappings.entrySet()) {
+                    String pattern = entry.getKey();
+                    if (EndpointHelper.matchEndpoint(exchange.getContext(), 
url, pattern)) {
+                        answer = entry.getValue();
+                        break;
+                    }
                 }
             }
         }
@@ -189,73 +215,98 @@ public class ZipkinEventNotifier extends 
EventNotifierSupport {
     @Override
     public void notify(EventObject event) throws Exception {
         if (event instanceof ExchangeSendingEvent) {
-            clientRequest((ExchangeSendingEvent) event);
+            ExchangeSendingEvent ese = (ExchangeSendingEvent) event;
+            String serviceName = getServiceName(ese.getExchange(), 
ese.getEndpoint());
+            Brave brave = getBrave(serviceName);
+            if (brave != null) {
+                clientRequest(brave, serviceName, ese);
+            }
         } else if (event instanceof ExchangeSentEvent) {
-            clientResponse((ExchangeSentEvent) event);
+            ExchangeSentEvent ese = (ExchangeSentEvent) event;
+            String serviceName = getServiceName(ese.getExchange(), 
ese.getEndpoint());
+            Brave brave = getBrave(serviceName);
+            if (brave != null) {
+                clientResponse(brave, serviceName, ese);
+            }
         } else if (event instanceof ExchangeCreatedEvent) {
-            serverRequest((ExchangeCreatedEvent) event);
+            ExchangeCreatedEvent ece = (ExchangeCreatedEvent) event;
+            String serviceName = getServiceName(ece.getExchange(), null);
+            Brave brave = getBrave(serviceName);
+            if (brave != null) {
+                serverRequest(brave, serviceName, ece);
+            }
         } else if (event instanceof ExchangeCompletedEvent) {
-            serverResponse((ExchangeCompletedEvent) event);
+            ExchangeCompletedEvent ece = (ExchangeCompletedEvent) event;
+            String serviceName = getServiceName(ece.getExchange(), null);
+            Brave brave = getBrave(serviceName);
+            if (brave != null) {
+                serverResponse(brave, serviceName, ece);
+            }
         } else if (event instanceof ExchangeFailedEvent) {
-            serverResponse((ExchangeFailedEvent) event);
+            ExchangeFailedEvent efe = (ExchangeFailedEvent) event;
+            String serviceName = getServiceName(efe.getExchange(), null);
+            Brave brave = getBrave(serviceName);
+            if (brave != null) {
+                serverResponse(brave, serviceName, efe);
+            }
         }
     }
 
-    private void clientRequest(ExchangeSendingEvent event) {
-        String serviceName = getServiceName(event.getExchange(), 
event.getEndpoint());
-        Brave brave = getBrave(serviceName);
-        if (brave != null) {
-            ClientSpanThreadBinder binder = brave.clientSpanThreadBinder();
-            brave.clientRequestInterceptor().handle(new 
ZipkinClientRequestAdapter(serviceName, event.getExchange(), 
event.getEndpoint()));
-            Span span = binder.getCurrentClientSpan();
-            event.getExchange().setProperty("CamelZipkinSpan", span);
+    private void clientRequest(Brave brave, String serviceName, 
ExchangeSendingEvent event) {
+        ClientSpanThreadBinder binder = brave.clientSpanThreadBinder();
+        brave.clientRequestInterceptor().handle(new 
ZipkinClientRequestAdapter(serviceName, event.getExchange(), 
event.getEndpoint()));
+        Span span = binder.getCurrentClientSpan();
+        event.getExchange().setProperty("CamelZipkinClientSpan", span);
+
+        if (log.isDebugEnabled()) {
+            log.debug("clientRequest: service={}, id={} ", serviceName, span 
!= null ? span.getId() : "<null>");
         }
     }
 
-    private void clientResponse(ExchangeSentEvent event) {
-        String serviceName = getServiceName(event.getExchange(), 
event.getEndpoint());
-        Brave brave = getBrave(serviceName);
-        if (brave != null) {
-            ClientSpanThreadBinder binder = brave.clientSpanThreadBinder();
-            Span span = event.getExchange().getProperty("CamelZipkinSpan", 
Span.class);
-            binder.setCurrentSpan(span);
-            brave.clientResponseInterceptor().handle(new 
ZipkinClientResponseAdaptor(event.getExchange(), event.getEndpoint()));
-            binder.setCurrentSpan(null);
+    private void clientResponse(Brave brave, String serviceName, 
ExchangeSentEvent event) {
+        ClientSpanThreadBinder binder = brave.clientSpanThreadBinder();
+        Span span = event.getExchange().getProperty("CamelZipkinClientSpan", 
Span.class);
+        binder.setCurrentSpan(span);
+        brave.clientResponseInterceptor().handle(new 
ZipkinClientResponseAdaptor(event.getExchange(), event.getEndpoint()));
+        binder.setCurrentSpan(null);
+
+        if (log.isDebugEnabled()) {
+            log.debug("clientResponse: service={}, id={} ", serviceName, span 
!= null ? span.getId() : "<null>");
         }
     }
 
-    private void serverRequest(ExchangeCreatedEvent event) {
-        String serviceName = getServiceName(event.getExchange(), null);
-        Brave brave = getBrave(serviceName);
-        if (brave != null) {
-            ClientSpanThreadBinder binder = brave.clientSpanThreadBinder();
-            brave.serverRequestInterceptor().handle(new 
ZipkinServerRequestAdapter(event.getExchange()));
-            Span span = binder.getCurrentClientSpan();
-            event.getExchange().setProperty("CamelZipkinSpan", span);
+    private void serverRequest(Brave brave, String serviceName, 
ExchangeCreatedEvent event) {
+        ServerSpanThreadBinder binder = brave.serverSpanThreadBinder();
+        brave.serverRequestInterceptor().handle(new 
ZipkinServerRequestAdapter(event.getExchange()));
+        ServerSpan span = binder.getCurrentServerSpan();
+        event.getExchange().setProperty("CamelZipkinServerSpan", span);
+
+        if (log.isDebugEnabled()) {
+            log.debug("serverRequest: service={}, id={} ", serviceName, span 
!= null ? span.getSpan().getId() : "<null>");
         }
     }
 
-    private void serverResponse(ExchangeCompletedEvent event) {
-        String serviceName = getServiceName(event.getExchange(), null);
-        Brave brave = getBrave(serviceName);
-        if (brave != null) {
-            ClientSpanThreadBinder binder = brave.clientSpanThreadBinder();
-            Span span = event.getExchange().getProperty("CamelZipkinSpan", 
Span.class);
-            binder.setCurrentSpan(span);
-            brave.serverResponseInterceptor().handle(new 
ZipkinServerResponseAdapter(event.getExchange()));
-            binder.setCurrentSpan(null);
+    private void serverResponse(Brave brave, String serviceName, 
ExchangeCompletedEvent event) {
+        ServerSpanThreadBinder binder = brave.serverSpanThreadBinder();
+        ServerSpan span = 
event.getExchange().getProperty("CamelZipkinServerSpan", ServerSpan.class);
+        binder.setCurrentSpan(span);
+        brave.serverResponseInterceptor().handle(new 
ZipkinServerResponseAdapter(event.getExchange()));
+        binder.setCurrentSpan(null);
+
+        if (log.isDebugEnabled()) {
+            log.debug("serverResponse: service={}, id={} ", serviceName, span 
!= null ? span.getSpan().getId() : "<null>");
         }
     }
 
-    private void serverResponse(ExchangeFailedEvent event) {
-        String serviceName = getServiceName(event.getExchange(), null);
-        Brave brave = getBrave(serviceName);
-        if (brave != null) {
-            ClientSpanThreadBinder binder = brave.clientSpanThreadBinder();
-            Span span = event.getExchange().getProperty("CamelZipkinSpan", 
Span.class);
-            binder.setCurrentSpan(span);
-            brave.serverResponseInterceptor().handle(new 
ZipkinServerResponseAdapter(event.getExchange()));
-            binder.setCurrentSpan(null);
+    private void serverResponse(Brave brave, String serviceName, 
ExchangeFailedEvent event) {
+        ServerSpanThreadBinder binder = brave.serverSpanThreadBinder();
+        ServerSpan span = 
event.getExchange().getProperty("CamelZipkinServerSpan", ServerSpan.class);
+        binder.setCurrentSpan(span);
+        brave.serverResponseInterceptor().handle(new 
ZipkinServerResponseAdapter(event.getExchange()));
+        binder.setCurrentSpan(null);
+
+        if (log.isDebugEnabled()) {
+            log.debug("serverResponse: service={}, id={} ", serviceName, span 
!= null ? span.getSpan().getId() : "<null>");
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/5a92de6e/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 fa67ddb..c5daef9 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
@@ -62,8 +62,8 @@ public class ZipkinServerRequestAdapter implements 
ServerRequestAdapter {
 
     @Override
     public Collection<KeyValueAnnotation> requestAnnotations() {
-        String msgId = exchange.getIn().getMessageId();
-        return 
Collections.singletonList(KeyValueAnnotation.create("camel.message.id", msgId));
+        String id = exchange.getExchangeId();
+        return 
Collections.singletonList(KeyValueAnnotation.create("camel.exchange.id", id));
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/5a92de6e/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinOneRouteScribe.java
----------------------------------------------------------------------
diff --git 
a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinOneRouteScribe.java
 
b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinOneRouteScribe.java
new file mode 100644
index 0000000..c14a026
--- /dev/null
+++ 
b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinOneRouteScribe.java
@@ -0,0 +1,80 @@
+/**
+ * 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
+ *
+ * Adjust the IP address to what IP docker-machines have assigned, you can use
+ * <tt>docker-machines ls</tt>
+ */
+public class ZipkinOneRouteScribe extends CamelTestSupport {
+
+    private String ip = "192.168.99.100";
+    private ZipkinEventNotifier zipkin;
+
+    // TODO: producer template also
+    // TODO: message id added x2
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        zipkin = new ZipkinEventNotifier();
+        zipkin.addServiceMapping("seda:cat", "cat");
+        zipkin.setSpanCollector(new ScribeSpanCollector(ip, 9410));
+        context.getManagementStrategy().addEventNotifier(zipkin);
+
+        return context;
+    }
+
+    @Test
+    public void testZipkinRoute() throws Exception {
+        NotifyBuilder notify = new NotifyBuilder(context).whenDone(1).create();
+
+        for (int i = 0; i < 1; i++) {
+            template.sendBody("seda:cat", "Hello Cat");
+        }
+
+        assertTrue(notify.matches(30, TimeUnit.SECONDS));
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("seda:cat").routeId("cat")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(1000,2000)}"));
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/5a92de6e/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
index d371547..65fdfdf 100644
--- 
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
@@ -31,9 +31,13 @@ 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
+ *
+ * Adjust the IP address to what IP docker-machines have assigned, you can use
+ * <tt>docker-machines ls</tt>
  */
 public class ZipkinRouteConcurrentScribe extends CamelTestSupport {
 
+    private String ip = "192.168.99.100";
     private ZipkinEventNotifier zipkin;
 
     @Override
@@ -43,7 +47,7 @@ public class ZipkinRouteConcurrentScribe extends 
CamelTestSupport {
         zipkin = new ZipkinEventNotifier();
         zipkin.addServiceMapping("seda:foo", "foo");
         zipkin.addServiceMapping("seda:bar", "bar");
-        zipkin.setSpanCollector(new ScribeSpanCollector("192.168.99.101", 
9410));
+        zipkin.setSpanCollector(new ScribeSpanCollector(ip, 9410));
         context.getManagementStrategy().addEventNotifier(zipkin);
 
         return context;
@@ -65,12 +69,12 @@ public class ZipkinRouteConcurrentScribe extends 
CamelTestSupport {
         return new RouteBuilder() {
             @Override
             public void configure() throws Exception {
-                from("seda:foo").routeId("foo")
+                from("seda:foo?concurrentConsumers=5").routeId("foo")
                         .log("routing at ${routeId}")
                         .delay(simple("${random(1000,2000)}"))
                         .to("seda:bar");
 
-                from("seda:bar").routeId("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/5a92de6e/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
index 3d91927..fc898c8 100644
--- 
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
@@ -31,9 +31,13 @@ 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
+ *
+ * Adjust the IP address to what IP docker-machines have assigned, you can use
+ * <tt>docker-machines ls</tt>
  */
 public class ZipkinSimpleRouteScribe extends CamelTestSupport {
 
+    private String ip = "192.168.99.100";
     private ZipkinEventNotifier zipkin;
 
     @Override
@@ -42,7 +46,7 @@ public class ZipkinSimpleRouteScribe extends CamelTestSupport 
{
 
         zipkin = new ZipkinEventNotifier();
         zipkin.addServiceMapping("seda:dude", "dude");
-        zipkin.setSpanCollector(new ScribeSpanCollector("192.168.99.101", 
9410));
+        zipkin.setSpanCollector(new ScribeSpanCollector(ip, 9410));
         context.getManagementStrategy().addEventNotifier(zipkin);
 
         return context;
@@ -50,7 +54,7 @@ public class ZipkinSimpleRouteScribe extends CamelTestSupport 
{
 
     @Test
     public void testZipkinRoute() throws Exception {
-        NotifyBuilder notify = new 
NotifyBuilder(context).whenDone(10).create();
+        NotifyBuilder notify = new NotifyBuilder(context).whenDone(5).create();
 
         for (int i = 0; i < 5; i++) {
             template.sendBody("seda:dude", "Hello World");

http://git-wip-us.apache.org/repos/asf/camel/blob/5a92de6e/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinTimerRouteScribe.java
----------------------------------------------------------------------
diff --git 
a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinTimerRouteScribe.java
 
b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinTimerRouteScribe.java
new file mode 100644
index 0000000..a822b08
--- /dev/null
+++ 
b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinTimerRouteScribe.java
@@ -0,0 +1,78 @@
+/**
+ * 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.ExchangePattern;
+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
+ *
+ * Adjust the IP address to what IP docker-machines have assigned, you can use
+ * <tt>docker-machines ls</tt>
+ */
+public class ZipkinTimerRouteScribe extends CamelTestSupport {
+
+    private String ip = "192.168.99.100";
+    private ZipkinEventNotifier zipkin;
+
+    // TODO: producer template also (add a skip flag)
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        zipkin = new ZipkinEventNotifier();
+        zipkin.addServiceMapping("seda:timer", "timer");
+        zipkin.setSpanCollector(new ScribeSpanCollector(ip, 9410));
+        context.getManagementStrategy().addEventNotifier(zipkin);
+
+        return context;
+    }
+
+    @Test
+    public void testZipkinRoute() throws Exception {
+        NotifyBuilder notify = new 
NotifyBuilder(context).from("seda:timer").whenDone(1).create();
+
+        assertTrue(notify.matches(30, TimeUnit.SECONDS));
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("timer:trigger?repeatCount=1").setBody().constant("Hello 
Cat").to(ExchangePattern.InOut, "seda:timer");
+
+                from("seda:timer").routeId("timer")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(1000,2000)}"));
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/5a92de6e/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 5d05c44..538c5bd 100644
--- a/components/camel-zipkin/src/test/resources/log4j.properties
+++ b/components/camel-zipkin/src/test/resources/log4j.properties
@@ -18,10 +18,10 @@
 #
 # The logging properties used
 #
-log4j.rootLogger=INFO, file
+log4j.rootLogger=INFO, out
 
 #log4j.logger.org.apache.camel=DEBUG
-#log4j.logger.org.apache.camel.zipkin=DEBUG
+log4j.logger.org.apache.camel.zipkin=DEBUG
 #log4j.logger.com.github.kristofa.brave=DEBUG
 
 # CONSOLE appender not used by default

Reply via email to