This is an automated email from the ASF dual-hosted git repository.
reta pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cxf.git
The following commit(s) were added to refs/heads/main by this push:
new 400ed2294f CXF-8817: Micrometer Observation (add more test cases and
minor cleanup)
400ed2294f is described below
commit 400ed2294f316c46f5bce5190314e6ab1f504ba8
Author: Andriy Redko <[email protected]>
AuthorDate: Mon Aug 14 21:57:31 2023 -0400
CXF-8817: Micrometer Observation (add more test cases and minor cleanup)
---
.../cxf/tracing/micrometer/ObservationFeature.java | 2 +-
.../ContainerRequestSenderObservationContext.java | 2 -
.../micrometer/ObservationIntegrationTest.java | 2 -
.../{ => jaxrs}/AbstractBraveTracingTest.java | 3 +-
.../jaxws/AbstractBraveTracingTest.java} | 71 ++-----
.../jaxrs/tracing/brave/BraveTracingTest.java | 2 +-
.../tracing/micrometer/MicrometerTracingTest.java | 51 +----
.../jaxws/tracing/brave/BraveTracingTest.java | 217 +--------------------
.../tracing/micrometer/MicrometerTracingTest.java | 124 ++++++++++++
.../micrometer/ObservationRegistrySupport.java | 73 +++++++
10 files changed, 229 insertions(+), 318 deletions(-)
diff --git
a/integration/tracing/tracing-micrometer/src/main/java/org/apache/cxf/tracing/micrometer/ObservationFeature.java
b/integration/tracing/tracing-micrometer/src/main/java/org/apache/cxf/tracing/micrometer/ObservationFeature.java
index 067f4af541..ec8e9d6907 100644
---
a/integration/tracing/tracing-micrometer/src/main/java/org/apache/cxf/tracing/micrometer/ObservationFeature.java
+++
b/integration/tracing/tracing-micrometer/src/main/java/org/apache/cxf/tracing/micrometer/ObservationFeature.java
@@ -39,7 +39,7 @@ public class ObservationFeature extends
DelegatingFeature<ObservationFeature.Por
}
public ObservationFeature(final ObservationRegistry observationRegistry,
final @Nullable
- MessageInObservationConvention convention) {
+ MessageInObservationConvention convention) {
super(new Portable(observationRegistry, convention));
}
diff --git
a/integration/tracing/tracing-micrometer/src/main/java/org/apache/cxf/tracing/micrometer/jaxrs/ContainerRequestSenderObservationContext.java
b/integration/tracing/tracing-micrometer/src/main/java/org/apache/cxf/tracing/micrometer/jaxrs/ContainerRequestSenderObservationContext.java
index efb5774a6b..b9e058332b 100644
---
a/integration/tracing/tracing-micrometer/src/main/java/org/apache/cxf/tracing/micrometer/jaxrs/ContainerRequestSenderObservationContext.java
+++
b/integration/tracing/tracing-micrometer/src/main/java/org/apache/cxf/tracing/micrometer/jaxrs/ContainerRequestSenderObservationContext.java
@@ -22,8 +22,6 @@ package org.apache.cxf.tracing.micrometer.jaxrs;
import io.micrometer.observation.transport.RequestReplySenderContext;
import jakarta.ws.rs.client.ClientRequestContext;
import jakarta.ws.rs.client.ClientResponseContext;
-import jakarta.ws.rs.container.ContainerRequestContext;
-import jakarta.ws.rs.container.ContainerResponseContext;
/**
*
diff --git
a/integration/tracing/tracing-micrometer/src/test/java/org/apache/cxf/tracing/micrometer/ObservationIntegrationTest.java
b/integration/tracing/tracing-micrometer/src/test/java/org/apache/cxf/tracing/micrometer/ObservationIntegrationTest.java
index 141f7dda8b..d361d131db 100644
---
a/integration/tracing/tracing-micrometer/src/test/java/org/apache/cxf/tracing/micrometer/ObservationIntegrationTest.java
+++
b/integration/tracing/tracing-micrometer/src/test/java/org/apache/cxf/tracing/micrometer/ObservationIntegrationTest.java
@@ -24,8 +24,6 @@ import org.apache.cxf.endpoint.Server;
import org.apache.cxf.feature.Feature;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
-import org.apache.cxf.tracing.micrometer.ObservationClientFeature;
-import org.apache.cxf.tracing.micrometer.ObservationFeature;
import org.junit.jupiter.api.AfterEach;
import io.micrometer.core.tck.MeterRegistryAssert;
diff --git
a/systests/tracing/src/test/java/org/apache/cxf/systest/brave/AbstractBraveTracingTest.java
b/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxrs/AbstractBraveTracingTest.java
similarity index 99%
rename from
systests/tracing/src/test/java/org/apache/cxf/systest/brave/AbstractBraveTracingTest.java
rename to
systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxrs/AbstractBraveTracingTest.java
index 34eaa3d4c7..faa149cd81 100644
---
a/systests/tracing/src/test/java/org/apache/cxf/systest/brave/AbstractBraveTracingTest.java
+++
b/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxrs/AbstractBraveTracingTest.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.cxf.systest.brave;
+package org.apache.cxf.systest.brave.jaxrs;
import java.net.MalformedURLException;
import java.time.Duration;
@@ -40,6 +40,7 @@ import jakarta.ws.rs.core.Response.Status;
import org.apache.cxf.feature.Feature;
import org.apache.cxf.jaxrs.client.WebClient;
import org.apache.cxf.systest.brave.BraveTestSupport.SpanId;
+import org.apache.cxf.systest.brave.TestSpanReporter;
import org.apache.cxf.testutil.common.AbstractClientServerTestBase;
import org.apache.cxf.transports.http.configuration.HTTPClientPolicy;
diff --git
a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/brave/BraveTracingTest.java
b/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxws/AbstractBraveTracingTest.java
similarity index 82%
copy from
systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/brave/BraveTracingTest.java
copy to
systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxws/AbstractBraveTracingTest.java
index 77d94b5f59..a059963a59 100644
---
a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/brave/BraveTracingTest.java
+++
b/systests/tracing/src/test/java/org/apache/cxf/systest/brave/jaxws/AbstractBraveTracingTest.java
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.cxf.systest.jaxws.tracing.brave;
+package org.apache.cxf.systest.brave.jaxws;
import java.util.Arrays;
import java.util.Collections;
@@ -36,18 +36,12 @@ import org.apache.cxf.feature.Feature;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
-import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.message.Message;
import org.apache.cxf.systest.brave.BraveTestSupport.SpanId;
import org.apache.cxf.systest.brave.TestSpanReporter;
import org.apache.cxf.systest.jaxws.tracing.BookStoreService;
import org.apache.cxf.testutil.common.AbstractClientServerTestBase;
-import org.apache.cxf.testutil.common.AbstractTestServerBase;
-import org.apache.cxf.tracing.brave.BraveClientFeature;
-import org.apache.cxf.tracing.brave.BraveFeature;
-import org.junit.After;
-import org.junit.BeforeClass;
import org.junit.Test;
import static
org.apache.cxf.systest.brave.BraveTestSupport.PARENT_SPAN_ID_NAME;
@@ -60,47 +54,9 @@ import static org.hamcrest.CoreMatchers.nullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.collection.IsMapContaining.hasEntry;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
-public class BraveTracingTest extends AbstractClientServerTestBase {
- public static final String PORT = allocatePort(BraveTracingTest.class);
-
- public static class Server extends AbstractTestServerBase {
-
- private org.apache.cxf.endpoint.Server server;
-
- @Override
- protected void run() {
- final Tracing brave = Tracing.newBuilder()
- .localServiceName("book-store")
- .spanReporter(new TestSpanReporter())
- .build();
-
- final JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
- sf.setServiceClass(BookStore.class);
- sf.setAddress("http://localhost:" + PORT);
- sf.getFeatures().add(new BraveFeature(brave));
- server = sf.create();
- }
-
- @Override
- public void tearDown() throws Exception {
- server.destroy();
- }
- }
-
- @BeforeClass
- public static void startServers() throws Exception {
- //keep out of process due to stack traces testing failures
- assertTrue("server did not launch correctly",
launchServer(Server.class, true));
- }
-
- @After
- public void tearDown() {
- TestSpanReporter.clear();
- }
-
+public abstract class AbstractBraveTracingTest extends
AbstractClientServerTestBase {
@Test
public void testThatNewSpanIsCreatedWhenNotProvided() throws Exception {
final BookStoreService service = createJaxWsService();
@@ -144,7 +100,7 @@ public class BraveTracingTest extends
AbstractClientServerTestBase {
@Test
public void testThatNewChildSpanIsCreatedWhenParentIsProvided() throws
Exception {
try (Tracing brave = createTracer()) {
- final BookStoreService service = createJaxWsService(new
BraveClientFeature(brave));
+ final BookStoreService service =
createJaxWsService(getClientFeature(brave));
assertThat(service.getBooks().size(), equalTo(2));
assertThat(TestSpanReporter.getAllSpans().size(), equalTo(3));
@@ -152,14 +108,14 @@ public class BraveTracingTest extends
AbstractClientServerTestBase {
assertThat(TestSpanReporter.getAllSpans().get(0).parentId(),
not(nullValue()));
assertThat(TestSpanReporter.getAllSpans().get(1).name(),
equalTo("post /bookstore"));
assertThat(TestSpanReporter.getAllSpans().get(2).name(),
- equalTo("post http://localhost:" + PORT + "/bookstore"));
+ equalTo("post http://localhost:" + getPort() + "/bookstore"));
}
}
@Test
public void testThatProvidedSpanIsNotClosedWhenActive() throws Exception {
try (Tracing brave = createTracer()) {
- final BookStoreService service = createJaxWsService(new
BraveClientFeature(brave));
+ final BookStoreService service =
createJaxWsService(getClientFeature(brave));
final Span span = brave.tracer().nextSpan().name("test
span").start();
try {
@@ -172,7 +128,7 @@ public class BraveTracingTest extends
AbstractClientServerTestBase {
assertThat(TestSpanReporter.getAllSpans().get(0).parentId(), not(nullValue()));
assertThat(TestSpanReporter.getAllSpans().get(1).name(),
equalTo("post /bookstore"));
assertThat(TestSpanReporter.getAllSpans().get(2).name(),
- equalTo("post http://localhost:" + PORT +
"/bookstore"));
+ equalTo("post http://localhost:" + getPort() +
"/bookstore"));
}
} finally {
if (span != null) {
@@ -209,7 +165,7 @@ public class BraveTracingTest extends
AbstractClientServerTestBase {
@Test
public void
testThatNewChildSpanIsCreatedWhenParentIsProvidedInCaseOfFault() throws
Exception {
try (Tracing brave = createTracer()) {
- final BookStoreService service = createJaxWsService(new
BraveClientFeature(brave));
+ final BookStoreService service =
createJaxWsService(getClientFeature(brave));
try {
service.removeBooks();
@@ -221,22 +177,21 @@ public class BraveTracingTest extends
AbstractClientServerTestBase {
assertThat(TestSpanReporter.getAllSpans().size(), equalTo(2));
assertThat(TestSpanReporter.getAllSpans().get(0).name(),
equalTo("post /bookstore"));
assertThat(TestSpanReporter.getAllSpans().get(1).name(),
- equalTo("post http://localhost:" + PORT + "/bookstore"));
+ equalTo("post http://localhost:" + getPort() + "/bookstore"));
}
}
@Test
public void
testThatNewChildSpanIsCreatedWhenParentIsProvidedAndCustomStatusCodeReturned()
throws Exception {
try (Tracing brave = createTracer()) {
- final BookStoreService service = createJaxWsService(new
BraveClientFeature(brave));
+ final BookStoreService service =
createJaxWsService(getClientFeature(brave));
service.addBooks();
assertThat(TestSpanReporter.getAllSpans().size(), equalTo(2));
assertThat(TestSpanReporter.getAllSpans().get(0).name(),
equalTo("post /bookstore"));
- assertThat(TestSpanReporter.getAllSpans().get(0).parentId(),
nullValue());
assertThat(TestSpanReporter.getAllSpans().get(0).tags(),
hasEntry("http.status_code", "305"));
assertThat(TestSpanReporter.getAllSpans().get(1).name(),
- equalTo("post http://localhost:" + PORT + "/bookstore"));
+ equalTo("post http://localhost:" + getPort() +
"/bookstore"));
}
}
@@ -257,7 +212,7 @@ public class BraveTracingTest extends
AbstractClientServerTestBase {
factory.getOutInterceptors().add(new LoggingOutInterceptor());
factory.getInInterceptors().add(new LoggingInInterceptor());
factory.setServiceClass(BookStoreService.class);
- factory.setAddress("http://localhost:" + PORT + "/BookStore");
+ factory.setAddress("http://localhost:" + getPort() + "/BookStore");
if (feature != null) {
factory.getFeatures().add(feature);
@@ -281,4 +236,8 @@ public class BraveTracingTest extends
AbstractClientServerTestBase {
.spanReporter(new TestSpanReporter())
.build();
}
+
+ protected abstract int getPort();
+
+ protected abstract Feature getClientFeature(Tracing tracing);
}
diff --git
a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/brave/BraveTracingTest.java
b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/brave/BraveTracingTest.java
index 220b47758a..93e0a6e28b 100644
---
a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/brave/BraveTracingTest.java
+++
b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/brave/BraveTracingTest.java
@@ -24,8 +24,8 @@ import brave.Tracing;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
-import org.apache.cxf.systest.brave.AbstractBraveTracingTest;
import org.apache.cxf.systest.brave.TestSpanReporter;
+import org.apache.cxf.systest.brave.jaxrs.AbstractBraveTracingTest;
import org.apache.cxf.systest.jaxrs.tracing.BookStore;
import org.apache.cxf.systest.jaxrs.tracing.NullPointerExceptionMapper;
import org.apache.cxf.testutil.common.AbstractTestServerBase;
diff --git
a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/micrometer/MicrometerTracingTest.java
b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/micrometer/MicrometerTracingTest.java
index 1f36063439..231c6b1671 100644
---
a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/micrometer/MicrometerTracingTest.java
+++
b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxrs/tracing/micrometer/MicrometerTracingTest.java
@@ -25,8 +25,8 @@ import org.apache.cxf.feature.Feature;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.apache.cxf.jaxrs.model.AbstractResourceInfo;
-import org.apache.cxf.systest.brave.AbstractBraveTracingTest;
import org.apache.cxf.systest.brave.TestSpanReporter;
+import org.apache.cxf.systest.brave.jaxrs.AbstractBraveTracingTest;
import org.apache.cxf.systest.jaxrs.tracing.BookStore;
import org.apache.cxf.systest.jaxrs.tracing.NullPointerExceptionMapper;
import org.apache.cxf.testutil.common.AbstractTestServerBase;
@@ -43,25 +43,13 @@ import
org.apache.cxf.tracing.micrometer.jaxrs.ObservationFeature;
import io.micrometer.common.KeyValue;
import io.micrometer.common.KeyValues;
-import io.micrometer.common.util.StringUtils;
import io.micrometer.core.instrument.MeterRegistry;
-import
io.micrometer.core.instrument.observation.DefaultMeterObservationHandler;
import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
-import io.micrometer.observation.Observation.Context;
-import
io.micrometer.observation.ObservationHandler.FirstMatchingCompositeObservationHandler;
import io.micrometer.observation.ObservationRegistry;
-import io.micrometer.tracing.CurrentTraceContext;
-import io.micrometer.tracing.Tracer;
-import io.micrometer.tracing.brave.bridge.BraveBaggageManager;
-import io.micrometer.tracing.brave.bridge.BraveCurrentTraceContext;
-import io.micrometer.tracing.brave.bridge.BravePropagator;
-import io.micrometer.tracing.brave.bridge.BraveTracer;
-import io.micrometer.tracing.handler.DefaultTracingObservationHandler;
-import
io.micrometer.tracing.handler.PropagatingReceiverTracingObservationHandler;
-import
io.micrometer.tracing.handler.PropagatingSenderTracingObservationHandler;
import org.junit.BeforeClass;
+import static
org.apache.cxf.systest.micrometer.ObservationRegistrySupport.createObservationRegistry;
import static org.junit.Assert.assertTrue;
public class MicrometerTracingTest extends AbstractBraveTracingTest {
@@ -79,7 +67,7 @@ public class MicrometerTracingTest extends
AbstractBraveTracingTest {
.spanReporter(new TestSpanReporter())
.build();
- final ObservationRegistry observationRegistry =
createObservationRegistry(brave);
+ final ObservationRegistry observationRegistry =
createObservationRegistry(meterRegistry, brave);
final JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
sf.setResourceClasses(BookStore.class);
sf.setResourceProvider(BookStore.class, new
SingletonResourceProvider(new BookStore<TraceScope>()));
@@ -126,7 +114,7 @@ public class MicrometerTracingTest extends
AbstractBraveTracingTest {
@Override
protected Object getClientProvider(Tracing tracing) {
- return new
ObservationClientProvider(createObservationRegistry(tracing),
+ return new
ObservationClientProvider(createObservationRegistry(meterRegistry, tracing),
new DefaultContainerRequestSenderObservationConvention() {
@Override
public String
getContextualName(ContainerRequestSenderObservationContext context) {
@@ -139,7 +127,7 @@ public class MicrometerTracingTest extends
AbstractBraveTracingTest {
@Override
protected Feature getClientFeature(Tracing tracing) {
- return new
ObservationClientFeature(createObservationRegistry(tracing),
+ return new
ObservationClientFeature(createObservationRegistry(meterRegistry, tracing),
new DefaultMessageOutObservationConvention() {
// To align with Brave's defaults
@Override
@@ -154,33 +142,4 @@ public class MicrometerTracingTest extends
AbstractBraveTracingTest {
protected int getPort() {
return Integer.parseInt(PORT);
}
-
- private static ObservationRegistry createObservationRegistry(final Tracing
brave) {
- final CurrentTraceContext bridgeContext = new
BraveCurrentTraceContext(brave.currentTraceContext());
- final Tracer tracer = new BraveTracer(brave.tracer(), bridgeContext,
new BraveBaggageManager());
- final BravePropagator propagator = new BravePropagator(brave);
-
- final ObservationRegistry observationRegistry =
ObservationRegistry.create();
-
- observationRegistry.observationConfig().observationHandler(
- new DefaultMeterObservationHandler(meterRegistry));
-
- observationRegistry.observationConfig().observationHandler(
- new FirstMatchingCompositeObservationHandler(
- new PropagatingSenderTracingObservationHandler<>(tracer,
propagator),
- new PropagatingReceiverTracingObservationHandler<>(tracer,
propagator),
- new DefaultTracingObservationHandler(tracer) {
- // To align with Brave's defaults
- @Override
- public String getSpanName(Context context) {
- String name = context.getName();
- if
(StringUtils.isNotBlank(context.getContextualName())) {
- name = context.getContextualName();
- }
- return name;
- }
- }));
-
- return observationRegistry;
- }
}
diff --git
a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/brave/BraveTracingTest.java
b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/brave/BraveTracingTest.java
index 77d94b5f59..ab6a2af294 100644
---
a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/brave/BraveTracingTest.java
+++
b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/brave/BraveTracingTest.java
@@ -18,52 +18,22 @@
*/
package org.apache.cxf.systest.jaxws.tracing.brave;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import brave.Span;
-import brave.Tracer.SpanInScope;
import brave.Tracing;
-import jakarta.xml.ws.soap.SOAPFaultException;
-import org.apache.cxf.endpoint.Client;
-import org.apache.cxf.ext.logging.LoggingInInterceptor;
-import org.apache.cxf.ext.logging.LoggingOutInterceptor;
import org.apache.cxf.feature.Feature;
-import org.apache.cxf.frontend.ClientProxy;
-import org.apache.cxf.helpers.CastUtils;
-import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
-import org.apache.cxf.message.Message;
-import org.apache.cxf.systest.brave.BraveTestSupport.SpanId;
import org.apache.cxf.systest.brave.TestSpanReporter;
-import org.apache.cxf.systest.jaxws.tracing.BookStoreService;
-import org.apache.cxf.testutil.common.AbstractClientServerTestBase;
+import org.apache.cxf.systest.brave.jaxws.AbstractBraveTracingTest;
import org.apache.cxf.testutil.common.AbstractTestServerBase;
import org.apache.cxf.tracing.brave.BraveClientFeature;
import org.apache.cxf.tracing.brave.BraveFeature;
import org.junit.After;
import org.junit.BeforeClass;
-import org.junit.Test;
-import static
org.apache.cxf.systest.brave.BraveTestSupport.PARENT_SPAN_ID_NAME;
-import static org.apache.cxf.systest.brave.BraveTestSupport.SAMPLED_NAME;
-import static org.apache.cxf.systest.brave.BraveTestSupport.SPAN_ID_NAME;
-import static org.apache.cxf.systest.brave.BraveTestSupport.TRACE_ID_NAME;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.collection.IsMapContaining.hasEntry;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-public class BraveTracingTest extends AbstractClientServerTestBase {
+public class BraveTracingTest extends AbstractBraveTracingTest {
public static final String PORT = allocatePort(BraveTracingTest.class);
public static class Server extends AbstractTestServerBase {
@@ -101,184 +71,13 @@ public class BraveTracingTest extends
AbstractClientServerTestBase {
TestSpanReporter.clear();
}
- @Test
- public void testThatNewSpanIsCreatedWhenNotProvided() throws Exception {
- final BookStoreService service = createJaxWsService();
- assertThat(service.getBooks().size(), equalTo(2));
-
- assertThat(TestSpanReporter.getAllSpans().size(), equalTo(2));
- assertThat(TestSpanReporter.getAllSpans().get(0).name(), equalTo("get
books"));
- assertThat(TestSpanReporter.getAllSpans().get(1).name(), equalTo("post
/bookstore"));
-
- final Map<String, List<String>> headers = getResponseHeaders(service);
- assertFalse(headers.containsKey(TRACE_ID_NAME));
- assertFalse(headers.containsKey(SAMPLED_NAME));
- assertFalse(headers.containsKey(PARENT_SPAN_ID_NAME));
- assertFalse(headers.containsKey(SPAN_ID_NAME));
- }
-
- @Test
- public void testThatNewInnerSpanIsCreated() throws Exception {
- final Random random = new Random();
-
- final SpanId spanId = new SpanId()
- .traceId(random.nextLong())
- .parentId(random.nextLong())
- .spanId(random.nextLong())
- .sampled(true);
-
- final Map<String, List<String>> headers = new HashMap<>();
- headers.put(SPAN_ID_NAME,
Arrays.asList(Long.toString(spanId.spanId())));
- headers.put(TRACE_ID_NAME,
Arrays.asList(Long.toString(spanId.traceId())));
- headers.put(SAMPLED_NAME,
Arrays.asList(Boolean.toString(spanId.sampled())));
- headers.put(PARENT_SPAN_ID_NAME,
Arrays.asList(Long.toString(spanId.parentId())));
-
- final BookStoreService service = createJaxWsService(headers);
- assertThat(service.getBooks().size(), equalTo(2));
-
- assertThat(TestSpanReporter.getAllSpans().size(), equalTo(2));
- assertThat(TestSpanReporter.getAllSpans().get(0).name(), equalTo("get
books"));
- assertThat(TestSpanReporter.getAllSpans().get(1).name(), equalTo("post
/bookstore"));
- }
-
- @Test
- public void testThatNewChildSpanIsCreatedWhenParentIsProvided() throws
Exception {
- try (Tracing brave = createTracer()) {
- final BookStoreService service = createJaxWsService(new
BraveClientFeature(brave));
- assertThat(service.getBooks().size(), equalTo(2));
-
- assertThat(TestSpanReporter.getAllSpans().size(), equalTo(3));
- assertThat(TestSpanReporter.getAllSpans().get(0).name(),
equalTo("get books"));
- assertThat(TestSpanReporter.getAllSpans().get(0).parentId(),
not(nullValue()));
- assertThat(TestSpanReporter.getAllSpans().get(1).name(),
equalTo("post /bookstore"));
- assertThat(TestSpanReporter.getAllSpans().get(2).name(),
- equalTo("post http://localhost:" + PORT + "/bookstore"));
- }
- }
-
- @Test
- public void testThatProvidedSpanIsNotClosedWhenActive() throws Exception {
- try (Tracing brave = createTracer()) {
- final BookStoreService service = createJaxWsService(new
BraveClientFeature(brave));
-
- final Span span = brave.tracer().nextSpan().name("test
span").start();
- try {
- try (SpanInScope scope = brave.tracer().withSpanInScope(span))
{
- assertThat(service.getBooks().size(), equalTo(2));
- assertThat(brave.tracer().currentSpan(), not(nullValue()));
-
- assertThat(TestSpanReporter.getAllSpans().size(),
equalTo(3));
- assertThat(TestSpanReporter.getAllSpans().get(0).name(),
equalTo("get books"));
-
assertThat(TestSpanReporter.getAllSpans().get(0).parentId(), not(nullValue()));
- assertThat(TestSpanReporter.getAllSpans().get(1).name(),
equalTo("post /bookstore"));
- assertThat(TestSpanReporter.getAllSpans().get(2).name(),
- equalTo("post http://localhost:" + PORT +
"/bookstore"));
- }
- } finally {
- if (span != null) {
- span.finish();
- }
- }
-
- assertThat(TestSpanReporter.getAllSpans().size(), equalTo(4));
- assertThat(TestSpanReporter.getAllSpans().get(3).name(),
equalTo("test span"));
- }
- }
-
- @Test
- public void testThatNewSpanIsCreatedInCaseOfFault() throws Exception {
- final BookStoreService service = createJaxWsService();
-
- try {
- service.removeBooks();
- fail("Expected SOAPFaultException to be raised");
- } catch (final SOAPFaultException ex) {
- /* expected exception */
- }
-
- assertThat(TestSpanReporter.getAllSpans().size(), equalTo(1));
- assertThat(TestSpanReporter.getAllSpans().get(0).name(), equalTo("post
/bookstore"));
-
- final Map<String, List<String>> headers = getResponseHeaders(service);
- assertFalse(headers.containsKey(TRACE_ID_NAME));
- assertFalse(headers.containsKey(SAMPLED_NAME));
- assertFalse(headers.containsKey(PARENT_SPAN_ID_NAME));
- assertFalse(headers.containsKey(SPAN_ID_NAME));
- }
-
- @Test
- public void
testThatNewChildSpanIsCreatedWhenParentIsProvidedInCaseOfFault() throws
Exception {
- try (Tracing brave = createTracer()) {
- final BookStoreService service = createJaxWsService(new
BraveClientFeature(brave));
-
- try {
- service.removeBooks();
- fail("Expected SOAPFaultException to be raised");
- } catch (final SOAPFaultException ex) {
- /* expected exception */
- }
-
- assertThat(TestSpanReporter.getAllSpans().size(), equalTo(2));
- assertThat(TestSpanReporter.getAllSpans().get(0).name(),
equalTo("post /bookstore"));
- assertThat(TestSpanReporter.getAllSpans().get(1).name(),
- equalTo("post http://localhost:" + PORT + "/bookstore"));
- }
- }
-
- @Test
- public void
testThatNewChildSpanIsCreatedWhenParentIsProvidedAndCustomStatusCodeReturned()
throws Exception {
- try (Tracing brave = createTracer()) {
- final BookStoreService service = createJaxWsService(new
BraveClientFeature(brave));
- service.addBooks();
-
- assertThat(TestSpanReporter.getAllSpans().size(), equalTo(2));
- assertThat(TestSpanReporter.getAllSpans().get(0).name(),
equalTo("post /bookstore"));
- assertThat(TestSpanReporter.getAllSpans().get(0).parentId(),
nullValue());
- assertThat(TestSpanReporter.getAllSpans().get(0).tags(),
hasEntry("http.status_code", "305"));
- assertThat(TestSpanReporter.getAllSpans().get(1).name(),
- equalTo("post http://localhost:" + PORT + "/bookstore"));
- }
- }
-
- private BookStoreService createJaxWsService() {
- return createJaxWsService(Collections.emptyMap());
- }
-
- private BookStoreService createJaxWsService(final Map<String,
List<String>> headers) {
- return createJaxWsService(headers, null);
+ @Override
+ protected int getPort() {
+ return Integer.parseInt(PORT);
}
- private BookStoreService createJaxWsService(final Feature feature) {
- return createJaxWsService(Collections.emptyMap(), feature);
- }
-
- private BookStoreService createJaxWsService(final Map<String,
List<String>> headers, final Feature feature) {
- JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
- factory.getOutInterceptors().add(new LoggingOutInterceptor());
- factory.getInInterceptors().add(new LoggingInInterceptor());
- factory.setServiceClass(BookStoreService.class);
- factory.setAddress("http://localhost:" + PORT + "/BookStore");
-
- if (feature != null) {
- factory.getFeatures().add(feature);
- }
-
- final BookStoreService service = (BookStoreService) factory.create();
- final Client proxy = ClientProxy.getClient(service);
- proxy.getRequestContext().put(Message.PROTOCOL_HEADERS, headers);
-
- return service;
- }
-
- private static Map<String, List<String>> getResponseHeaders(final
BookStoreService service) {
- final Client proxy = ClientProxy.getClient(service);
- return CastUtils.cast((Map<?,
?>)proxy.getResponseContext().get(Message.PROTOCOL_HEADERS));
- }
-
- private static Tracing createTracer() {
- return Tracing.newBuilder()
- .localServiceName("book-store")
- .spanReporter(new TestSpanReporter())
- .build();
+ @Override
+ protected Feature getClientFeature(Tracing tracing) {
+ return new BraveClientFeature(tracing);
}
}
diff --git
a/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/micrometer/MicrometerTracingTest.java
b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/micrometer/MicrometerTracingTest.java
new file mode 100644
index 0000000000..a01121752c
--- /dev/null
+++
b/systests/tracing/src/test/java/org/apache/cxf/systest/jaxws/tracing/micrometer/MicrometerTracingTest.java
@@ -0,0 +1,124 @@
+/**
+ * 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.jaxws.tracing.micrometer;
+
+import brave.Tracing;
+import org.apache.cxf.feature.Feature;
+import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.systest.brave.TestSpanReporter;
+import org.apache.cxf.systest.brave.jaxws.AbstractBraveTracingTest;
+import org.apache.cxf.systest.jaxws.tracing.brave.BookStore;
+import org.apache.cxf.testutil.common.AbstractTestServerBase;
+import org.apache.cxf.tracing.micrometer.DefaultMessageInObservationConvention;
+import
org.apache.cxf.tracing.micrometer.DefaultMessageOutObservationConvention;
+import org.apache.cxf.tracing.micrometer.MessageInContext;
+import org.apache.cxf.tracing.micrometer.MessageOutContext;
+import org.apache.cxf.tracing.micrometer.ObservationClientFeature;
+import org.apache.cxf.tracing.micrometer.ObservationFeature;
+
+import io.micrometer.common.KeyValue;
+import io.micrometer.common.KeyValues;
+import io.micrometer.core.instrument.MeterRegistry;
+import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
+import io.micrometer.observation.ObservationRegistry;
+
+import org.junit.After;
+import org.junit.BeforeClass;
+
+import static
org.apache.cxf.systest.micrometer.ObservationRegistrySupport.createObservationRegistry;
+import static org.junit.Assert.assertTrue;
+
+public class MicrometerTracingTest extends AbstractBraveTracingTest {
+ public static final String PORT =
allocatePort(MicrometerTracingTest.class);
+
+ private static MeterRegistry meterRegistry;
+
+ public static class Server extends AbstractTestServerBase {
+ private org.apache.cxf.endpoint.Server server;
+
+ @Override
+ protected void run() {
+ final Tracing brave = Tracing.newBuilder()
+ .localServiceName("book-store")
+ .spanReporter(new TestSpanReporter())
+ .build();
+
+ final ObservationRegistry observationRegistry =
createObservationRegistry(meterRegistry, brave);
+ final JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
+ sf.setServiceClass(BookStore.class);
+ sf.setAddress("http://localhost:" + PORT);
+ sf.getFeatures().add(new ObservationFeature(observationRegistry,
+ new DefaultMessageInObservationConvention() {
+ @Override
+ public String getContextualName(MessageInContext context) {
+ return
context.getMessage().get(Message.HTTP_REQUEST_METHOD) + " "
+ + context.getUri().getPath();
+ }
+
+ @Override
+ public KeyValues
getLowCardinalityKeyValues(MessageInContext context) {
+ KeyValues keyValues =
super.getLowCardinalityKeyValues(context);
+ if (context.getResponse() != null) {
+ return
keyValues.and(KeyValue.of("http.status_code",
+
String.valueOf(context.getResponse().get(Message.RESPONSE_CODE))));
+ }
+ return keyValues;
+ }
+ }));
+ server = sf.create();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ server.destroy();
+ }
+ }
+
+ @BeforeClass
+ public static void startServers() throws Exception {
+ meterRegistry = new SimpleMeterRegistry();
+ //keep out of process due to stack traces testing failures
+ assertTrue("server did not launch correctly",
launchServer(Server.class, true));
+ }
+
+ @After
+ public void tearDown() {
+ TestSpanReporter.clear();
+ }
+
+ @Override
+ protected int getPort() {
+ return Integer.parseInt(PORT);
+ }
+
+ @Override
+ protected Feature getClientFeature(Tracing tracing) {
+ return new
ObservationClientFeature(createObservationRegistry(meterRegistry, tracing),
+ new DefaultMessageOutObservationConvention() {
+ // To align with Brave's defaults
+ @Override
+ public String getContextualName(MessageOutContext context) {
+ return
context.getMessage().get(Message.HTTP_REQUEST_METHOD) + " "
+ + context.getUri().toString();
+ }
+ }
+ );
+ }
+}
diff --git
a/systests/tracing/src/test/java/org/apache/cxf/systest/micrometer/ObservationRegistrySupport.java
b/systests/tracing/src/test/java/org/apache/cxf/systest/micrometer/ObservationRegistrySupport.java
new file mode 100644
index 0000000000..229ed1e660
--- /dev/null
+++
b/systests/tracing/src/test/java/org/apache/cxf/systest/micrometer/ObservationRegistrySupport.java
@@ -0,0 +1,73 @@
+/**
+ * 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.micrometer;
+
+import brave.Tracing;
+
+import io.micrometer.common.util.StringUtils;
+import io.micrometer.core.instrument.MeterRegistry;
+import
io.micrometer.core.instrument.observation.DefaultMeterObservationHandler;
+import io.micrometer.observation.Observation.Context;
+import
io.micrometer.observation.ObservationHandler.FirstMatchingCompositeObservationHandler;
+import io.micrometer.observation.ObservationRegistry;
+import io.micrometer.tracing.CurrentTraceContext;
+import io.micrometer.tracing.Tracer;
+import io.micrometer.tracing.brave.bridge.BraveBaggageManager;
+import io.micrometer.tracing.brave.bridge.BraveCurrentTraceContext;
+import io.micrometer.tracing.brave.bridge.BravePropagator;
+import io.micrometer.tracing.brave.bridge.BraveTracer;
+import io.micrometer.tracing.handler.DefaultTracingObservationHandler;
+import
io.micrometer.tracing.handler.PropagatingReceiverTracingObservationHandler;
+import
io.micrometer.tracing.handler.PropagatingSenderTracingObservationHandler;
+
+public final class ObservationRegistrySupport {
+ private ObservationRegistrySupport() {
+ }
+
+ public static ObservationRegistry createObservationRegistry(final
MeterRegistry meterRegistry,
+ final Tracing brave) {
+
+ final CurrentTraceContext bridgeContext = new
BraveCurrentTraceContext(brave.currentTraceContext());
+ final Tracer tracer = new BraveTracer(brave.tracer(), bridgeContext,
new BraveBaggageManager());
+ final BravePropagator propagator = new BravePropagator(brave);
+
+ final ObservationRegistry observationRegistry =
ObservationRegistry.create();
+
+ observationRegistry.observationConfig().observationHandler(
+ new DefaultMeterObservationHandler(meterRegistry));
+
+ observationRegistry.observationConfig().observationHandler(
+ new FirstMatchingCompositeObservationHandler(
+ new PropagatingSenderTracingObservationHandler<>(tracer,
propagator),
+ new PropagatingReceiverTracingObservationHandler<>(tracer,
propagator),
+ new DefaultTracingObservationHandler(tracer) {
+ // To align with Brave's defaults
+ @Override
+ public String getSpanName(Context context) {
+ String name = context.getName();
+ if
(StringUtils.isNotBlank(context.getContextualName())) {
+ name = context.getContextualName();
+ }
+ return name;
+ }
+ }));
+
+ return observationRegistry;
+ }
+}