...
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 | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
@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 | ||||
---|---|---|---|---|
| ||||
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()
} |