Repository: camel
Updated Branches:
  refs/heads/master bf1b57ca2 -> f97c6af6a


Update spanmanager version, add decorators and tests for other camel components


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

Branch: refs/heads/master
Commit: 84b21a8a9f20c3e87b688ca5f7f2796a60e6e123
Parents: bf1b57c
Author: Gary Brown <g...@brownuk.com>
Authored: Wed Mar 1 16:18:35 2017 +0000
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Sat Mar 4 15:59:45 2017 +0100

----------------------------------------------------------------------
 components/camel-opentracing/pom.xml            |   5 +
 .../camel/opentracing/OpenTracingTracer.java    |   8 +-
 .../decorators/AbstractHttpSpanDecorator.java   |  58 +++-
 .../decorators/AhcSpanDecorator.java            |  26 ++
 .../decorators/Http4SpanDecorator.java          |  26 ++
 .../decorators/HttpSpanDecorator.java           |  10 -
 .../decorators/JdbcSpanDecorator.java           |  43 +++
 .../decorators/JettySpanDecorator.java          |  10 -
 .../decorators/MongoDBSpanDecorator.java        |  74 +++++
 .../decorators/NettyHttp4SpanDecorator.java     |  26 ++
 .../decorators/NettyHttpSpanDecorator.java      |  26 ++
 .../decorators/RestletSpanDecorator.java        |  26 ++
 .../decorators/ServletSpanDecorator.java        |  26 ++
 .../decorators/SqlSpanDecorator.java            |  45 ++++
 .../decorators/TimerSpanDecorator.java          |  39 +++
 .../decorators/UndertowSpanDecorator.java       |  26 ++
 .../org.apache.camel.opentracing.SpanDecorator  |  11 +
 .../AbstractHttpSpanDecoratorTest.java          | 267 +++++++++++++++++++
 .../decorators/AbstractSpanDecoratorTest.java   | 100 +++++++
 .../decorators/JdbcSpanDecoratorTest.java       |  56 ++++
 .../decorators/MongoDBSpanDecoratorTest.java    |  76 ++++++
 .../decorators/SqlSpanDecoratorTest.java        |  56 ++++
 .../decorators/TimerSpanDecoratorTest.java      |  46 ++++
 parent/pom.xml                                  |   2 +-
 24 files changed, 1062 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/pom.xml
----------------------------------------------------------------------
diff --git a/components/camel-opentracing/pom.xml 
b/components/camel-opentracing/pom.xml
index 92d3d9d..384a01f 100644
--- a/components/camel-opentracing/pom.xml
+++ b/components/camel-opentracing/pom.xml
@@ -91,6 +91,11 @@
       <artifactId>log4j-slf4j-impl</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
+    </dependency>
 
   </dependencies>
 

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java
index a737499..759634f 100644
--- 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/OpenTracingTracer.java
@@ -167,7 +167,7 @@ public class OpenTracingTracer extends ServiceSupport 
implements RoutePolicyFact
                 sd.pre(span, ese.getExchange(), ese.getEndpoint());
                 tracer.inject(span.context(), Format.Builtin.TEXT_MAP,
                     new 
CamelHeadersInjectAdapter(ese.getExchange().getIn().getHeaders()));
-                spanManager.manage(span);
+                spanManager.activate(span);
                 if (LOG.isTraceEnabled()) {
                     LOG.trace("OpenTracing: start client span=" + span);
                 }
@@ -180,7 +180,7 @@ public class OpenTracingTracer extends ServiceSupport 
implements RoutePolicyFact
                 sd.post(managedSpan.getSpan(), ((ExchangeSentEvent) 
event).getExchange(),
                     ((ExchangeSentEvent) event).getEndpoint());
                 managedSpan.getSpan().finish();
-                managedSpan.release();
+                managedSpan.deactivate();
             }
         }
 
@@ -210,7 +210,7 @@ public class OpenTracingTracer extends ServiceSupport 
implements RoutePolicyFact
                 .withTag(Tags.SPAN_KIND.getKey(), Tags.SPAN_KIND_SERVER)
                 .start();
             sd.pre(span, exchange, route.getEndpoint());
-            spanManager.manage(span);
+            spanManager.activate(span);
             if (LOG.isTraceEnabled()) {
                 LOG.trace("OpenTracing: start server span=" + span);
             }
@@ -225,7 +225,7 @@ public class OpenTracingTracer extends ServiceSupport 
implements RoutePolicyFact
             SpanDecorator sd = getSpanDecorator(route.getEndpoint());
             sd.post(managedSpan.getSpan(), exchange, route.getEndpoint());
             managedSpan.getSpan().finish();
-            managedSpan.release();
+            managedSpan.deactivate();
         }
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecorator.java
index bccfade..bc16f42 100644
--- 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecorator.java
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecorator.java
@@ -18,15 +18,71 @@ package org.apache.camel.opentracing.decorators;
 
 import io.opentracing.Span;
 import io.opentracing.tag.Tags;
+
 import org.apache.camel.Endpoint;
 import org.apache.camel.Exchange;
 
 public abstract class AbstractHttpSpanDecorator extends AbstractSpanDecorator {
 
+    public static final String POST_METHOD = "POST";
+    public static final String GET_METHOD = "GET";
+
+    @Override
+    public String getOperationName(Exchange exchange, Endpoint endpoint) {
+        // Based on HTTP component documentation:
+
+        // 1. Use method provided in header.
+        Object method = exchange.getIn().getHeader(Exchange.HTTP_METHOD);
+        if (method instanceof String) {
+            return (String)method;
+        }
+
+        // 2. GET if query string is provided in header.
+        if (exchange.getIn().getHeader(Exchange.HTTP_QUERY) != null) {
+            return GET_METHOD;
+        }
+
+        // 3. GET if endpoint is configured with a query string.
+        if (endpoint.getEndpointUri().indexOf('?') != -1) {
+            return GET_METHOD;
+        }
+
+        // 4. POST if there is data to send (body is not null).
+        if (exchange.getIn().getBody() != null) {
+            return POST_METHOD;
+        }
+
+        // 5. GET otherwise.
+        return GET_METHOD;
+    }
+
     @Override
     public void pre(Span span, Exchange exchange, Endpoint endpoint) {
         super.pre(span, exchange, endpoint);
-        span.setTag(Tags.HTTP_URL.getKey(), endpoint.getEndpointUri());
+
+        String httpUrl = getHttpURL(exchange, endpoint);
+        if (httpUrl != null) {
+            span.setTag(Tags.HTTP_URL.getKey(), httpUrl);
+        }
+    }
+
+    protected String getHttpURL(Exchange exchange, Endpoint endpoint) {
+        Object url = exchange.getIn().getHeader(Exchange.HTTP_URL);
+        if (url instanceof String) {
+            return (String) url;
+        } else {
+            Object uri = exchange.getIn().getHeader(Exchange.HTTP_URI);
+            if (uri instanceof String) {
+                return (String) uri;
+            } else {
+                // Try to obtain from endpoint
+                int index = endpoint.getEndpointUri().lastIndexOf("http:");
+                if (index != -1) {
+                    return endpoint.getEndpointUri().substring(index);
+                }
+            }
+        }
+        return null;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AhcSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AhcSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AhcSpanDecorator.java
new file mode 100644
index 0000000..170a3df
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/AhcSpanDecorator.java
@@ -0,0 +1,26 @@
+/**
+ * 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.opentracing.decorators;
+
+public class AhcSpanDecorator extends AbstractHttpSpanDecorator {
+
+    @Override
+    public String getComponent() {
+        return "ahc";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/Http4SpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/Http4SpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/Http4SpanDecorator.java
new file mode 100644
index 0000000..68e0932
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/Http4SpanDecorator.java
@@ -0,0 +1,26 @@
+/**
+ * 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.opentracing.decorators;
+
+public class Http4SpanDecorator extends AbstractHttpSpanDecorator {
+
+    @Override
+    public String getComponent() {
+        return "http4";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpSpanDecorator.java
index 43eec8a..489d2c3 100644
--- 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpSpanDecorator.java
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/HttpSpanDecorator.java
@@ -16,11 +16,6 @@
  */
 package org.apache.camel.opentracing.decorators;
 
-import java.net.URI;
-
-import org.apache.camel.Endpoint;
-import org.apache.camel.Exchange;
-
 public class HttpSpanDecorator extends AbstractHttpSpanDecorator {
 
     @Override
@@ -28,9 +23,4 @@ public class HttpSpanDecorator extends 
AbstractHttpSpanDecorator {
         return "http";
     }
 
-    @Override
-    public String getOperationName(Exchange exchange, Endpoint endpoint) {
-        return URI.create(endpoint.getEndpointUri()).getPath();
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JdbcSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JdbcSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JdbcSpanDecorator.java
new file mode 100644
index 0000000..44cded4
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JdbcSpanDecorator.java
@@ -0,0 +1,43 @@
+/**
+ * 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.opentracing.decorators;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+
+import io.opentracing.Span;
+
+public class JdbcSpanDecorator extends AbstractSpanDecorator {
+
+    @Override
+    public String getComponent() {
+        return "jdbc";
+    }
+
+    @Override
+    public void pre(Span span, Exchange exchange, Endpoint endpoint) {
+        super.pre(span, exchange, endpoint);
+
+        span.setTag("db.type", "sql");
+
+        Object body = exchange.getIn().getBody();
+        if (body instanceof String) {
+            span.setTag("db.statement", (String)body);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JettySpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JettySpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JettySpanDecorator.java
index f16669b..94e279d 100644
--- 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JettySpanDecorator.java
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/JettySpanDecorator.java
@@ -16,11 +16,6 @@
  */
 package org.apache.camel.opentracing.decorators;
 
-import java.net.URI;
-
-import org.apache.camel.Endpoint;
-import org.apache.camel.Exchange;
-
 public class JettySpanDecorator extends AbstractHttpSpanDecorator {
 
     @Override
@@ -28,9 +23,4 @@ public class JettySpanDecorator extends 
AbstractHttpSpanDecorator {
         return "jetty";
     }
 
-    @Override
-    public String getOperationName(Exchange exchange, Endpoint endpoint) {
-        return 
URI.create(endpoint.getEndpointUri().substring(getComponent().length() + 
1)).getPath();
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecorator.java
new file mode 100644
index 0000000..0237535
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecorator.java
@@ -0,0 +1,74 @@
+/**
+ * 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.opentracing.decorators;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+
+import io.opentracing.Span;
+
+public class MongoDBSpanDecorator extends AbstractSpanDecorator {
+
+    @Override
+    public String getComponent() {
+        return "mongodb";
+    }
+
+    @Override
+    public String getOperationName(Exchange exchange, Endpoint endpoint) {
+        Map<String,String> queryParameters = 
toQueryParameters(endpoint.getEndpointUri());
+        String opName = queryParameters.get("operation");
+        if (opName != null) {
+            return opName;
+        }
+        return super.getOperationName(exchange, endpoint);
+    }
+
+    @Override
+    public void pre(Span span, Exchange exchange, Endpoint endpoint) {
+        super.pre(span, exchange, endpoint);
+
+        span.setTag("db.type", getComponent());
+
+        Map<String,String> queryParameters = 
toQueryParameters(endpoint.getEndpointUri());
+        String database = queryParameters.get("database");
+        if (database != null) {
+            span.setTag("db.instance", database);
+        }
+        span.setTag("db.statement", queryParameters.toString());
+    }
+
+    public static Map<String,String> toQueryParameters(String uri) {
+        int index = uri.indexOf('?');
+        if (index != -1) {
+            String queryString = uri.substring(index + 1);
+            Map<String,String> map = new HashMap<>();
+            for (String param : queryString.split("&")) {
+                String[] parts = param.split("=");
+                if (parts.length == 2) {
+                    map.put(parts[0], parts[1]);
+                }
+            }
+            return map;
+        }
+        return Collections.emptyMap();
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttp4SpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttp4SpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttp4SpanDecorator.java
new file mode 100644
index 0000000..3548d29
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttp4SpanDecorator.java
@@ -0,0 +1,26 @@
+/**
+ * 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.opentracing.decorators;
+
+public class NettyHttp4SpanDecorator extends AbstractHttpSpanDecorator {
+
+    @Override
+    public String getComponent() {
+        return "netty-http4";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttpSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttpSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttpSpanDecorator.java
new file mode 100644
index 0000000..25c632a
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/NettyHttpSpanDecorator.java
@@ -0,0 +1,26 @@
+/**
+ * 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.opentracing.decorators;
+
+public class NettyHttpSpanDecorator extends AbstractHttpSpanDecorator {
+
+    @Override
+    public String getComponent() {
+        return "netty-http";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/RestletSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/RestletSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/RestletSpanDecorator.java
new file mode 100644
index 0000000..ac83542
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/RestletSpanDecorator.java
@@ -0,0 +1,26 @@
+/**
+ * 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.opentracing.decorators;
+
+public class RestletSpanDecorator extends AbstractHttpSpanDecorator {
+
+    @Override
+    public String getComponent() {
+        return "restlet";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/ServletSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/ServletSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/ServletSpanDecorator.java
new file mode 100644
index 0000000..5adb0ae
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/ServletSpanDecorator.java
@@ -0,0 +1,26 @@
+/**
+ * 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.opentracing.decorators;
+
+public class ServletSpanDecorator extends AbstractHttpSpanDecorator {
+
+    @Override
+    public String getComponent() {
+        return "servlet";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SqlSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SqlSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SqlSpanDecorator.java
new file mode 100644
index 0000000..c814994
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/SqlSpanDecorator.java
@@ -0,0 +1,45 @@
+/**
+ * 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.opentracing.decorators;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+
+import io.opentracing.Span;
+
+public class SqlSpanDecorator extends AbstractSpanDecorator {
+
+    public static final String CAMEL_SQL_QUERY = "CamelSqlQuery";
+
+    @Override
+    public String getComponent() {
+        return "sql";
+    }
+
+    @Override
+    public void pre(Span span, Exchange exchange, Endpoint endpoint) {
+        super.pre(span, exchange, endpoint);
+
+        span.setTag("db.type", "sql");
+
+        Object sqlquery = exchange.getIn().getHeader(CAMEL_SQL_QUERY);
+        if (sqlquery instanceof String) {
+            span.setTag("db.statement", (String) sqlquery);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/TimerSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/TimerSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/TimerSpanDecorator.java
new file mode 100644
index 0000000..b7a7fd4
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/TimerSpanDecorator.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 org.apache.camel.opentracing.decorators;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+
+public class TimerSpanDecorator extends AbstractSpanDecorator {
+
+    @Override
+    public String getComponent() {
+        return "timer";
+    }
+
+    @Override
+    public String getOperationName(Exchange exchange, Endpoint endpoint) {
+        Object name = exchange.getProperty(Exchange.TIMER_NAME);
+        if (name instanceof String) {
+            return (String)name;
+        }
+
+        return super.getOperationName(exchange, endpoint);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/UndertowSpanDecorator.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/UndertowSpanDecorator.java
 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/UndertowSpanDecorator.java
new file mode 100644
index 0000000..9e8a1ae
--- /dev/null
+++ 
b/components/camel-opentracing/src/main/java/org/apache/camel/opentracing/decorators/UndertowSpanDecorator.java
@@ -0,0 +1,26 @@
+/**
+ * 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.opentracing.decorators;
+
+public class UndertowSpanDecorator extends AbstractHttpSpanDecorator {
+
+    @Override
+    public String getComponent() {
+        return "undertow";
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator
 
b/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator
index 2898102..452aaa2 100644
--- 
a/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator
+++ 
b/components/camel-opentracing/src/main/resources/META-INF/services/org.apache.camel.opentracing.SpanDecorator
@@ -15,5 +15,16 @@
 # limitations under the License.
 #
 
+org.apache.camel.opentracing.decorators.AhcSpanDecorator
+org.apache.camel.opentracing.decorators.Http4SpanDecorator
 org.apache.camel.opentracing.decorators.HttpSpanDecorator
+org.apache.camel.opentracing.decorators.JdbcSpanDecorator
 org.apache.camel.opentracing.decorators.JettySpanDecorator
+org.apache.camel.opentracing.decorators.MongoDBSpanDecorator
+org.apache.camel.opentracing.decorators.NettyHttp4SpanDecorator
+org.apache.camel.opentracing.decorators.NettyHttpSpanDecorator
+org.apache.camel.opentracing.decorators.RestletSpanDecorator
+org.apache.camel.opentracing.decorators.ServletSpanDecorator
+org.apache.camel.opentracing.decorators.SqlSpanDecorator
+org.apache.camel.opentracing.decorators.TimerSpanDecorator
+org.apache.camel.opentracing.decorators.UndertowSpanDecorator

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java
 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java
new file mode 100644
index 0000000..8c16e76
--- /dev/null
+++ 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractHttpSpanDecoratorTest.java
@@ -0,0 +1,267 @@
+/**
+ * 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.opentracing.decorators;
+
+import static org.junit.Assert.*;
+
+import java.net.URI;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.opentracing.SpanDecorator;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.opentracing.mock.MockSpan;
+import io.opentracing.mock.MockTracer;
+import io.opentracing.tag.Tags;
+
+public class AbstractHttpSpanDecoratorTest {
+
+    private static final String TEST_URI = "http://localhost:8080/test";;
+
+    @Test
+    public void testGetOperationNameFromMethodHeader() {
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(exchange.getIn()).thenReturn(message);
+        
Mockito.when(message.getHeader(Exchange.HTTP_METHOD)).thenReturn("PUT");
+
+        SpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals("PUT", decorator.getOperationName(exchange, null));
+    }
+
+    @Test
+    public void testGetOperationNameQueryStringHeader() {
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(exchange.getIn()).thenReturn(message);
+        
Mockito.when(message.getHeader(Exchange.HTTP_QUERY)).thenReturn("MyQuery");
+
+        SpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals(AbstractHttpSpanDecorator.GET_METHOD,
+                decorator.getOperationName(exchange, null));
+    }
+
+    @Test
+    public void testGetOperationNameQueryStringInEndpoint() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        
Mockito.when(endpoint.getEndpointUri()).thenReturn("http://localhost:8080/endpoint?query=hello";);
+        Mockito.when(exchange.getIn()).thenReturn(message);
+        
Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn("http://localhost:8080/endpoint?query=hello";);
+
+        SpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals(AbstractHttpSpanDecorator.GET_METHOD,
+                decorator.getOperationName(exchange, endpoint));
+    }
+
+    @Test
+    public void testGetOperationNameBodyNotNull() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI);
+        Mockito.when(exchange.getIn()).thenReturn(message);
+        
Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI);
+        Mockito.when(message.getBody()).thenReturn("Message Body");
+
+        SpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals(AbstractHttpSpanDecorator.POST_METHOD,
+                decorator.getOperationName(exchange, endpoint));
+    }
+
+    @Test
+    public void testGetOperationNameDefault() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI);
+        Mockito.when(exchange.getIn()).thenReturn(message);
+        
Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI);
+
+        SpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals(AbstractHttpSpanDecorator.GET_METHOD,
+                decorator.getOperationName(exchange, endpoint));
+    }
+
+    @Test
+    public void testPreUri() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI);
+        Mockito.when(exchange.getIn()).thenReturn(message);
+        
Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI);
+
+        SpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        MockTracer tracer = new MockTracer();
+        MockSpan span = (MockSpan)tracer.buildSpan("TestSpan").start();
+
+        decorator.pre(span, exchange, endpoint);
+
+        assertEquals(TEST_URI, span.tags().get(Tags.HTTP_URL.getKey()));
+    }
+
+    @Test
+    public void testGetHttpURLFromHeaderUrl() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI);
+        Mockito.when(exchange.getIn()).thenReturn(message);
+        Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn("Another 
URL");
+        
Mockito.when(message.getHeader(Exchange.HTTP_URL)).thenReturn(TEST_URI);
+
+        AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint));
+    }
+
+    @Test
+    public void testGetHttpURLFromHeaderUri() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI);
+        Mockito.when(exchange.getIn()).thenReturn(message);
+        
Mockito.when(message.getHeader(Exchange.HTTP_URI)).thenReturn(TEST_URI);
+
+        AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint));
+    }
+
+    @Test
+    public void testGetHttpURLFromEndpointUri() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI);
+        Mockito.when(exchange.getIn()).thenReturn(message);
+
+        AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint));
+    }
+
+    @Test
+    public void testGetHttpURLFromEndpointUriWithAdditionalScheme() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn("netty-http:" + 
TEST_URI);
+        Mockito.when(exchange.getIn()).thenReturn(message);
+
+        AbstractHttpSpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals(TEST_URI, decorator.getHttpURL(exchange, endpoint));
+    }
+
+    @Test
+    public void testPostResponseCode() {
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(exchange.hasOut()).thenReturn(true);
+        Mockito.when(exchange.getOut()).thenReturn(message);
+        
Mockito.when(message.getHeader(Exchange.HTTP_RESPONSE_CODE)).thenReturn(200);
+        
+        SpanDecorator decorator = new AbstractHttpSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        MockTracer tracer = new MockTracer();
+        MockSpan span = (MockSpan)tracer.buildSpan("TestSpan").start();
+
+        decorator.post(span, exchange, null);
+
+        assertEquals(200, span.tags().get(Tags.HTTP_STATUS.getKey()));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java
 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java
new file mode 100644
index 0000000..b59aa30
--- /dev/null
+++ 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/AbstractSpanDecoratorTest.java
@@ -0,0 +1,100 @@
+/**
+ * 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.opentracing.decorators;
+
+import static org.junit.Assert.*;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.opentracing.SpanDecorator;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.opentracing.mock.MockSpan;
+import io.opentracing.mock.MockTracer;
+import io.opentracing.tag.Tags;
+
+public class AbstractSpanDecoratorTest {
+
+    private static final String TEST_URI = "test:/uri";
+
+    @Test
+    public void testGetOperationName() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI);
+
+        SpanDecorator decorator = new AbstractSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals(TEST_URI, decorator.getOperationName(null, endpoint));
+    }
+
+    @Test
+    public void testPre() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn(TEST_URI);
+
+        SpanDecorator decorator = new AbstractSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        MockTracer tracer = new MockTracer();
+        MockSpan span = (MockSpan)tracer.buildSpan("TestSpan").start();
+
+        decorator.pre(span, null, endpoint);
+
+        assertEquals("camel-test", span.tags().get(Tags.COMPONENT.getKey()));
+    }
+
+    @Test
+    public void testPostExchangeFailed() {
+        Exchange exchange = Mockito.mock(Exchange.class);
+
+        Mockito.when(exchange.isFailed()).thenReturn(true);
+        
+        Exception e=new Exception("Test Message");
+        Mockito.when(exchange.getException()).thenReturn(e);
+
+        SpanDecorator decorator = new AbstractSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        MockTracer tracer = new MockTracer();
+        MockSpan span = (MockSpan)tracer.buildSpan("TestSpan").start();
+
+        decorator.post(span, exchange, null);
+
+        assertEquals(true, span.tags().get(Tags.ERROR.getKey()));
+        assertEquals(1, span.logEntries().size());
+        assertEquals("error", span.logEntries().get(0).fields().get("event"));
+        assertEquals("Exception", 
span.logEntries().get(0).fields().get("error.kind"));
+        assertEquals(e.getMessage(), 
span.logEntries().get(0).fields().get("message"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java
 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java
new file mode 100644
index 0000000..ce24aaf
--- /dev/null
+++ 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/JdbcSpanDecoratorTest.java
@@ -0,0 +1,56 @@
+/**
+ * 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.opentracing.decorators;
+
+import static org.junit.Assert.*;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.opentracing.SpanDecorator;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.opentracing.mock.MockSpan;
+import io.opentracing.mock.MockTracer;
+
+public class JdbcSpanDecoratorTest {
+
+    private static final String SQL_STATEMENT = "select * from customer";
+
+    @Test
+    public void testPre() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn("test");
+        Mockito.when(exchange.getIn()).thenReturn(message);
+        Mockito.when(message.getBody()).thenReturn(SQL_STATEMENT);
+
+        SpanDecorator decorator = new JdbcSpanDecorator();
+
+        MockTracer tracer = new MockTracer();
+        MockSpan span = (MockSpan)tracer.buildSpan("TestSpan").start();
+
+        decorator.pre(span, exchange, endpoint);
+
+        assertEquals("sql", span.tags().get("db.type"));
+        assertEquals(SQL_STATEMENT, span.tags().get("db.statement"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java
 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java
new file mode 100644
index 0000000..908560f
--- /dev/null
+++ 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/MongoDBSpanDecoratorTest.java
@@ -0,0 +1,76 @@
+/**
+ * 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.opentracing.decorators;
+
+import static org.junit.Assert.*;
+
+import java.util.Map;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.opentracing.SpanDecorator;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.opentracing.mock.MockSpan;
+import io.opentracing.mock.MockTracer;
+
+public class MongoDBSpanDecoratorTest {
+
+    private static final String MONGODB_STATEMENT =
+            
"mongodb:myDb?database=flights&collection=tickets&operation=findOneByQuery";
+
+    @Test
+    public void testGetOperationName() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn(
+                MONGODB_STATEMENT);
+
+        SpanDecorator decorator = new MongoDBSpanDecorator();
+
+        assertEquals("findOneByQuery", decorator.getOperationName(null, 
endpoint));
+    }
+
+    @Test
+    public void testToQueryParameters() {
+        Map<String,String> params = 
MongoDBSpanDecorator.toQueryParameters(MONGODB_STATEMENT);
+        assertEquals(3, params.size());
+        assertEquals("flights", params.get("database"));
+        assertEquals("tickets", params.get("collection"));
+        assertEquals("findOneByQuery", params.get("operation"));
+    }
+
+    @Test
+    public void testPre() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn(
+                MONGODB_STATEMENT);
+
+        SpanDecorator decorator = new MongoDBSpanDecorator();
+
+        MockTracer tracer = new MockTracer();
+        MockSpan span = (MockSpan)tracer.buildSpan("TestSpan").start();
+
+        decorator.pre(span, null, endpoint);
+
+        assertEquals("mongodb", span.tags().get("db.type"));
+        assertEquals("flights", span.tags().get("db.instance"));
+        assertTrue(span.tags().containsKey("db.statement"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java
 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java
new file mode 100644
index 0000000..f9d3987
--- /dev/null
+++ 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/SqlSpanDecoratorTest.java
@@ -0,0 +1,56 @@
+/**
+ * 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.opentracing.decorators;
+
+import static org.junit.Assert.*;
+
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.opentracing.SpanDecorator;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import io.opentracing.mock.MockSpan;
+import io.opentracing.mock.MockTracer;
+
+public class SqlSpanDecoratorTest {
+
+    private static final String SQL_STATEMENT = "select * from customer";
+
+    @Test
+    public void testPre() {
+        Endpoint endpoint = Mockito.mock(Endpoint.class);
+        Exchange exchange = Mockito.mock(Exchange.class);
+        Message message = Mockito.mock(Message.class);
+
+        Mockito.when(endpoint.getEndpointUri()).thenReturn("test");
+        Mockito.when(exchange.getIn()).thenReturn(message);
+        
Mockito.when(message.getHeader(SqlSpanDecorator.CAMEL_SQL_QUERY)).thenReturn(SQL_STATEMENT);
+
+        SpanDecorator decorator = new SqlSpanDecorator();
+
+        MockTracer tracer = new MockTracer();
+        MockSpan span = (MockSpan)tracer.buildSpan("TestSpan").start();
+
+        decorator.pre(span, exchange, endpoint);
+
+        assertEquals("sql", span.tags().get("db.type"));
+        assertEquals(SQL_STATEMENT, span.tags().get("db.statement"));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java
 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java
new file mode 100644
index 0000000..c5abdd0
--- /dev/null
+++ 
b/components/camel-opentracing/src/test/java/org/apache/camel/opentracing/decorators/TimerSpanDecoratorTest.java
@@ -0,0 +1,46 @@
+/**
+ * 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.opentracing.decorators;
+
+import static org.junit.Assert.*;
+
+import org.apache.camel.Exchange;
+import org.apache.camel.opentracing.SpanDecorator;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+public class TimerSpanDecoratorTest {
+
+    private static final String TEST_NAME = "TestName";
+
+    @Test
+    public void testGetOperationName() {
+        Exchange exchange = Mockito.mock(Exchange.class);
+
+        
Mockito.when(exchange.getProperty(Exchange.TIMER_NAME)).thenReturn(TEST_NAME);
+
+        SpanDecorator decorator = new TimerSpanDecorator() {
+            @Override
+            public String getComponent() {
+                return null;
+            }
+        };
+
+        assertEquals(TEST_NAME, decorator.getOperationName(exchange, null));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/84b21a8a/parent/pom.xml
----------------------------------------------------------------------
diff --git a/parent/pom.xml b/parent/pom.xml
index 82b5536..3001de0 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -485,7 +485,7 @@
     <openstack4j-version>3.0.2</openstack4j-version>
     <openstack4j-guava-version>17.0</openstack4j-guava-version>
     
<opentracing-java-globaltracer-version>0.1.0</opentracing-java-globaltracer-version>
-    
<opentracing-java-spanmanager-version>0.0.2</opentracing-java-spanmanager-version>
+    
<opentracing-java-spanmanager-version>0.0.3</opentracing-java-spanmanager-version>
     <opentracing-version>0.20.9</opentracing-version>
     <ops4j-base-version>1.5.0</ops4j-base-version>
     <optaplanner-version>6.5.0.Final</optaplanner-version>

Reply via email to