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 17:29:18 UTC

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

Repository: camel
Updated Branches:
  refs/heads/master f8ef4eb1a -> ddfecf079


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

Branch: refs/heads/master
Commit: c445edcfb073db5df7439508efed84b9c483115f
Parents: f8ef4eb
Author: Claus Ibsen <da...@apache.org>
Authored: Tue Mar 29 17:09:53 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Mar 29 17:09:53 2016 +0200

----------------------------------------------------------------------
 .../apache/camel/zipkin/ZipkinTwoRouteTest.java | 70 ++++++++++++++++++++
 1 file changed, 70 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/c445edcf/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinTwoRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinTwoRouteTest.java b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinTwoRouteTest.java
new file mode 100644
index 0000000..c7bdb9c
--- /dev/null
+++ b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/ZipkinTwoRouteTest.java
@@ -0,0 +1,70 @@
+/**
+ * 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
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.apache.camel.CamelContext;
+import org.apache.camel.RoutesBuilder;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+
+public class ZipkinTwoRouteTest extends CamelTestSupport {
+
+    private ZipkinEventNotifier zipkin;
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        zipkin = new ZipkinEventNotifier();
+        // we have 2 routes as services
+        zipkin.addServiceMapping("seda:cat", "cat");
+        zipkin.addServiceMapping("seda:dog", "dog");
+        // capture message body as well
+        zipkin.setIncludeMessageBody(true);
+        zipkin.setSpanCollector(new ZipkinLoggingSpanCollector());
+        context.getManagementStrategy().addEventNotifier(zipkin);
+
+        return context;
+    }
+
+    @Test
+    public void testZipkinRoute() throws Exception {
+        template.requestBody("direct:start", "Camel say hello Cat");
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("seda:cat");
+
+                from("seda:cat").routeId("cat")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(1000,2000)}"))
+                        .setBody().constant("Cat says hello Dog")
+                        .to("seda:dog");
+
+                from("seda:dog").routeId("dog")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(0,500)}"))
+                        .setBody().constant("Dog say hello Cat and Camel");
+            }
+        };
+    }
+}


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

Posted by da...@apache.org.
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/ddfecf07
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/ddfecf07
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/ddfecf07

Branch: refs/heads/master
Commit: ddfecf079d4f4f4b3f804d8cc4aa95c1093e0d36
Parents: c445edc
Author: Claus Ibsen <da...@apache.org>
Authored: Tue Mar 29 17:28:45 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Tue Mar 29 17:28:45 2016 +0200

----------------------------------------------------------------------
 components/camel-zipkin/pom.xml                 | 18 ++++-
 .../camel/zipkin/ZipkinEventNotifier.java       | 41 +++++++++++-
 .../scribe/ZipkinAutoConfigureScribe.java       | 69 ++++++++++++++++++++
 3 files changed, 125 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/ddfecf07/components/camel-zipkin/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/pom.xml b/components/camel-zipkin/pom.xml
index 0027d3a..be6ab4b 100644
--- a/components/camel-zipkin/pom.xml
+++ b/components/camel-zipkin/pom.xml
@@ -15,7 +15,8 @@
   See the License for the specific language governing permissions and
   limitations under the License.
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
   <modelVersion>4.0.0</modelVersion>
 
@@ -68,6 +69,21 @@
 
   </dependencies>
 
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-surefire-plugin</artifactId>
+        <configuration>
+          <!-- needed for testing auto configure -->
+          <environmentVariables>
+            <ZIPKIN_SERVICE_HOST>192.168.99.100</ZIPKIN_SERVICE_HOST>
+            <ZIPKIN_SERVICE_PORT>9401</ZIPKIN_SERVICE_PORT>
+          </environmentVariables>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
   <profiles>
     <profile>
       <id>scribe-test</id>

http://git-wip-us.apache.org/repos/asf/camel/blob/ddfecf07/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 5dd38e7..ed3efa7 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
@@ -29,8 +29,10 @@ 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.github.kristofa.brave.scribe.ScribeSpanCollector;
 import com.twitter.zipkin.gen.Span;
 import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 import org.apache.camel.StatefulService;
@@ -44,6 +46,7 @@ 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.ObjectHelper;
 import org.apache.camel.util.ServiceHelper;
 
 import static org.apache.camel.builder.ExpressionBuilder.routeIdExpression;
@@ -66,10 +69,18 @@ import static org.apache.camel.builder.ExpressionBuilder.routeIdExpression;
  * If no mapping has been configured then Camel will fallback and use endpoint uri's as service names.
  * However its recommended to configure service mappings so you can use human logic names instead of Camel
  * endpoint uris in the names.
+ * <p/>
+ * Camel will auto-configure a {@link ScribeSpanCollector} if no SpanCollector has explict been configured, and
+ * if the hostname and port has been configured as environment variables
+ * <ul>
+ *     <li>ZIPKIN_SERVICE_HOST - The hostname</li>
+ *     <li>ZIPKIN_SERVICE_PORT - The port number</li>
+ * </ul>
  */
 @ManagedResource(description = "Managing ZipkinEventNotifier")
-public class ZipkinEventNotifier extends EventNotifierSupport implements StatefulService {
+public class ZipkinEventNotifier extends EventNotifierSupport implements StatefulService, CamelContextAware {
 
+    private CamelContext camelContext;
     private float rate = 1.0f;
     private SpanCollector spanCollector;
     private Map<String, String> serviceMappings = new HashMap<>();
@@ -81,6 +92,14 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu
     public ZipkinEventNotifier() {
     }
 
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
     public float getRate() {
         return rate;
     }
@@ -130,7 +149,7 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu
      * See more details at the class javadoc.
      *
      * @param pattern  the pattern such as route id, endpoint url
-     * @param serviceName the zpkin service name
+     * @param serviceName the zipkin service name
      */
     public void addServiceMapping(String pattern, String serviceName) {
         serviceMappings.put(pattern, serviceName);
@@ -146,6 +165,8 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu
 
     /**
      * Adds an exclude pattern that will disable tracing with zipkin for Camel messages that matches the pattern.
+     *
+     * @param pattern  the pattern such as route id, endpoint url
      */
     public void addExcludePattern(String pattern) {
         excludePatterns.add(pattern);
@@ -171,6 +192,22 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu
     protected void doStart() throws Exception {
         super.doStart();
 
+        ObjectHelper.notNull(camelContext, "CamelContext", this);
+
+        if (spanCollector == null) {
+            // is there a zipkin service setup as ENV variable to auto register a scribe span collector
+            // use the {{service:name}} function that resolves this for us
+            String host = camelContext.resolvePropertyPlaceholders("{{service.host:zipkin}}");
+            String port = camelContext.resolvePropertyPlaceholders("{{service.port:zipkin}}");
+            if (ObjectHelper.isNotEmpty(host) && ObjectHelper.isNotEmpty(port)) {
+                log.info("Auto-configuring ZipkinScribeSpanCollector using host: {} and port: {}", host, port);
+                int num = camelContext.getTypeConverter().mandatoryConvertTo(Integer.class, port);
+                spanCollector = new ScribeSpanCollector(host, num);
+            }
+        }
+
+        ObjectHelper.notNull(spanCollector, "SpanCollector", this);
+
         if (serviceMappings.isEmpty()) {
             log.warn("No service name(s) has been configured. Camel will fallback and use endpoint uris as service names.");
             useFallbackServiceNames = true;

http://git-wip-us.apache.org/repos/asf/camel/blob/ddfecf07/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinAutoConfigureScribe.java
----------------------------------------------------------------------
diff --git a/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinAutoConfigureScribe.java b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinAutoConfigureScribe.java
new file mode 100644
index 0000000..db70c62
--- /dev/null
+++ b/components/camel-zipkin/src/test/java/org/apache/camel/zipkin/scribe/ZipkinAutoConfigureScribe.java
@@ -0,0 +1,69 @@
+/**
+ * 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
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.apache.camel.CamelContext;
+import org.apache.camel.RoutesBuilder;
+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 ZipkinAutoConfigureScribe extends CamelTestSupport {
+
+    private ZipkinEventNotifier zipkin;
+
+    @Override
+    protected CamelContext createCamelContext() throws Exception {
+        CamelContext context = super.createCamelContext();
+
+        zipkin = new ZipkinEventNotifier();
+        // we have one route as service
+        zipkin.addServiceMapping("seda:cat", "cat");
+        // should auto configure as we have not setup a spanCollector
+        context.getManagementStrategy().addEventNotifier(zipkin);
+
+        return context;
+    }
+
+    @Test
+    public void testZipkinRoute() throws Exception {
+        template.requestBody("direct:start", "Hello Cat");
+    }
+
+    @Override
+    protected RoutesBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start").to("seda:cat");
+
+                from("seda:cat").routeId("cat")
+                        .log("routing at ${routeId}")
+                        .delay(simple("${random(1000,2000)}"));
+            }
+        };
+    }
+}