Damn ... I just found there is also general CXF support for brave at https://github.com/openzipkin/brave/tree/master/brave-cxf3 . So maybe this already solved the problem before. We should decide how to proceed.
I think one approach is to help at brave-cxf3 to make it as good as possible and revert the cxf module I created. The other is to focus on the cxf trace zipkin module .. Actually I am not sure what is the better option. Any opinions? Christian 2016-12-06 20:49 GMT+01:00 Andrey Redko <[email protected]>: > That's right, the JAX-RS part should be supported by Brave already thanks > to dedicated CXF integration (I was involved in late-stage discussions for > the PR in question but not in the implementation). > > Best Regards, > Andriy Redko > > On Tue, Dec 6, 2016 at 12:09 PM, Christian Schneider < > [email protected]> wrote: > > > My orignal plan was to just support SOAP as REST is well supported by > brave > > rest support already. > > In the end my code was able to support both REST and SOAP without much > > overhead so I removed the soap package again. > > > > Christian > > > > 2016-12-06 14:41 GMT+01:00 Sergey Beryozkin <[email protected]>: > > > > > Christian, what is SOAP specific in this code ? > > > Looks like that can work with JAX-RS too ? > > > > > > Usually we try to accommodate both frontends, example, Andriy Redko > made > > > sure HTrace interceptors work for JAXWS, similarly for Bean validation > > > > > > Sergey > > > > > > > > > > > > On 06/12/16 13:36, [email protected] wrote: > > > > > >> 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 <[email protected]> > > >> Authored: Tue Dec 6 14:35:35 2016 +0100 > > >> Committer: Christian Schneider <[email protected]> > > >> 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://mav > > >> en.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/ > tra > > >> cing/brave/soap/CxfHttpClientRequest.java > > b/rt/features/tracing-brave/sr > > >> c/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/tra > > >> cing/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/ > tra > > >> cing/brave/soap/CxfServerRequest.java b/rt/features/tracing-brave/sr > > >> c/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/tra > > >> cing/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/ > tra > > >> cing/brave/soap/HttpResponse200.java b/rt/features/tracing-brave/sr > > >> c/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/tra > > >> cing/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/ > tra > > >> cing/brave/soap/ParsedMessage.java b/rt/features/tracing-brave/sr > > >> c/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/tra > > >> cing/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().getOutMe > > >> ssage(); > > >> + } 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(getEffectiveMess > > >> age()); > > >> + 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/ > tra > > >> cing/brave/soap/TraceFeature.java b/rt/features/tracing-brave/sr > > >> c/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/tra > > >> cing/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/ > tra > > >> cing/brave/soap/TraceInInterceptor.java > b/rt/features/tracing-brave/sr > > >> c/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/tra > > >> cing/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/ > tra > > >> cing/brave/soap/TraceOutInterceptor.java > b/rt/features/tracing-brave/sr > > >> c/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/tra > > >> cing/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/ > tra > > >> cing/brave/soap/BraveTraceTest.java b/rt/features/tracing-brave/sr > > >> c/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/tra > > >> cing/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").rep > > >> orter(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/ > tra > > >> cing/brave/soap/LoggingSpanNameProvider.java > > >> b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tra > > >> cing/brave/soap/LoggingSpanNameProvider.java > > >> new file mode 100644 > > >> index 0000000..86fa25a > > >> --- /dev/null > > >> +++ b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tra > > >> cing/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/tra > > >> cing/brave/soap/MyService.java > > >> new file mode 100644 > > >> index 0000000..2001164 > > >> --- /dev/null > > >> +++ b/rt/features/tracing-brave/src/test/java/org/apache/cxf/tra > > >> cing/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/ > tra > > >> cing/brave/soap/MyServiceImpl.java b/rt/features/tracing-brave/sr > > >> c/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/tra > > >> cing/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; > > >> + } > > >> + > > >> +} > > >> > > >> > > > > > > -- > > > Sergey Beryozkin > > > > > > Talend Community Coders > > > http://coders.talend.com/ > > > > > > > > > > > > -- > > -- > > Christian Schneider > > http://www.liquid-reality.de > > <https://owa.talend.com/owa/redir.aspx?C=3aa4083e0c744ae1ba52bd062c5a7e > > 46&URL=http%3a%2f%2fwww.liquid-reality.de> > > > > Open Source Architect > > http://www.talend.com > > <https://owa.talend.com/owa/redir.aspx?C=3aa4083e0c744ae1ba52bd062c5a7e > > 46&URL=http%3a%2f%2fwww.talend.com> > > > -- -- Christian Schneider http://www.liquid-reality.de <https://owa.talend.com/owa/redir.aspx?C=3aa4083e0c744ae1ba52bd062c5a7e46&URL=http%3a%2f%2fwww.liquid-reality.de> Open Source Architect http://www.talend.com <https://owa.talend.com/owa/redir.aspx?C=3aa4083e0c744ae1ba52bd062c5a7e46&URL=http%3a%2f%2fwww.talend.com>
