Versions Compared

Key

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

...

Code Block
java
java
final ObservationRegistry observationRegistry = ObservationRegistry.create();

final Tracer tracer = <create tracer using tracing bridge>;
final Propagator propagator = <create propagator using tracing bridge;
  
observationRegistry.observationConfig().observationHandler(
    new FirstMatchingCompositeObservationHandler(
        new PropagatingSenderTracingObservationHandler<>(tracer, propagator),
        new PropagatingReceiverTracingObservationHandler<>(tracer, propagator),
        new DefaultTracingObservationHandler(tracer)
     )
);
                   
Response response = WebClient
    .create("http://localhost:9000/catalog", Arrays.asList(new ObservationClientProvider(observationRegistry))
    .accept(MediaType.APPLICATION_JSON)
    .get();

...

Code Block
java
java
@ApplicationPath("/")
public class CatalogApplication extends Application {
    @Override
    public Set<Object> getSingletons() {
        final ObservationRegistry observationRegistry = ObservationRegistry.create();

        final Tracer tracer = <create tracer using tracing bridge>;
        final Propagator propagator = <create propagator using tracing bridge;
  
        observationRegistry.observationConfig().observationHandler(
            new FirstMatchingCompositeObservationHandler( 
                new PropagatingSenderTracingObservationHandler<>(tracer, propagator),
                new PropagatingReceiverTracingObservationHandler<>(tracer, propagator),
                new DefaultTracingObservationHandler(tracer)
             )
        );
 
        return new HashSet<>(
                Arrays.asList(
                    new ObservationFeature(observationRegistry)
                )
            );
    }
}

...

Code Block
java
java
final ObservationRegistry observationRegistry = ObservationRegistry.create();

final Tracer tracer = <create tracer using tracing bridge>;
final Propagator propagator = <create propagator using tracing bridge;
  
observationRegistry.observationConfig().observationHandler(
    new FirstMatchingCompositeObservationHandler(
        new PropagatingSenderTracingObservationHandler<>(tracer, propagator),
        new PropagatingReceiverTracingObservationHandler<>(tracer, propagator),
        new DefaultTracingObservationHandler(tracer)
     )
);

final JAXRSServerFactoryBean factory = RuntimeDelegate.getInstance().createEndpoint(/* application instance */, JAXRSServerFactoryBean.class);
factory.setProvider(new ObservationFeature(observationRegistry));
...
return factory.create();

...

Code Block
java
java
final Resource resource = Resource.getDefault().merge(
    Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, "...")));

final SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
    .addSpanProcessor(BatchSpanProcessor.builder(OtlpGrpcSpanExporter.builder().build()).build())
    .setSampler(Sampler.alwaysOn())
    .setResource(resource)
    .build();

final OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
    .setTracerProvider(sdkTracerProvider)
    .setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
    .buildAndRegisterGlobal();

final OtelCurrentTraceContext bridgeContext = new OtelCurrentTraceContext();
final io.opentelemetry.api.trace.Tracer otelTracer = openTelemetrySdk.getTracer("...");

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)         
        )
    );

Example #1: Client and Server with default distributed tracing configured

...

Example #2: Client and Server with nested trace

In this example server-side implementation of the JAX-RS service is going to call an external system (simulated as a simple delay of 500ms) within its own span. The client-side code stays unchanged.

Code Block
java
java
@Produces( { MediaType.APPLICATION_JSON } )
@GET
public Collection<Book> getBooks(@Context final TracerContext tracer) throws Exception {
    try(final ObservationScope scope = tracer.startSpan("Calling External System")) {
        // Simulating a delay of 500ms required to call external system
        Thread.sleep(500);
              
        return Arrays.asList(
            new Book("Apache CXF Web Service Development", "Naveen Balani, Rajeev Hathi")
        );
    }
}

The actual invocation of the request by the client (with service name tracer-client) and consequent invocation of the service on the server side (service name tracer-server) is going to generate the following sample traces (taken from Jaeger UI):

Image AddedTBD

Example #3: Client and Server trace with annotations

...