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 6fd233c8a4 Add tracing_micrometer sample project
6fd233c8a4 is described below

commit 6fd233c8a4915109bd4be9403c1f50cf7e6eeeed
Author: Andriy Redko <[email protected]>
AuthorDate: Thu Sep 14 22:30:56 2023 -0400

    Add tracing_micrometer sample project
---
 .../samples/jax_rs/tracing_micrometer/README.txt   |  34 +++++
 .../samples/jax_rs/tracing_micrometer/pom.xml      | 154 +++++++++++++++++++++
 .../java/demo/jaxrs/tracing/GoogleBooksApi.java    |  31 +++++
 .../jaxrs/tracing/ObservationRegistrySetup.java    |  65 +++++++++
 .../demo/jaxrs/tracing/OpenTelemetrySetup.java     |  46 ++++++
 .../java/demo/jaxrs/tracing/client/Client.java     |  50 +++++++
 .../java/demo/jaxrs/tracing/server/Catalog.java    |  10 +-
 .../jaxrs/tracing/server/CatalogApplication.java   |  48 +++++++
 .../demo/jaxrs/tracing/server/CatalogStore.java    |  71 ++++++++++
 .../java/demo/jaxrs/tracing/server/Server.java     |  55 ++++++++
 .../java/demo/jaxrs/tracing/server/Catalog.java    |   3 +-
 distribution/src/main/release/samples/pom.xml      |   1 +
 parent/pom.xml                                     |   5 +
 13 files changed, 567 insertions(+), 6 deletions(-)

diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_micrometer/README.txt 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/README.txt
new file mode 100644
index 0000000000..e8437eb451
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/README.txt
@@ -0,0 +1,34 @@
+JAX-RS Micrometer Observation Demo
+=================
+
+The demo shows a basic usage of Micrometer Observation APIs (distributed 
tracing)
+with REST based Web Services using JAX-RS 2.0 (JSR-339). The REST server 
provides the 
+following services at URL http://localhost:9000/catalog: 
+
+ - GET to http://localhost:9000/catalog 
+ - POST to http://localhost:9000/catalog 
+ - GET to http://localhost:9000/catalog/<id> 
+ - DELETE to URL http://localhost:9000/catalog/<id> 
+ - GET to URL http://localhost:9000/catalog/search?q=<query>
+
+The last endpoint calls public Google Books API in order to search the books 
by 
+query criteria. It demonstrates the integration with native OpenTelemetry 
instrumentation.
+
+Building and running the demo using Maven
+---------------------------------------
+
+From the base directory of this sample (i.e., where this README file is
+located), the Maven pom.xml file can be used to build and run the demo. 
+
+
+Using either UNIX or Windows:
+
+  mvn install
+  mvn -Pserver  (from one command line window)
+  mvn -Pclient  (from a second command line window)
+    
+
+To remove the target dir, run mvn clean".
+
+
+
diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_micrometer/pom.xml 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/pom.xml
new file mode 100644
index 0000000000..df341513a9
--- /dev/null
+++ b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/pom.xml
@@ -0,0 +1,154 @@
+<?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";>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>jax_rs_tracing_micrometer</artifactId>
+    <name>JAX-RS Demo Using Distributed Tracing with Micrometer 
Observation</name>
+    <description>JAX-RS Demo Using Distributed Tracing with Micrometer 
Observation</description>
+    <parent>
+        <groupId>org.apache.cxf.samples</groupId>
+        <artifactId>cxf-samples</artifactId>
+        <version>4.0.4-SNAPSHOT</version>
+        <relativePath>../..</relativePath>
+    </parent>
+    <properties>
+        <cxf.version>${project.version}</cxf.version>
+    </properties>
+    <profiles>
+        <profile>
+            <id>server</id>
+            <build>
+                <defaultGoal>test</defaultGoal>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>exec-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <phase>test</phase>
+                                <goals>
+                                    <goal>java</goal>
+                                </goals>
+                                <configuration>
+                                    
<mainClass>demo.jaxrs.tracing.server.Server</mainClass>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+        <profile>
+            <id>client</id>
+            <build>
+                <defaultGoal>test</defaultGoal>
+                <plugins>
+                    <plugin>
+                        <groupId>org.codehaus.mojo</groupId>
+                        <artifactId>exec-maven-plugin</artifactId>
+                        <executions>
+                            <execution>
+                                <phase>test</phase>
+                                <goals>
+                                    <goal>java</goal>
+                                </goals>
+                                <configuration>
+                                    
<mainClass>demo.jaxrs.tracing.client.Client</mainClass>
+                                </configuration>
+                            </execution>
+                        </executions>
+                    </plugin>
+                </plugins>
+            </build>
+        </profile>
+    </profiles>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-transports-http</artifactId>
+            <version>4.0.4-SNAPSHOT</version>
+        </dependency>
+        <!-- This dependency is needed if you're using the Jetty container -->
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-transports-http-jetty</artifactId>
+            <version>4.0.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-frontend-jaxrs</artifactId>
+            <version>4.0.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-rs-client</artifactId>
+            <version>4.0.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-integration-tracing-micrometer</artifactId>
+            <version>4.0.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.cxf</groupId>
+            <artifactId>cxf-rt-rs-extension-providers</artifactId>
+            <version>4.0.4-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.json</groupId>
+            <artifactId>jakarta.json-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.glassfish</groupId>
+            <artifactId>jakarta.json</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>jakarta.ws.rs</groupId>
+            <artifactId>jakarta.ws.rs-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.jetty</groupId>
+            <artifactId>jetty-webapp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-core</artifactId>
+            <version>12.5</version>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-httpclient</artifactId>
+            <version>12.5</version>
+        </dependency>
+        <dependency>
+            <groupId>io.github.openfeign</groupId>
+            <artifactId>feign-micrometer</artifactId>
+            <version>12.5</version>
+        </dependency>
+        <dependency>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-tracing-bridge-otel</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.opentelemetry</groupId>
+            <artifactId>opentelemetry-exporter-logging</artifactId>
+        </dependency>
+    </dependencies>
+</project>
diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/GoogleBooksApi.java
 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/GoogleBooksApi.java
new file mode 100644
index 0000000000..f5e0080cef
--- /dev/null
+++ 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/GoogleBooksApi.java
@@ -0,0 +1,31 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package demo.jaxrs.tracing;
+
+import feign.Headers;
+import feign.Param;
+import feign.RequestLine;
+import feign.Response;
+
+public interface GoogleBooksApi {
+    @RequestLine("GET /books/v1/volumes?q={q}")
+    @Headers("Accept: application/json")
+    Response search(@Param("q") String query);
+}
diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/ObservationRegistrySetup.java
 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/ObservationRegistrySetup.java
new file mode 100644
index 0000000000..a6ba1f39eb
--- /dev/null
+++ 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/ObservationRegistrySetup.java
@@ -0,0 +1,65 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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 demo.jaxrs.tracing;
+
+import java.util.Collections;
+
+import 
io.micrometer.observation.ObservationHandler.FirstMatchingCompositeObservationHandler;
+import io.micrometer.observation.ObservationRegistry;
+import io.micrometer.tracing.handler.DefaultTracingObservationHandler;
+import 
io.micrometer.tracing.handler.PropagatingReceiverTracingObservationHandler;
+import 
io.micrometer.tracing.handler.PropagatingSenderTracingObservationHandler;
+import io.micrometer.tracing.otel.bridge.OtelCurrentTraceContext;
+import io.micrometer.tracing.otel.bridge.OtelPropagator;
+import io.micrometer.tracing.otel.bridge.OtelTracer;
+import io.micrometer.tracing.otel.bridge.Slf4JBaggageEventListener;
+import io.micrometer.tracing.otel.bridge.Slf4JEventListener;
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
+import io.opentelemetry.context.propagation.ContextPropagators;
+import io.opentelemetry.context.propagation.TextMapPropagator;
+
+public class ObservationRegistrySetup {
+    public static ObservationRegistry setup(final OpenTelemetry openTelemetry) 
{
+        final OtelCurrentTraceContext bridgeContext = new 
OtelCurrentTraceContext();
+        final io.opentelemetry.api.trace.Tracer otelTracer = 
openTelemetry.getTracerProvider().get("io.micrometer.micrometer-tracing");
+
+        final OtelPropagator propagator = new 
OtelPropagator(ContextPropagators.create(
+            
TextMapPropagator.composite(W3CTraceContextPropagator.getInstance())), 
otelTracer);
+
+        final Slf4JEventListener slf4JEventListener = new Slf4JEventListener();
+        final Slf4JBaggageEventListener slf4JBaggageEventListener = new 
Slf4JBaggageEventListener(Collections.emptyList());
+
+        final ObservationRegistry observationRegistry = 
ObservationRegistry.create();
+        final OtelTracer tracer = new OtelTracer(otelTracer, bridgeContext, 
event -> {
+            slf4JEventListener.onEvent(event);
+            slf4JBaggageEventListener.onEvent(event);
+        });
+
+        observationRegistry.observationConfig().observationHandler(
+            new FirstMatchingCompositeObservationHandler(
+                new PropagatingSenderTracingObservationHandler<>(tracer, 
propagator),
+                new PropagatingReceiverTracingObservationHandler<>(tracer, 
propagator),
+                new DefaultTracingObservationHandler(tracer)
+            )
+        );
+
+        return observationRegistry;
+    }
+}
diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/OpenTelemetrySetup.java
 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/OpenTelemetrySetup.java
new file mode 100644
index 0000000000..60f9d44692
--- /dev/null
+++ 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/OpenTelemetrySetup.java
@@ -0,0 +1,46 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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 demo.jaxrs.tracing;
+
+import io.opentelemetry.api.common.Attributes;
+import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
+import io.opentelemetry.context.propagation.ContextPropagators;
+import io.opentelemetry.exporter.logging.LoggingSpanExporter;
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.resources.Resource;
+import io.opentelemetry.sdk.trace.SdkTracerProvider;
+import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
+import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
+
+public class OpenTelemetrySetup {
+    public static OpenTelemetrySdk setup(String serviceName) {
+        final Resource resource = Resource.getDefault()
+            
.merge(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, 
serviceName)));
+
+        final SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
+            
.addSpanProcessor(BatchSpanProcessor.builder(LoggingSpanExporter.create()).build())
+            .setResource(resource).build();
+
+        final OpenTelemetrySdk openTelemetrySdk = 
OpenTelemetrySdk.builder().setTracerProvider(sdkTracerProvider)
+            
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
+            .buildAndRegisterGlobal();
+
+        return openTelemetrySdk;
+    }
+}
diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/client/Client.java
 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/client/Client.java
new file mode 100644
index 0000000000..1b51b81867
--- /dev/null
+++ 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/client/Client.java
@@ -0,0 +1,50 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package demo.jaxrs.tracing.client;
+
+import java.util.Arrays;
+
+import demo.jaxrs.tracing.ObservationRegistrySetup;
+import demo.jaxrs.tracing.OpenTelemetrySetup;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import org.apache.cxf.jaxrs.client.WebClient;
+import org.apache.cxf.tracing.micrometer.jaxrs.ObservationClientProvider;
+
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+
+public final class Client {
+    private Client() {
+    }
+
+    public static void main(final String[] args) throws Exception {
+        try (OpenTelemetrySdk openTelemetry = 
OpenTelemetrySetup.setup(Client.class.getName())) {
+            final ObservationClientProvider provider = new 
ObservationClientProvider(
+                ObservationRegistrySetup.setup(openTelemetry));
+
+            final Response response = WebClient
+                .create("http://localhost:9000/catalog";, 
Arrays.asList(provider))
+                .accept(MediaType.APPLICATION_JSON).get();
+
+            System.out.println(response.readEntity(String.class));
+            response.close();
+        }
+    }
+}
diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_opentelemetry/src/main/java/demo/jaxrs/tracing/server/Catalog.java
 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/Catalog.java
similarity index 93%
copy from 
distribution/src/main/release/samples/jax_rs/tracing_opentelemetry/src/main/java/demo/jaxrs/tracing/server/Catalog.java
copy to 
distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/Catalog.java
index 210fea66b4..1293b3fc9c 100644
--- 
a/distribution/src/main/release/samples/jax_rs/tracing_opentelemetry/src/main/java/demo/jaxrs/tracing/server/Catalog.java
+++ 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/Catalog.java
@@ -22,6 +22,7 @@ package demo.jaxrs.tracing.server;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.nio.charset.StandardCharsets;
 import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -50,9 +51,8 @@ import org.apache.cxf.tracing.TracerContext;
 
 import demo.jaxrs.tracing.GoogleBooksApi;
 import feign.Feign;
-import feign.httpclient.ApacheHttpClient;
-import feign.opentracing.TracingClient;
-import io.opentracing.Tracer;
+import feign.micrometer.MicrometerObservationCapability;
+import io.micrometer.observation.ObservationRegistry;
 
 @Path("/catalog")
 public class Catalog {
@@ -145,11 +145,11 @@ public class Catalog {
     public JsonObject search(@QueryParam("q") final String query, @Context 
final TracerContext tracing) throws Exception {
         final GoogleBooksApi api = Feign
             .builder()
-            .client(new TracingClient(new ApacheHttpClient(), 
tracing.unwrap(Tracer.class)))
+            .addCapability(new 
MicrometerObservationCapability(tracing.unwrap(ObservationRegistry.class)))
             .target(GoogleBooksApi.class, "https://www.googleapis.com";);
      
         final feign.Response response = api.search(query);
-        try (final Reader reader = response.body().asReader()) {
+        try (final Reader reader = 
response.body().asReader(StandardCharsets.UTF_8)) {
             return Json.createReader(reader).readObject();
         }
     }
diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/CatalogApplication.java
 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/CatalogApplication.java
new file mode 100644
index 0000000000..0e9536ab4c
--- /dev/null
+++ 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/CatalogApplication.java
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package demo.jaxrs.tracing.server;
+
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+import jakarta.ws.rs.ApplicationPath;
+import jakarta.ws.rs.core.Application;
+
+import org.apache.cxf.jaxrs.provider.jsrjsonp.JsrJsonpProvider;
+import org.apache.cxf.tracing.micrometer.jaxrs.ObservationFeature;
+
+import demo.jaxrs.tracing.ObservationRegistrySetup;
+import io.opentelemetry.api.GlobalOpenTelemetry;
+
+@ApplicationPath("/")
+public class CatalogApplication extends Application {
+    @Override
+    public Set<Object> getSingletons() {
+        return new HashSet<>(
+            Arrays.asList(
+                new Catalog(),
+                new 
ObservationFeature(ObservationRegistrySetup.setup(GlobalOpenTelemetry.get())),
+                new JsrJsonpProvider()
+            )
+        );
+    }
+}
diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/CatalogStore.java
 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/CatalogStore.java
new file mode 100644
index 0000000000..5184012bf5
--- /dev/null
+++ 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/CatalogStore.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 demo.jaxrs.tracing.server;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import jakarta.json.Json;
+import jakarta.json.JsonArray;
+import jakarta.json.JsonArrayBuilder;
+import jakarta.json.JsonObject;
+
+public class CatalogStore {
+    private final Map<String, String> books = new ConcurrentHashMap<>();
+
+    public CatalogStore() {
+    }
+
+    public boolean remove(final String key) throws IOException {
+        return books.remove(key) != null;
+    }
+
+    public JsonObject get(final String key) throws IOException {
+        final String title = books.get(key);
+
+        if (title != null) {
+            return Json.createObjectBuilder()
+                .add("id", key)
+                .add("title", title)
+                .build();
+        }
+
+        return null;
+    }
+
+    public void put(final String key, final String title) throws IOException {
+        books.put(key, title);
+    }
+
+    public JsonArray scan() throws IOException {
+        final JsonArrayBuilder builder = Json.createArrayBuilder();
+
+        for (Map.Entry<String, String> entry: books.entrySet()) {
+            builder.add(Json.createObjectBuilder()
+                .add("id", entry.getKey())
+                .add("title", entry.getValue())
+            );
+        }
+
+        return builder.build();
+    }
+
+}
diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/Server.java
 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/Server.java
new file mode 100644
index 0000000000..126b2ab340
--- /dev/null
+++ 
b/distribution/src/main/release/samples/jax_rs/tracing_micrometer/src/main/java/demo/jaxrs/tracing/server/Server.java
@@ -0,0 +1,55 @@
+/**
+ * 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 demo.jaxrs.tracing.server;
+
+import demo.jaxrs.tracing.OpenTelemetrySetup;
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+import org.apache.cxf.jaxrs.servlet.CXFNonSpringJaxrsServlet;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.servlet.ServletHolder;
+
+public class Server {
+    protected Server() throws Exception {
+        org.eclipse.jetty.server.Server server = new 
org.eclipse.jetty.server.Server(9000);
+
+        // Register and map the dispatcher servlet
+        final ServletHolder servletHolder = new ServletHolder(new 
CXFNonSpringJaxrsServlet());
+        final ServletContextHandler context = new ServletContextHandler();
+        context.setContextPath("/");
+        context.addServlet(servletHolder, "/*");
+
+        servletHolder.setInitParameter("jakarta.ws.rs.Application", 
CatalogApplication.class.getName());
+
+        try (OpenTelemetrySdk ignored = 
OpenTelemetrySetup.setup(CatalogApplication.class.getName())) {
+            server.setHandler(context);
+            server.start();
+            server.join();
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        new Server();
+        System.out.println("Server ready...");
+
+        Thread.sleep(5 * 6000 * 1000);
+        System.out.println("Server exiting");
+        System.exit(0);
+    }
+}
diff --git 
a/distribution/src/main/release/samples/jax_rs/tracing_opentelemetry/src/main/java/demo/jaxrs/tracing/server/Catalog.java
 
b/distribution/src/main/release/samples/jax_rs/tracing_opentelemetry/src/main/java/demo/jaxrs/tracing/server/Catalog.java
index 210fea66b4..75ba4287f8 100644
--- 
a/distribution/src/main/release/samples/jax_rs/tracing_opentelemetry/src/main/java/demo/jaxrs/tracing/server/Catalog.java
+++ 
b/distribution/src/main/release/samples/jax_rs/tracing_opentelemetry/src/main/java/demo/jaxrs/tracing/server/Catalog.java
@@ -22,6 +22,7 @@ package demo.jaxrs.tracing.server;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.nio.charset.StandardCharsets;
 import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -149,7 +150,7 @@ public class Catalog {
             .target(GoogleBooksApi.class, "https://www.googleapis.com";);
      
         final feign.Response response = api.search(query);
-        try (final Reader reader = response.body().asReader()) {
+        try (final Reader reader = 
response.body().asReader(StandardCharsets.UTF_8)) {
             return Json.createReader(reader).readObject();
         }
     }
diff --git a/distribution/src/main/release/samples/pom.xml 
b/distribution/src/main/release/samples/pom.xml
index 4a0964e000..e7dd2406e2 100644
--- a/distribution/src/main/release/samples/pom.xml
+++ b/distribution/src/main/release/samples/pom.xml
@@ -103,6 +103,7 @@
         <module>jax_rs/tracing_opentracing</module>
         <module>jax_rs/tracing_opentelemetry</module>
         <module>jax_rs/tracing_opentelemetry_camel</module>
+        <module>jax_rs/tracing_micrometer</module>
         <module>jax_rs/websocket</module>
         <module>jax_rs/websocket_web</module>
         <module>jax_server_aegis_client</module>
diff --git a/parent/pom.xml b/parent/pom.xml
index ea38361694..fdbc690513 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -1870,6 +1870,11 @@
                 <artifactId>micrometer-tracing-bridge-brave</artifactId>
                 <version>${cxf.micrometer-tracing.version}</version>
             </dependency>
+            <dependency>
+                <groupId>io.micrometer</groupId>
+                <artifactId>micrometer-tracing-bridge-otel</artifactId>
+                <version>${cxf.micrometer-tracing.version}</version>
+            </dependency>
             <dependency>
                 <groupId>io.micrometer</groupId>
                 <artifactId>micrometer-tracing-test</artifactId>

Reply via email to