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;
+    }
+}


Reply via email to