Repository: cxf Updated Branches: refs/heads/master ab1f363e1 -> 7e82d2f10
CXF-6360: Integration with Apache HTrace Project: http://git-wip-us.apache.org/repos/asf/cxf/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf/commit/7e82d2f1 Tree: http://git-wip-us.apache.org/repos/asf/cxf/tree/7e82d2f1 Diff: http://git-wip-us.apache.org/repos/asf/cxf/diff/7e82d2f1 Branch: refs/heads/master Commit: 7e82d2f10a1ca14a939d2c63ca4e620f8870e256 Parents: ab1f363 Author: reta <[email protected]> Authored: Mon May 18 14:25:03 2015 -0400 Committer: reta <[email protected]> Committed: Mon May 18 14:25:03 2015 -0400 ---------------------------------------------------------------------- integration/pom.xml | 2 + integration/tracing/tracing-core/pom.xml | 62 +++++++++ .../org/apache/cxf/tracing/TracerContext.java | 23 ++++ integration/tracing/tracing-htrace/pom.xml | 71 ++++++++++ .../tracing/htrace/HTraceContextProvider.java | 41 ++++++ .../cxf/jaxrs/tracing/htrace/HTraceFeature.java | 71 ++++++++++ .../jaxrs/tracing/htrace/HTraceProvider.java | 106 +++++++++++++++ .../tracing/htrace/HTraceTracerContext.java | 38 ++++++ parent/pom.xml | 6 + systests/pom.xml | 1 + systests/tracing/pom.xml | 136 +++++++++++++++++++ .../apache/cxf/systest/jaxrs/tracing/Book.java | 52 +++++++ .../cxf/systest/jaxrs/tracing/BookStore.java | 49 +++++++ .../jaxrs/tracing/htrace/HTraceTracingTest.java | 95 +++++++++++++ .../jaxrs/tracing/htrace/TestSpanReceiver.java | 61 +++++++++ 15 files changed, 814 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/integration/pom.xml ---------------------------------------------------------------------- diff --git a/integration/pom.xml b/integration/pom.xml index a3ba814..f46fdbb 100644 --- a/integration/pom.xml +++ b/integration/pom.xml @@ -32,5 +32,7 @@ <modules> <module>jca</module> <module>cdi</module> + <module>tracing/tracing-core</module> + <module>tracing/tracing-htrace</module> </modules> </project> http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/integration/tracing/tracing-core/pom.xml ---------------------------------------------------------------------- diff --git a/integration/tracing/tracing-core/pom.xml b/integration/tracing/tracing-core/pom.xml new file mode 100644 index 0000000..e405ebb --- /dev/null +++ b/integration/tracing/tracing-core/pom.xml @@ -0,0 +1,62 @@ +<?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-integration-tracing-core</artifactId> + <packaging>jar</packaging> + <name>Apache CXF Distributed Tracing Integration</name> + <description>Apache CXF Distributed Tracing Integration</description> + <url>http://cxf.apache.org</url> + <parent> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-parent</artifactId> + <version>3.1.1-SNAPSHOT</version> + <relativePath>../../../parent/pom.xml</relativePath> + </parent> + + <properties> + <cxf.osgi.export> + org.apache.cxf.tracing + </cxf.osgi.export> + </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-frontend-jaxrs</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-jdk14</artifactId> + <scope>test</scope> + </dependency> + </dependencies> +</project> http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/integration/tracing/tracing-core/src/main/java/org/apache/cxf/tracing/TracerContext.java ---------------------------------------------------------------------- diff --git a/integration/tracing/tracing-core/src/main/java/org/apache/cxf/tracing/TracerContext.java b/integration/tracing/tracing-core/src/main/java/org/apache/cxf/tracing/TracerContext.java new file mode 100644 index 0000000..2e1f37e --- /dev/null +++ b/integration/tracing/tracing-core/src/main/java/org/apache/cxf/tracing/TracerContext.java @@ -0,0 +1,23 @@ +/** + * 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; + +public interface TracerContext { + <T> T startSpan(final String desription); +} http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/integration/tracing/tracing-htrace/pom.xml ---------------------------------------------------------------------- diff --git a/integration/tracing/tracing-htrace/pom.xml b/integration/tracing/tracing-htrace/pom.xml new file mode 100644 index 0000000..b418fb5 --- /dev/null +++ b/integration/tracing/tracing-htrace/pom.xml @@ -0,0 +1,71 @@ +<?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-integration-tracing-htrace</artifactId> + <packaging>jar</packaging> + <name>Apache CXF Distributed Tracing using Apache HTrace</name> + <description>Apache CXF Distributed using Apache HTrace</description> + <url>http://cxf.apache.org</url> + <parent> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-parent</artifactId> + <version>3.1.1-SNAPSHOT</version> + <relativePath>../../../parent/pom.xml</relativePath> + </parent> + + <properties> + <cxf.osgi.export> + org.apache.cxf.tracing + </cxf.osgi.export> + </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-frontend-jaxrs</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-integration-tracing-core</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.htrace</groupId> + <artifactId>htrace-core</artifactId> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-jdk14</artifactId> + <scope>test</scope> + </dependency> + </dependencies> +</project> http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceContextProvider.java ---------------------------------------------------------------------- diff --git a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceContextProvider.java b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceContextProvider.java new file mode 100644 index 0000000..c983f1d --- /dev/null +++ b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceContextProvider.java @@ -0,0 +1,41 @@ +/** + * 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.jaxrs.tracing.htrace; + +import javax.ws.rs.ext.Provider; + +import org.apache.cxf.jaxrs.ext.ContextProvider; +import org.apache.cxf.message.Message; +import org.apache.cxf.tracing.TracerContext; +import org.apache.htrace.Sampler; +import org.apache.htrace.impl.NeverSampler; + +@Provider +public class HTraceContextProvider implements ContextProvider< TracerContext > { + private Sampler< ? > sampler = NeverSampler.INSTANCE; + + public HTraceContextProvider(final Sampler< ? > sampler) { + this.sampler = sampler; + } + + @Override + public TracerContext createContext(final Message message) { + return new HTraceTracerContext(sampler); + } +} http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceFeature.java ---------------------------------------------------------------------- diff --git a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceFeature.java b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceFeature.java new file mode 100644 index 0000000..2b14f99 --- /dev/null +++ b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceFeature.java @@ -0,0 +1,71 @@ +/** + * 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.jaxrs.tracing.htrace; + +import java.util.Arrays; + +import org.apache.cxf.Bus; +import org.apache.cxf.endpoint.Server; +import org.apache.cxf.feature.AbstractFeature; +import org.apache.cxf.jaxrs.provider.ServerProviderFactory; +import org.apache.htrace.HTraceConfiguration; +import org.apache.htrace.Sampler; +import org.apache.htrace.SamplerBuilder; +import org.apache.htrace.SpanReceiver; +import org.apache.htrace.SpanReceiverBuilder; +import org.apache.htrace.Trace; + +public class HTraceFeature extends AbstractFeature { + private HTraceConfiguration configuration; + + public HTraceFeature() { + this(HTraceConfiguration.EMPTY); + } + + public HTraceFeature(final HTraceConfiguration configuration) { + this.configuration = configuration; + } + + @Override + public void initialize(final Server server, final Bus bus) { + final ServerProviderFactory providerFactory = (ServerProviderFactory)server + .getEndpoint() + .get(ServerProviderFactory.class.getName()); + + final Sampler< ? > sampler = new SamplerBuilder(configuration).build(); + final SpanReceiver spanReceiver = new SpanReceiverBuilder(configuration).build(); + + if (spanReceiver != null) { + Trace.addReceiver(spanReceiver); + } + + if (providerFactory != null) { + providerFactory.setUserProviders(Arrays.asList(new HTraceProvider(sampler), + new HTraceContextProvider(sampler))); + } + } + + public void setConfiguration(final HTraceConfiguration configuration) { + this.configuration = configuration; + } + + public HTraceConfiguration getConfiguration() { + return configuration; + } +} http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceProvider.java ---------------------------------------------------------------------- diff --git a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceProvider.java b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceProvider.java new file mode 100644 index 0000000..a66d93b --- /dev/null +++ b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceProvider.java @@ -0,0 +1,106 @@ +/** + * 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.jaxrs.tracing.htrace; + +import java.io.IOException; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.container.ContainerResponseFilter; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.Provider; + +import org.apache.cxf.common.logging.LogUtils; +import org.apache.htrace.Sampler; +import org.apache.htrace.Trace; +import org.apache.htrace.TraceInfo; +import org.apache.htrace.Tracer; +import org.apache.htrace.impl.NeverSampler; + +@Provider +public class HTraceProvider implements ContainerRequestFilter, ContainerResponseFilter { + private static final Logger LOG = LogUtils.getL7dLogger(HTraceProvider.class); + + private static final String HEADER_TRACE_ID = "X-Trace-Id"; + private static final String HEADER_SPAN_ID = "X-Span-Id"; + + private final Sampler< ? > sampler; + + public HTraceProvider() { + this(NeverSampler.INSTANCE); + } + + public HTraceProvider(final Sampler< ? > sampler) { + this.sampler = sampler; + } + + @SuppressWarnings("unchecked") + @Override + public void filter(final ContainerRequestContext requestContext) throws IOException { + final MultivaluedMap<String, String> headers = requestContext.getHeaders(); + + // Try to extract the Trace Id value from the request header + final long traceId = getFirstValueOrDefault(headers, HEADER_TRACE_ID, + Tracer.DONT_TRACE.traceId); + + // Try to extract the Span Id value from the request header + final long spanId = getFirstValueOrDefault(headers, HEADER_SPAN_ID, + Tracer.DONT_TRACE.spanId); + + if (traceId != Tracer.DONT_TRACE.traceId && spanId != Tracer.DONT_TRACE.spanId) { + Trace.startSpan(requestContext.getUriInfo().getPath(), (Sampler< TraceInfo >)sampler, + new TraceInfo(traceId, spanId)); + } + } + + @Override + public void filter(final ContainerRequestContext requestContext, + final ContainerResponseContext responseContext) throws IOException { + final MultivaluedMap<String, String> headers = requestContext.getHeaders(); + + // Transfer tracing headers into the response headers + if (headers.containsKey(HEADER_TRACE_ID) && headers.containsKey(HEADER_SPAN_ID)) { + responseContext.getHeaders().add(HEADER_TRACE_ID, headers.getFirst(HEADER_TRACE_ID)); + responseContext.getHeaders().add(HEADER_SPAN_ID, headers.getFirst(HEADER_SPAN_ID)); + } + } + + private static Long getFirstValueOrDefault(final MultivaluedMap<String, String> headers, + final String header, final long defaultValue) { + + if (!headers.containsKey(header)) { + return defaultValue; + } + + try { + final List< String > values = headers.get(header); + if (values != null && !values.isEmpty()) { + return Long.parseLong(values.get(0)); + } + } catch (NumberFormatException ex) { + LOG.log(Level.FINE, String.format("Unable to parse '%s' header value to long number", header), ex); + } + + return defaultValue; + } +} http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceTracerContext.java ---------------------------------------------------------------------- diff --git a/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceTracerContext.java b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceTracerContext.java new file mode 100644 index 0000000..4bb6c73 --- /dev/null +++ b/integration/tracing/tracing-htrace/src/main/java/org/apache/cxf/jaxrs/tracing/htrace/HTraceTracerContext.java @@ -0,0 +1,38 @@ +/** + * 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.jaxrs.tracing.htrace; + +import org.apache.cxf.tracing.TracerContext; +import org.apache.htrace.Sampler; +import org.apache.htrace.Trace; +import org.apache.htrace.TraceScope; + +public class HTraceTracerContext implements TracerContext { + private final Sampler< ? > sampler; + + public HTraceTracerContext(final Sampler< ? > sampler) { + this.sampler = sampler; + } + + @Override + @SuppressWarnings("unchecked") + public TraceScope startSpan(final String description) { + return Trace.startSpan(description, sampler); + } +} http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/parent/pom.xml ---------------------------------------------------------------------- diff --git a/parent/pom.xml b/parent/pom.xml index da5efd6..63d5b51 100644 --- a/parent/pom.xml +++ b/parent/pom.xml @@ -189,6 +189,7 @@ <cxf.olingo.version>1.2.0</cxf.olingo.version> <cxf.tika.version>1.6</cxf.tika.version> <cxf.jexl.version>2.1.1</cxf.jexl.version> + <cxf.htrace.version>3.1.0-incubating</cxf.htrace.version> <cxf.checkstyle.extension /> <cxf.jaxb.context.class /> <cxf.spring.validation.mode>VALIDATION_AUTO</cxf.spring.validation.mode> @@ -1778,6 +1779,11 @@ <artifactId>metrics-core</artifactId> <version>${cxf.dropwizard.version}</version> </dependency> + <dependency> + <groupId>org.apache.htrace</groupId> + <artifactId>htrace-core</artifactId> + <version>${cxf.htrace.version}</version> + </dependency> </dependencies> </dependencyManagement> <profiles> http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/systests/pom.xml ---------------------------------------------------------------------- diff --git a/systests/pom.xml b/systests/pom.xml index e2beb50..da59c9a 100644 --- a/systests/pom.xml +++ b/systests/pom.xml @@ -48,6 +48,7 @@ <module>wsdl_maven</module> <module>cdi</module> <module>rs-http-sci</module> + <module>tracing</module> </modules> <profiles> http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/systests/tracing/pom.xml ---------------------------------------------------------------------- diff --git a/systests/tracing/pom.xml b/systests/tracing/pom.xml new file mode 100644 index 0000000..c0fa699 --- /dev/null +++ b/systests/tracing/pom.xml @@ -0,0 +1,136 @@ +<?xml version="1.0"?> +<!-- + 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"> + <parent> + <artifactId>cxf-parent</artifactId> + <groupId>org.apache.cxf</groupId> + <version>3.1.1-SNAPSHOT</version> + <relativePath>../../parent/pom.xml</relativePath> + </parent> + <modelVersion>4.0.0</modelVersion> + <groupId>org.apache.cxf.systests</groupId> + <artifactId>cxf-systests-tracing</artifactId> + <name>Apache CXF Distributed Tracing Integration System Tests</name> + <description>Apache CXF Distributed Tracing Integration System Tests</description> + <url>http://cxf.apache.org</url> + <properties> + <cxf.surefire.fork.vmargs>-XX:MaxPermSize=192m</cxf.surefire.fork.vmargs> + <cxf.server.launcher.vmargs>-XX:MaxPermSize=192m</cxf.server.launcher.vmargs> + </properties> + <dependencies> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-server</artifactId> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-plus</artifactId> + </dependency> + <dependency> + <groupId>org.eclipse.jetty</groupId> + <artifactId>jetty-jsp</artifactId> + <version>${cxf.jetty.version}</version> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-jdk14</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-transports-http-jetty</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-rt-frontend-jaxrs</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-rt-rs-client</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-integration-tracing-htrace</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>org.apache.cxf</groupId> + <artifactId>cxf-testutils</artifactId> + <version>${project.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>javax.annotation</groupId> + <artifactId>jsr250-api</artifactId> + <version>1.0</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.jaxrs</groupId> + <artifactId>jackson-jaxrs-json-provider</artifactId> + <version>2.2.1</version> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.ning</groupId> + <artifactId>async-http-client</artifactId> + <version>${cxf.ahc.version}</version> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>io.netty</groupId> + <artifactId>netty</artifactId> + </exclusion> + </exclusions> + </dependency> + </dependencies> + <build> + <plugins> + <plugin> + <artifactId>maven-jar-plugin</artifactId> + <executions> + <execution> + <id>attach-sources</id> + <goals> + <goal>test-jar</goal> + </goals> + </execution> + </executions> + </plugin> + </plugins> + </build> +</project> http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/Book.java ---------------------------------------------------------------------- diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/Book.java b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/Book.java new file mode 100644 index 0000000..baa499c --- /dev/null +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/Book.java @@ -0,0 +1,52 @@ +/** + * 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.systest.jaxrs.tracing; + +public class Book { + private String title; + private String id; + + public Book() { + } + + public Book(String id) { + this.id = id; + } + + public Book(String title, String id) { + this.title = title; + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setId(String i) { + id = i; + } + + public String getId() { + return id; + } +} http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/BookStore.java ---------------------------------------------------------------------- diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/BookStore.java b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/BookStore.java new file mode 100644 index 0000000..d7949dc --- /dev/null +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/BookStore.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.systest.jaxrs.tracing; + +import java.util.Arrays; +import java.util.Collection; +import java.util.UUID; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; + +import org.apache.cxf.tracing.TracerContext; +import org.apache.htrace.TraceScope; + +@Path("/bookstore/") +public class BookStore { + @Context private TracerContext tracer; + + @GET + @Path("/books") + @Produces(MediaType.APPLICATION_JSON) + public Collection< Book > getBooks() { + try (final TraceScope span = tracer.startSpan("Get Books")) { + return Arrays.asList( + new Book("Apache CXF in Action", UUID.randomUUID().toString()), + new Book("Mastering Apache CXF", UUID.randomUUID().toString()) + ); + } + } +} http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/HTraceTracingTest.java ---------------------------------------------------------------------- diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/HTraceTracingTest.java b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/HTraceTracingTest.java new file mode 100644 index 0000000..7591345 --- /dev/null +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/HTraceTracingTest.java @@ -0,0 +1,95 @@ +/** + * 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.systest.jaxrs.tracing.htrace; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider; + +import org.apache.cxf.jaxrs.JAXRSServerFactoryBean; +import org.apache.cxf.jaxrs.client.WebClient; +import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider; +import org.apache.cxf.jaxrs.model.AbstractResourceInfo; +import org.apache.cxf.jaxrs.tracing.htrace.HTraceFeature; +import org.apache.cxf.systest.jaxrs.tracing.BookStore; +import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase; +import org.apache.cxf.testutil.common.AbstractBusTestServerBase; +import org.apache.htrace.HTraceConfiguration; +import org.apache.htrace.impl.AlwaysSampler; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Ignore; +import org.junit.Test; + +import static org.hamcrest.CoreMatchers.equalTo; + +public class HTraceTracingTest extends AbstractBusClientServerTestBase { + public static final String PORT = allocatePort(HTraceTracingTest.class); + + @Ignore + public static class Server extends AbstractBusTestServerBase { + protected void run() { + final Map<String, String> properties = new HashMap<String, String>(); + properties.put("span.receiver", TestSpanReceiver.class.getName()); + properties.put("sampler", AlwaysSampler.class.getName()); + + JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean(); + sf.setResourceClasses(BookStore.class); + sf.setResourceProvider(BookStore.class, new SingletonResourceProvider(new BookStore())); + sf.setAddress("http://localhost:" + PORT); + sf.setProvider(new JacksonJsonProvider()); + sf.setFeatures(Arrays.asList(new HTraceFeature(HTraceConfiguration.fromMap(properties)))); + sf.create(); + } + } + + @BeforeClass + public static void startServers() throws Exception { + AbstractResourceInfo.clearAllMaps(); + //keep out of process due to stack traces testing failures + assertTrue("server did not launch correctly", launchServer(Server.class, true)); + createStaticBus(); + } + + @Before + public void setUp() { + TestSpanReceiver.clear(); + } + + @Test + public void testThatPatternValidationFails() { + final Response r = createWebClient("/bookstore/books").get(); + assertEquals(Status.OK.getStatusCode(), r.getStatus()); + + assertThat(TestSpanReceiver.getAllSpans().size(), equalTo(1)); + assertThat(TestSpanReceiver.getAllSpans().get(0).getDescription(), equalTo("Get Books")); + } + + protected WebClient createWebClient(final String url) { + return WebClient + .create("http://localhost:" + PORT + url) + .accept(MediaType.APPLICATION_JSON); + } +} http://git-wip-us.apache.org/repos/asf/cxf/blob/7e82d2f1/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/TestSpanReceiver.java ---------------------------------------------------------------------- diff --git a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/TestSpanReceiver.java b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/TestSpanReceiver.java new file mode 100644 index 0000000..1f533a7 --- /dev/null +++ b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/htrace/TestSpanReceiver.java @@ -0,0 +1,61 @@ +/** + * 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.systest.jaxrs.tracing.htrace; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; + +import org.apache.htrace.HTraceConfiguration; +import org.apache.htrace.Span; +import org.apache.htrace.SpanReceiver; + +/** + * Test HTrace Span receiver + */ +public class TestSpanReceiver implements SpanReceiver { + private static Collection<Span> spans = new HashSet<Span>(); + + public TestSpanReceiver(final HTraceConfiguration conf) { + } + + public Collection<Span> getSpans() { + return spans; + } + + @Override + public void close() throws IOException { + } + + @Override + public void receiveSpan(Span span) { + spans.add(span); + } + + public static void clear() { + spans.clear(); + } + + public static List<Span> getAllSpans() { + return new ArrayList< Span >(spans); + } + +} \ No newline at end of file
