cxf-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From cschnei...@apache.org
Subject cxf git commit: [CXF-7164] Support tracing using Zipkin Brave
Date Tue, 06 Dec 2016 13:36:10 GMT
Repository: cxf
Updated Branches:
  refs/heads/master 892a4ca84 -> fd77d3f33


[CXF-7164] Support tracing using Zipkin Brave


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

Branch: refs/heads/master
Commit: fd77d3f3380f805db3547d37cbb2ff72bd033ad0
Parents: 892a4ca
Author: Christian Schneider <chris@die-schneider.net>
Authored: Tue Dec 6 14:35:35 2016 +0100
Committer: Christian Schneider <chris@die-schneider.net>
Committed: Tue Dec 6 14:36:01 2016 +0100

----------------------------------------------------------------------
 rt/features/pom.xml                             |   1 +
 rt/features/tracing-brave/pom.xml               |  87 +++++++++++++
 .../brave/soap/CxfHttpClientRequest.java        |  49 ++++++++
 .../tracing/brave/soap/CxfServerRequest.java    |  48 ++++++++
 .../cxf/tracing/brave/soap/HttpResponse200.java |  28 +++++
 .../cxf/tracing/brave/soap/ParsedMessage.java   | 121 +++++++++++++++++++
 .../cxf/tracing/brave/soap/TraceFeature.java    |  50 ++++++++
 .../tracing/brave/soap/TraceInInterceptor.java  |  58 +++++++++
 .../tracing/brave/soap/TraceOutInterceptor.java |  57 +++++++++
 .../cxf/tracing/brave/soap/BraveTraceTest.java  |  99 +++++++++++++++
 .../brave/soap/LoggingSpanNameProvider.java     |  31 +++++
 .../cxf/tracing/brave/soap/MyService.java       |  26 ++++
 .../cxf/tracing/brave/soap/MyServiceImpl.java   |  28 +++++
 13 files changed, 683 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/pom.xml
----------------------------------------------------------------------
diff --git a/rt/features/pom.xml b/rt/features/pom.xml
index 0365bf6..a4cfdff 100644
--- a/rt/features/pom.xml
+++ b/rt/features/pom.xml
@@ -34,5 +34,6 @@
         <module>logging</module>
         <module>metrics</module>
         <module>throttling</module>
+        <module>tracing-brave</module>
     </modules>
 </project>

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/pom.xml
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/pom.xml b/rt/features/tracing-brave/pom.xml
new file mode 100644
index 0000000..9af22e4
--- /dev/null
+++ b/rt/features/tracing-brave/pom.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  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.
+-->
+<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>
+    <artifactId>cxf-rt-features-tracing-brave</artifactId>
+    <packaging>jar</packaging>
+    <name>Apache CXF Tracing using Zipkin Brave</name>
+    <url>http://cxf.apache.org</url>
+    <parent>
+        <groupId>org.apache.cxf</groupId>
+        <artifactId>cxf-parent</artifactId>
+        <version>3.2.0-SNAPSHOT</version>
+        <relativePath>../../../parent/pom.xml</relativePath>
+    </parent>
+    
+    <properties>
+        <cxf.osgi.export>
+            org.apache.cxf.tracing.brave.soap
+        </cxf.osgi.export>
+        <brave.version>3.15.1</brave.version>
+    </properties>
+    
+    <dependencies>
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-core</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-features-logging</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+        	<groupId>io.zipkin.brave</groupId>
+        	<artifactId>brave-core</artifactId>
+        	<version>${brave.version}</version>
+        </dependency>
+        <dependency>
+        	<groupId>io.zipkin.brave</groupId>
+        	<artifactId>brave-http</artifactId>
+        	<version>${brave.version}</version>
+        </dependency>
+        
+
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-jdk14</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-transports-http-jetty</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-frontend-jaxws</artifactId>
+            <version>${project.version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/CxfHttpClientRequest.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/CxfHttpClientRequest.java
b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/CxfHttpClientRequest.java
new file mode 100644
index 0000000..78a40fd
--- /dev/null
+++ b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/CxfHttpClientRequest.java
@@ -0,0 +1,49 @@
+/**
+ * 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.cxf.tracing.brave.soap;
+
+import java.net.URI;
+
+import com.github.kristofa.brave.http.HttpClientRequest;
+import org.apache.cxf.message.Message;
+
+public class CxfHttpClientRequest implements HttpClientRequest {
+
+    private ParsedMessage message;
+
+    public CxfHttpClientRequest(Message message) {
+        this.message = new ParsedMessage(message);
+    }
+
+    @Override
+    public URI getUri() {
+        return message.getUri();
+    }
+
+    @Override
+    public String getHttpMethod() {
+        return message.getHttpMethod();
+    }
+
+    @Override
+    public void addHeader(String header, String value) {
+        message.addHeader(header, value);
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/CxfServerRequest.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/CxfServerRequest.java
b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/CxfServerRequest.java
new file mode 100644
index 0000000..fcc8797
--- /dev/null
+++ b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/CxfServerRequest.java
@@ -0,0 +1,48 @@
+/**
+ * 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.cxf.tracing.brave.soap;
+
+import java.net.URI;
+
+import com.github.kristofa.brave.http.HttpServerRequest;
+
+public class CxfServerRequest implements HttpServerRequest {
+
+    private ParsedMessage message;
+
+    public CxfServerRequest(ParsedMessage message) {
+        this.message = message;
+    }
+
+    @Override
+    public URI getUri() {
+        return message.getUri();
+    }
+
+    @Override
+    public String getHttpMethod() {
+        return message.getHttpMethod();
+    }
+
+    @Override
+    public String getHttpHeaderValue(String headerName) {
+        return message.getHeaders().get(headerName);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/HttpResponse200.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/HttpResponse200.java
b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/HttpResponse200.java
new file mode 100644
index 0000000..f50dbde
--- /dev/null
+++ b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/HttpResponse200.java
@@ -0,0 +1,28 @@
+/**
+ * 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.cxf.tracing.brave.soap;
+
+import com.github.kristofa.brave.http.HttpResponse;
+
+final class HttpResponse200 implements HttpResponse {
+    @Override
+    public int getHttpStatusCode() {
+        return 200;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/ParsedMessage.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/ParsedMessage.java
b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/ParsedMessage.java
new file mode 100644
index 0000000..8967375
--- /dev/null
+++ b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/ParsedMessage.java
@@ -0,0 +1,121 @@
+/**
+ * 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.cxf.tracing.brave.soap;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cxf.helpers.CastUtils;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
+
+public class ParsedMessage {
+    
+    private Message message;
+
+    public ParsedMessage(Message message) {
+        this.message = message;
+    }
+    
+    String safeGet(String key) {
+        if (!message.containsKey(key)) {
+            return null;
+        }
+        Object value = message.get(key);
+        return (value instanceof String) ? value.toString() : null;
+    }
+    
+    public String getUriSt() {
+        String uri = safeGet(Message.REQUEST_URL);
+        if (uri == null) {
+            String address = safeGet(Message.ENDPOINT_ADDRESS);
+            uri = safeGet(Message.REQUEST_URI);
+            if (uri != null && uri.startsWith("/")) {
+                if (address != null && !address.startsWith(uri)) {
+                    if (address.endsWith("/") && address.length() > 1) {
+                        address = address.substring(0, address.length());
+                    }
+                    uri = address + uri;
+                }
+            } else {
+                uri = address;
+            }
+        }
+        String query = safeGet(Message.QUERY_STRING);
+        if (query != null) {
+            return uri + "?" + query;
+        } else {
+            return uri;
+        }
+    }
+    
+    public URI getUri() {
+        try {
+            String uriSt = getUriSt();
+            return uriSt != null ? new URI(uriSt) : new URI("");
+        } catch (URISyntaxException e) {
+            throw new RuntimeException(e.getMessage(), e);
+        }
+    }
+    
+    Message getEffectiveMessage() {
+        boolean isRequestor = MessageUtils.isRequestor(message);
+        boolean isOutbound = MessageUtils.isOutbound(message);
+        if (isRequestor) {
+            return isOutbound ? message : message.getExchange().getOutMessage();
+        } else {
+            return isOutbound ? message.getExchange().getInMessage() : message;
+        }
+    }
+    
+    Map<String, String> getHeaders() {
+        Map<String, List<String>> headers = CastUtils.cast((Map<?, ?>)message.get(Message.PROTOCOL_HEADERS));
+        Map<String, String> result = new HashMap<>();
+        if (headers == null) {
+            return result;
+        }
+        for (Map.Entry<String, List<String>> entry : headers.entrySet()) {
+            if (entry.getValue().size() == 1) {
+                result.put(entry.getKey(), entry.getValue().get(0));
+            } else {
+                String[] valueAr = entry.getValue().toArray(new String[] {});
+                result.put(entry.getKey(), valueAr.toString());
+            }
+        }
+        return result;
+    }
+    
+    void addHeader(String key, String value) {
+        Map<String, List<String>> headers = CastUtils.cast((Map<?, ?>)message.get(Message.PROTOCOL_HEADERS));
+        if (headers == null) {
+            headers = new HashMap<String, List<String>>();
+            message.put(Message.PROTOCOL_HEADERS, headers);
+        }
+        headers.put(key, Arrays.asList(value));
+    }
+
+    public String getHttpMethod() {
+        ParsedMessage eMessage = new ParsedMessage(getEffectiveMessage());
+        return eMessage.safeGet(Message.HTTP_REQUEST_METHOD);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceFeature.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceFeature.java
b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceFeature.java
new file mode 100644
index 0000000..fbaca07
--- /dev/null
+++ b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceFeature.java
@@ -0,0 +1,50 @@
+/**
+ * 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.cxf.tracing.brave.soap;
+
+import com.github.kristofa.brave.Brave;
+import com.github.kristofa.brave.http.DefaultSpanNameProvider;
+import org.apache.cxf.Bus;
+import org.apache.cxf.annotations.Provider;
+import org.apache.cxf.annotations.Provider.Type;
+import org.apache.cxf.common.injection.NoJSR250Annotations;
+import org.apache.cxf.feature.AbstractFeature;
+import org.apache.cxf.interceptor.InterceptorProvider;
+
+@NoJSR250Annotations
+@Provider(value = Type.Feature)
+public class TraceFeature extends AbstractFeature {
+    private TraceInInterceptor in;
+    private TraceOutInterceptor out;
+
+    public TraceFeature(Brave brave) {
+        DefaultSpanNameProvider nameProvider = new DefaultSpanNameProvider();
+        in = new TraceInInterceptor(brave, nameProvider);
+        out = new TraceOutInterceptor(brave, nameProvider);
+    }
+
+    @Override
+    protected void initializeProvider(InterceptorProvider provider, Bus bus) {
+        provider.getInInterceptors().add(in);
+        provider.getInFaultInterceptors().add(in);
+
+        provider.getOutInterceptors().add(out);
+        provider.getOutFaultInterceptors().add(out);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceInInterceptor.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceInInterceptor.java
b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceInInterceptor.java
new file mode 100644
index 0000000..4b84eb3
--- /dev/null
+++ b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceInInterceptor.java
@@ -0,0 +1,58 @@
+/**
+ * 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.cxf.tracing.brave.soap;
+
+import com.github.kristofa.brave.Brave;
+import com.github.kristofa.brave.http.HttpClientResponseAdapter;
+import com.github.kristofa.brave.http.HttpServerRequestAdapter;
+import com.github.kristofa.brave.http.SpanNameProvider;
+import org.apache.cxf.common.injection.NoJSR250Annotations;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+
+/**
+ * 
+ */
+@NoJSR250Annotations
+public class TraceInInterceptor extends AbstractPhaseInterceptor<Message> {
+
+    private Brave brave;
+    private SpanNameProvider spanNameProvider;
+
+    public TraceInInterceptor(Brave brave, SpanNameProvider spanNameProvider) {
+        super(Phase.PRE_INVOKE);
+        this.brave = brave;
+        this.spanNameProvider = spanNameProvider;
+    }
+
+    public void handleMessage(Message cxfMessage) throws Fault {
+        ParsedMessage message = new ParsedMessage(cxfMessage);
+        if (MessageUtils.isRequestor(cxfMessage)) {
+            brave.clientResponseInterceptor().handle(new HttpClientResponseAdapter(new HttpResponse200()));
+        } else {
+            HttpServerRequestAdapter adapter = 
+                new HttpServerRequestAdapter(new CxfServerRequest(message), spanNameProvider);
+            brave.serverRequestInterceptor().handle(adapter);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceOutInterceptor.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceOutInterceptor.java
b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceOutInterceptor.java
new file mode 100644
index 0000000..17f76d0
--- /dev/null
+++ b/rt/features/tracing-brave/src/main/java/org/apache/cxf/tracing/brave/soap/TraceOutInterceptor.java
@@ -0,0 +1,57 @@
+/**
+ * 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.cxf.tracing.brave.soap;
+
+import com.github.kristofa.brave.Brave;
+import com.github.kristofa.brave.http.HttpClientRequest;
+import com.github.kristofa.brave.http.HttpClientRequestAdapter;
+import com.github.kristofa.brave.http.HttpServerResponseAdapter;
+import com.github.kristofa.brave.http.SpanNameProvider;
+import org.apache.cxf.common.injection.NoJSR250Annotations;
+import org.apache.cxf.interceptor.Fault;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageUtils;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+
+/**
+ * 
+ */
+@NoJSR250Annotations
+public class TraceOutInterceptor extends AbstractPhaseInterceptor<Message> {
+
+    private Brave brave;
+    private SpanNameProvider spanNameProvider;
+
+    public TraceOutInterceptor(Brave brave, SpanNameProvider spanNameProvider) {
+        super(Phase.PRE_PROTOCOL);
+        this.brave = brave;
+        this.spanNameProvider = spanNameProvider;
+    }
+
+    public void handleMessage(Message message) throws Fault {
+        if (MessageUtils.isRequestor(message)) {
+            final HttpClientRequest req = new CxfHttpClientRequest(message);
+            brave.clientRequestInterceptor().handle(new HttpClientRequestAdapter(req, spanNameProvider));
+        } else {
+            brave.serverResponseInterceptor().handle(new HttpServerResponseAdapter(new HttpResponse200()));
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/BraveTraceTest.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/BraveTraceTest.java
b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/BraveTraceTest.java
new file mode 100644
index 0000000..5bac5f7
--- /dev/null
+++ b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/BraveTraceTest.java
@@ -0,0 +1,99 @@
+/**
+ * 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.cxf.tracing.brave.soap;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.github.kristofa.brave.Brave;
+import org.apache.cxf.endpoint.Server;
+import org.apache.cxf.ext.logging.LoggingFeature;
+import org.apache.cxf.feature.Feature;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import zipkin.Span;
+import zipkin.reporter.Reporter;
+
+public class BraveTraceTest {
+    
+    private static final String ADDRESS = "http://localhost:8182";
+    private Server server;
+    private TraceFeature logging;
+    private Localreporter localReporter;
+
+    @Before
+    public void startServer() {
+        localReporter = new Localreporter();
+        logging = createLoggingFeature(localReporter);
+        server = createServer(logging);
+    }
+
+    @Test
+    public void testMyService() {
+        MyService myService = createProxy(logging);
+        myService.echo("test");
+        for (Span span : localReporter.spans) {
+            System.out.println(span);
+        }
+        Assert.assertEquals(2, localReporter.spans.size());
+
+    }
+    
+    @After
+    public void stopServer() {
+        server.destroy();
+    }
+    
+    private static Server createServer(Feature logging) {
+        JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
+        factory.setAddress(ADDRESS);
+        factory.setServiceBean(new MyServiceImpl());
+        factory.setFeatures(Arrays.asList(logging));
+        return factory.create();
+    }
+    
+    private static MyService createProxy(Feature trace) {
+        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
+        factory.setServiceClass(MyService.class);
+        factory.setAddress(ADDRESS);
+        factory.setFeatures(Arrays.asList(trace, new LoggingFeature()));
+        return (MyService)factory.create();
+    }
+
+    private static TraceFeature createLoggingFeature(Reporter<Span> reporter) {
+        Brave brave = new Brave.Builder("myservice").reporter(reporter).build();
+        return new TraceFeature(brave);
+    }
+    
+    static final class Localreporter implements Reporter<Span> {
+        List<Span> spans = new ArrayList<Span>();
+
+        @Override
+        public void report(Span span) {
+            spans.add(span);
+        }
+        
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/LoggingSpanNameProvider.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/LoggingSpanNameProvider.java
b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/LoggingSpanNameProvider.java
new file mode 100644
index 0000000..86fa25a
--- /dev/null
+++ b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/LoggingSpanNameProvider.java
@@ -0,0 +1,31 @@
+/**
+ * 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.cxf.tracing.brave.soap;
+
+import com.github.kristofa.brave.http.HttpRequest;
+import com.github.kristofa.brave.http.SpanNameProvider;
+
+public class LoggingSpanNameProvider implements SpanNameProvider {
+
+    @Override
+    public String spanName(HttpRequest request) {
+        return (request instanceof SpanNameProvider) ? ((SpanNameProvider)request).spanName(request)
: ""; 
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/MyService.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/MyService.java
b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/MyService.java
new file mode 100644
index 0000000..2001164
--- /dev/null
+++ b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/MyService.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.cxf.tracing.brave.soap;
+
+import javax.jws.WebService;
+
+@WebService
+public interface MyService {
+    String echo(String msg);
+}

http://git-wip-us.apache.org/repos/asf/cxf/blob/fd77d3f3/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/MyServiceImpl.java
----------------------------------------------------------------------
diff --git a/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/MyServiceImpl.java
b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/MyServiceImpl.java
new file mode 100644
index 0000000..e9f901a
--- /dev/null
+++ b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tracing/brave/soap/MyServiceImpl.java
@@ -0,0 +1,28 @@
+/**
+ * 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.cxf.tracing.brave.soap;
+
+public class MyServiceImpl implements MyService {
+
+    @Override
+    public String echo(String msg) {
+        return msg;
+    }
+
+}


Mime
View raw message