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/82ead72b Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/82ead72b Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/82ead72b Branch: refs/heads/master Commit: 82ead72ba5f5006898453ed7104cebf77635bcef Parents: 70633c4 Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Mar 30 09:25:06 2016 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Mar 30 11:12:28 2016 +0200 ---------------------------------------------------------------------- .../zipkin/starter/ZipkinAutoConfiguration.java | 8 +- .../starter/ZipkinConfigurationProperties.java | 12 +++ .../camel/zipkin/ZipkinEventNotifier.java | 89 ++++++++++++-------- examples/camel-example-zipkin/pom.xml | 2 +- .../java/sample/camel/HelloCamelRouter.java | 7 +- .../java/sample/camel/ReplyCamelRouter.java | 39 +++++++++ .../src/main/resources/application.properties | 11 ++- 7 files changed, 130 insertions(+), 38 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/82ead72b/components/camel-zipkin-starter/src/main/java/org/apache/camel/zipkin/starter/ZipkinAutoConfiguration.java ---------------------------------------------------------------------- diff --git a/components/camel-zipkin-starter/src/main/java/org/apache/camel/zipkin/starter/ZipkinAutoConfiguration.java b/components/camel-zipkin-starter/src/main/java/org/apache/camel/zipkin/starter/ZipkinAutoConfiguration.java index c640068..31cac0d 100644 --- a/components/camel-zipkin-starter/src/main/java/org/apache/camel/zipkin/starter/ZipkinAutoConfiguration.java +++ b/components/camel-zipkin-starter/src/main/java/org/apache/camel/zipkin/starter/ZipkinAutoConfiguration.java @@ -17,6 +17,7 @@ package org.apache.camel.zipkin.starter; import org.apache.camel.CamelContext; +import org.apache.camel.util.ObjectHelper; import org.apache.camel.zipkin.ZipkinEventNotifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -39,7 +40,12 @@ public class ZipkinAutoConfiguration { notifier.setHostName(configurationProperties.getHostName()); notifier.setPort(configurationProperties.getPort()); notifier.setRate(configurationProperties.getRate()); - notifier.setServiceName(configurationProperties.getServiceName()); + if (ObjectHelper.isNotEmpty(configurationProperties.getServiceName())) { + notifier.setServiceName(configurationProperties.getServiceName()); + } + if (ObjectHelper.isNotEmpty(configurationProperties.getExcludePattern())) { + notifier.addExcludePattern(configurationProperties.getExcludePattern()); + } notifier.setIncludeMessageBody(configurationProperties.isIncludeMessageBody()); // register the bean into CamelContext http://git-wip-us.apache.org/repos/asf/camel/blob/82ead72b/components/camel-zipkin-starter/src/main/java/org/apache/camel/zipkin/starter/ZipkinConfigurationProperties.java ---------------------------------------------------------------------- diff --git a/components/camel-zipkin-starter/src/main/java/org/apache/camel/zipkin/starter/ZipkinConfigurationProperties.java b/components/camel-zipkin-starter/src/main/java/org/apache/camel/zipkin/starter/ZipkinConfigurationProperties.java index 0714819..5d9f4fa 100644 --- a/components/camel-zipkin-starter/src/main/java/org/apache/camel/zipkin/starter/ZipkinConfigurationProperties.java +++ b/components/camel-zipkin-starter/src/main/java/org/apache/camel/zipkin/starter/ZipkinConfigurationProperties.java @@ -26,6 +26,7 @@ public class ZipkinConfigurationProperties { private float rate = 1.0f; private boolean includeMessageBody; private String serviceName; + private String excludePattern; public String getHostName() { return hostName; @@ -87,4 +88,15 @@ public class ZipkinConfigurationProperties { public void setServiceName(String serviceName) { this.serviceName = serviceName; } + + public String getExcludePattern() { + return excludePattern; + } + + /** + * Sets an exclude pattern that will disable tracing with zipkin for Camel messages that matches the pattern. + */ + public void setExcludePattern(String excludePattern) { + this.excludePattern = excludePattern; + } } http://git-wip-us.apache.org/repos/asf/camel/blob/82ead72b/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 27286fa..3d91c6f 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 @@ -285,35 +285,38 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu private String getServiceName(Exchange exchange, Endpoint endpoint) { String answer = null; - String id = routeIdExpression().evaluate(exchange, String.class); - if (id != null) { - // exclude patterns take precedence - for (String pattern : excludePatterns) { - if (EndpointHelper.matchPattern(id, pattern)) { - return null; + // endpoint takes precedence over route + if (endpoint != null) { + String url = endpoint.getEndpointUri(); + if (url != null) { + // exclude patterns take precedence + for (String pattern : excludePatterns) { + if (EndpointHelper.matchEndpoint(exchange.getContext(), url, pattern)) { + return null; + } } - } - for (Map.Entry<String, String> entry : serviceMappings.entrySet()) { - String pattern = entry.getKey(); - if (EndpointHelper.matchPattern(id, pattern)) { - answer = entry.getValue(); - break; + 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) { - id = exchange.getFromRouteId(); - if (id != null) { + if (answer == null && exchange.getFromEndpoint() != null) { + String url = exchange.getFromEndpoint().getEndpointUri(); + if (url != null) { // exclude patterns take precedence for (String pattern : excludePatterns) { - if (EndpointHelper.matchPattern(id, pattern)) { + if (EndpointHelper.matchEndpoint(exchange.getContext(), url, pattern)) { return null; } } for (Map.Entry<String, String> entry : serviceMappings.entrySet()) { String pattern = entry.getKey(); - if (EndpointHelper.matchPattern(id, pattern)) { + if (EndpointHelper.matchEndpoint(exchange.getContext(), url, pattern)) { answer = entry.getValue(); break; } @@ -321,18 +324,19 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu } } - if (answer == null && endpoint != null) { - String url = endpoint.getEndpointUri(); - if (url != null) { + // route + if (answer == null) { + String id = routeIdExpression().evaluate(exchange, String.class); + if (id != null) { // exclude patterns take precedence for (String pattern : excludePatterns) { - if (EndpointHelper.matchPattern(url, pattern)) { + if (EndpointHelper.matchPattern(id, pattern)) { return null; } } for (Map.Entry<String, String> entry : serviceMappings.entrySet()) { String pattern = entry.getKey(); - if (EndpointHelper.matchEndpoint(exchange.getContext(), url, pattern)) { + if (EndpointHelper.matchPattern(id, pattern)) { answer = entry.getValue(); break; } @@ -340,18 +344,18 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu } } - if (answer == null && exchange.getFromEndpoint() != null) { - String url = exchange.getFromEndpoint().getEndpointUri(); - if (url != null) { + if (answer == null) { + String id = exchange.getFromRouteId(); + if (id != null) { // exclude patterns take precedence for (String pattern : excludePatterns) { - if (EndpointHelper.matchPattern(url, pattern)) { + if (EndpointHelper.matchPattern(id, pattern)) { return null; } } for (Map.Entry<String, String> entry : serviceMappings.entrySet()) { String pattern = entry.getKey(); - if (EndpointHelper.matchEndpoint(exchange.getContext(), url, pattern)) { + if (EndpointHelper.matchPattern(id, pattern)) { answer = entry.getValue(); break; } @@ -453,7 +457,11 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu event.getExchange().setProperty(key, span); if (log.isDebugEnabled()) { - log.debug("clientRequest\t[service={}, spanId={}]", serviceName, span != null ? span.getId() : "<null>"); + String id = "<null>"; + if (span != null) { + id = "" + span.getId(); + } + log.debug("clientRequest\t[service={}, spanId={}]", serviceName, id); } } @@ -466,8 +474,11 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu binder.setCurrentSpan(null); if (log.isDebugEnabled()) { - // one space to align client vs server in the logs - log.debug("clientResponse\t[service={}, spanId={}]", serviceName, span != null ? span.getId() : "<null>"); + String id = "<null>"; + if (span != null) { + id = "" + span.getId(); + } + log.debug("clientResponse\t[service={}, spanId={}]", serviceName, id); } } @@ -479,7 +490,11 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu event.getExchange().setProperty(key, span); if (log.isDebugEnabled()) { - log.debug("serverRequest\t[service={}, spanId={}]", serviceName, span != null ? span.getSpan().getId() : "<null>"); + String id = "<null>"; + if (span != null && span.getSpan() != null) { + id = "" + span.getSpan().getId(); + } + log.debug("serverRequest\t[service={}, spanId={}]", serviceName, id); } } @@ -492,7 +507,11 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu binder.setCurrentSpan(null); if (log.isDebugEnabled()) { - log.debug("serverResponse\t[service={}, spanId={}]\t[status=exchangeCompleted]", serviceName, span != null ? span.getSpan().getId() : "<null>"); + String id = "<null>"; + if (span != null && span.getSpan() != null) { + id = "" + span.getSpan().getId(); + } + log.debug("serverResponse\t[service={}, spanId={}]\t[status=exchangeCompleted]", serviceName, id); } } @@ -505,7 +524,11 @@ public class ZipkinEventNotifier extends EventNotifierSupport implements Statefu binder.setCurrentSpan(null); if (log.isDebugEnabled()) { - log.debug("serverResponse[service={}, spanId={}]\t[status=exchangeFailed]", serviceName, span != null ? span.getSpan().getId() : "<null>"); + String id = "<null>"; + if (span != null && span.getSpan() != null) { + id = "" + span.getSpan().getId(); + } + log.debug("serverResponse[service={}, spanId={}]\t[status=exchangeFailed]", serviceName, id); } } http://git-wip-us.apache.org/repos/asf/camel/blob/82ead72b/examples/camel-example-zipkin/pom.xml ---------------------------------------------------------------------- diff --git a/examples/camel-example-zipkin/pom.xml b/examples/camel-example-zipkin/pom.xml index 618d346..a965769 100644 --- a/examples/camel-example-zipkin/pom.xml +++ b/examples/camel-example-zipkin/pom.xml @@ -58,7 +58,7 @@ <!-- spring-web --> <dependency> <groupId>org.springframework.boot</groupId> - <artifactId>spring-boot-starter-web</artifactId> + <artifactId>spring-boot-starter</artifactId> </dependency> <!-- camel --> http://git-wip-us.apache.org/repos/asf/camel/blob/82ead72b/examples/camel-example-zipkin/src/main/java/sample/camel/HelloCamelRouter.java ---------------------------------------------------------------------- diff --git a/examples/camel-example-zipkin/src/main/java/sample/camel/HelloCamelRouter.java b/examples/camel-example-zipkin/src/main/java/sample/camel/HelloCamelRouter.java index e1a82fa..17f9bf6 100644 --- a/examples/camel-example-zipkin/src/main/java/sample/camel/HelloCamelRouter.java +++ b/examples/camel-example-zipkin/src/main/java/sample/camel/HelloCamelRouter.java @@ -16,6 +16,7 @@ */ package sample.camel; +import org.apache.camel.ExchangePattern; import org.apache.camel.builder.RouteBuilder; import org.springframework.stereotype.Component; @@ -29,9 +30,11 @@ public class HelloCamelRouter extends RouteBuilder { @Override public void configure() throws Exception { - from("timer:hello?period={{timer.period}}") + from("timer:hello?period={{timer.period}}").routeId("client") + .setExchangePattern(ExchangePattern.InOut) .transform(method("myBean", "saySomething")) - .to("stream:out"); + .log("Saying ${body}") + .to("seda:hello"); } } http://git-wip-us.apache.org/repos/asf/camel/blob/82ead72b/examples/camel-example-zipkin/src/main/java/sample/camel/ReplyCamelRouter.java ---------------------------------------------------------------------- diff --git a/examples/camel-example-zipkin/src/main/java/sample/camel/ReplyCamelRouter.java b/examples/camel-example-zipkin/src/main/java/sample/camel/ReplyCamelRouter.java new file mode 100644 index 0000000..1cab297 --- /dev/null +++ b/examples/camel-example-zipkin/src/main/java/sample/camel/ReplyCamelRouter.java @@ -0,0 +1,39 @@ +/** + * 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 sample.camel; + +import org.apache.camel.builder.RouteBuilder; +import org.springframework.stereotype.Component; + +/** + * A simple Camel route that triggers from a timer and calls a bean and prints to system out. + * <p/> + * Use <tt>@Component</tt> to make Camel auto detect this route when starting. + */ +@Component +public class ReplyCamelRouter extends RouteBuilder { + + @Override + public void configure() throws Exception { + from("seda:hello").routeId("server") + .delay(simple("${random(1000,2000)}")) + .transform(simple("You said ${body}")) + .log("Replying with ${body}"); + + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/82ead72b/examples/camel-example-zipkin/src/main/resources/application.properties ---------------------------------------------------------------------- diff --git a/examples/camel-example-zipkin/src/main/resources/application.properties b/examples/camel-example-zipkin/src/main/resources/application.properties index 6d46306..39f6bd5 100644 --- a/examples/camel-example-zipkin/src/main/resources/application.properties +++ b/examples/camel-example-zipkin/src/main/resources/application.properties @@ -16,15 +16,22 @@ # # the name of Camel -camel.springboot.name = ZipkinCamel +camel.springboot.name=ZipkinCamel +camel.springboot.main-run-controller=true # configure zipkin camel.zipkin.host-name=192.168.99.100 camel.zipkin.port=9410 camel.zipkin.service-name=hello +# the timer is just to trigger new requests ( +camel.zipkin.exclude-pattern=timer:hello* +# include the message body in the zipkin traces camel.zipkin.include-message-body=true +# logging to see the zipkin client/server events and span-ids +logging.level.org.apache.camel.zipkin: DEBUG + # properties used in the Camel route and beans # -------------------------------------------- @@ -33,3 +40,5 @@ greeting = Hello World # how often to trigger the timer timer.period = 2000 + +