THIS IS A TEST INSTANCE. ALL YOUR CHANGES WILL BE LOST!!!!
...
Code Block | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
@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 | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
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 | ||||
---|---|---|---|---|
| ||||
@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):
TBD
Example #3: Client and Server trace with annotations
...