Versions Compared

Key

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

...

Distributed Tracing with OpenTelemetry and JAX-WS support

Distributed tracing in the Apache CXF is build primarily around JAX-RS 2.x implementation. However, JAX-WS is also supported but it requires to write some boiler-plate code and use OpenTelemetry Java SDK directly (the JAX-WS integration is going to be enhanced in the future). Essentially, from the server-side prospective the in/out interceptors, OpenTelemetryStartInterceptor and OpenTelemetryStopInterceptor respectively, should be configured as part of interceptor chains, either manually or using OpenTelemetryFeature. For example:

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

final OpenTelemetry openTelemetry = OpenTelemetrySdk
    .builder()
    .setTracerProvider(sdkTracerProvider)
    ...
    .buildAndRegisterGlobal(); 
 
final Tracer tracer =  openTelemetry.getTracer("tracer");
final JaxWsServerFactoryBean sf = new JaxWsServerFactoryBean();
...
sf.getFeatures().add(new OpenTelemetryFeature(openTelemetry, tracer));
...
sf.create();

Similarly to the server-side, client-side needs own set of out/in interceptors, OpenTelemetryClientStartInterceptor and OpenTelemetryClientStopInterceptor (or OpenTelemetryClientFeature). Please notice the difference from server-side:  OpenTelemetryClientStartInterceptor becomes out-interceptor while OpenTelemetryClientStopInterceptor becomes in-interceptor. For example:

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

final OpenTelemetry openTelemetry = OpenTelemetrySdk
    .builder()
    .setTracerProvider(sdkTracerProvider)
    ...
    .buildAndRegisterGlobal(); 
 
final Tracer tracer =  openTelemetry.getTracer("tracer");
final JaxWsProxyFactoryBean sf = new JaxWsProxyFactoryBean();
...
sf.getFeatures().add(new OpenTelemetryClientFeature(openTelemetry, tracer));
...
sf.create();

As it was mentioned before, you may use GlobalOpenTelemetry utility class to pass the tracer around so, for example, any JAX-WS service will be able to retrieve the current tracer by invoking GlobalOpenTelemetry.get() method.TBD

Distributed Tracing with OpenTelemetry and OSGi

...