Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Spring XML-Configuration

TBD

Using non-JAX-RS clients

...

Accessing OpenTelemetry APIs

The Apache CXF  abstracts as much of the tracer-specific APIs behind TracerContext as possible. However, sometimes there is a need to get access to OpenTelemetry APIs in order to leverages the rich set of available instrumentations. To make it possible, TracerContext has a dedicated unwrap method which returns underlying Tracer instance. The snippet below shows off how to use this API and use OpenTelemetry instrumentation for OpenFeign client through OpenTracing shim (as of today, OpenFeign client does not provide native support for OpenTelemetry).

Code Block
java
java
final SdkTracerProvider sdkTracerProvider = SdkTracerProvider
    .builder()
    ...
    .build();

final OpenTelemetry openTelemetry = OpenTelemetrySdk
    .builder()
    .setTracerProvider(sdkTracerProvider)
    ...
    .buildAndRegisterGlobal();

// Use OpenTelemetru OpenTracing shim for Feign OpenTracing integration
GlobalTracer.registerIfAbsent(OpenTracingShim.createTracerShim(openTelemetry));


Code Block
java
java
@GET
@Path("/search")
@Produces(MediaType.APPLICATION_JSON)
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)))
        .target(GoogleBooksApi.class, "https://www.googleapis.com");
 
    final Response response = api.search(query);
    try (final Reader reader = response.body().asReader()) {
        return Json.createReader(reader).readObject();
    }
}

The usage of tracer-specific APIs is not generally advisable (because of portability reasons) but in case there are no other options available, it is available.

Using non-JAX-RS clients

The  Apache CXF  uses native OpenTelemetry capabilities so the existing instrumentations for different HTTP clients work as expected. The usage of only JAX-RS client is not required. For example, the following snippet demonstrates the usage of traceble OkHttp client  to call JAX-RS resources, backed by Apache CXF .

Code Block
java
java
final SdkTracerProvider sdkTracerProvider = SdkTracerProvider
    .builder()
    ...
    .build();

final OpenTelemetry openTelemetry = OpenTelemetrySdk
    .builder()
    .setTracerProvider(sdkTracerProvider)
    ...
    .buildAndRegisterGlobal();

final OkHttpClient client = OkHttpClient.Builder().build();
final Call.Factory factory =  OkHttpTelemetry.builder(openTelemetry).build().newCallFactory(client));

final Request request = new Request.Builder()
    .url("http://localhost:9000/catalog")
    .header("Accept", "application/json")
    .build();
 
try (final Response response = factory.newCall(request).execute()) {
    // Do something with response.body()
}