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>

Reply via email to