public final class GlobalTracer extends Object implements Tracer
register(Tracer).
The register method should only be called once
during the application initialization phase.
If the register method is never called,
the default NoopTracer is used.
Where possible, use some form of dependency injection (of which there are many) to access the `Tracer` instance. For vanilla application code, this is often reasonable and cleaner for all of the usual DI reasons.
That said, instrumentation for packages that are themselves statically
configured (e.g., JDBC drivers) may be unable to make use of said DI
mechanisms for Tracer access, and as such they should fall back on
GlobalTracer. By and large, OpenTracing instrumentation should
always allow the programmer to specify a Tracer instance to use for
instrumentation, though the GlobalTracer is a reasonable fallback or
default value.
Tracer.SpanBuilder| Modifier and Type | Method and Description |
|---|---|
ActiveSpan |
activeSpan()
Return the
active span. |
Tracer.SpanBuilder |
buildSpan(String operationName)
Return a new SpanBuilder for a Span with the given `operationName`.
|
<C> SpanContext |
extract(Format<C> format,
C carrier)
Extract a SpanContext from a `carrier` of a given type, presumably after propagation across a process boundary.
|
static Tracer |
get()
Returns the constant GlobalTracer.
|
<C> void |
inject(SpanContext spanContext,
Format<C> format,
C carrier)
Inject a SpanContext into a `carrier` of a given type, presumably for propagation across process boundaries.
|
static boolean |
isRegistered()
Identify whether a
Tracer has previously been registered. |
ActiveSpan |
makeActive(Span span)
Wrap and "make active" a
Span by encapsulating it – and any active state (e.g., MDC state) in the
current thread – in a new ActiveSpan. |
static void |
register(Tracer tracer)
Register a
Tracer to back the behaviour of the global tracer. |
String |
toString() |
public static Tracer get()
All methods are forwarded to the currently configured tracer.
Until a tracer is explicitly configured,
the NoopTracer is used.
register(Tracer)public static void register(Tracer tracer)
Tracer to back the behaviour of the global tracer.
Registration is a one-time operation, attempting to call it more often will result in a runtime exception.
Every application intending to use the global tracer is responsible for registering it once during its initialization.
tracer - Tracer to use as global tracer.RuntimeException - if there is already a current tracer registeredpublic static boolean isRegistered()
Tracer has previously been registered.
This check is useful in scenarios where more than one component may be responsible for registering a tracer. For example, when using a Java Agent, it will need to determine if the application has already registered a tracer, and if not attempt to resolve and register one itself.
public Tracer.SpanBuilder buildSpan(String operationName)
TracerYou can override the operationName later via BaseSpan.setOperationName(String).
A contrived example:
Tracer tracer = ...
// Note: if there is a `tracer.activeSpan()`, it will be used as the target of an implicit CHILD_OF
// Reference for "workSpan" when `startActive()` is invoked.
try (ActiveSpan workSpan = tracer.buildSpan("DoWork").startActive()) {
workSpan.setTag("...", "...");
// etc, etc
}
// It's also possible to create Spans manually, bypassing the ActiveSpanSource activation.
Span http = tracer.buildSpan("HandleHTTPRequest")
.asChildOf(rpcSpanContext) // an explicit parent
.withTag("user_agent", req.UserAgent)
.withTag("lucky_number", 42)
.startManual();
public <C> void inject(SpanContext spanContext, Format<C> format, C carrier)
TracerExample:
Tracer tracer = ...
Span clientSpan = ...
TextMap httpHeadersCarrier = new AnHttpHeaderCarrier(httpRequest);
tracer.inject(span.context(), Format.Builtin.HTTP_HEADERS, httpHeadersCarrier);
inject in interface TracerC - the carrier type, which also parametrizes the Format.spanContext - the SpanContext instance to inject into the carrierformat - the Format of the carriercarrier - the carrier for the SpanContext state. All Tracer.inject() implementations must support
io.opentracing.propagation.TextMap and java.nio.ByteBuffer.Format,
Format.Builtinpublic <C> SpanContext extract(Format<C> format, C carrier)
TracerExample:
Tracer tracer = ...
TextMap httpHeadersCarrier = new AnHttpHeaderCarrier(httpRequest);
SpanContext spanCtx = tracer.extract(Format.Builtin.HTTP_HEADERS, httpHeadersCarrier);
... = tracer.buildSpan('...').asChildOf(spanCtx).startActive();
If the span serialized state is invalid (corrupt, wrong version, etc) inside the carrier this will result in an
IllegalArgumentException.extract in interface TracerC - the carrier type, which also parametrizes the Format.format - the Format of the carriercarrier - the carrier for the SpanContext state. All Tracer.extract() implementations must support
io.opentracing.propagation.TextMap and java.nio.ByteBuffer.Format,
Format.Builtinpublic ActiveSpan activeSpan()
ActiveSpanSourceactive span. This does not affect the internal reference count for the
ActiveSpan.
If there is an active span, it becomes an implicit parent of any newly-created
span at Tracer.SpanBuilder.startActive() time (rather than at
Tracer.buildSpan(String) time).
activeSpan in interface ActiveSpanSourceactive span, or null if none could be found.public ActiveSpan makeActive(Span span)
ActiveSpanSourceSpan by encapsulating it – and any active state (e.g., MDC state) in the
current thread – in a new ActiveSpan.makeActive in interface ActiveSpanSourcespan - the Span to wrap in an ActiveSpanActiveSpan that encapsulates the given Span and any other
ActiveSpanSource-specific context (e.g., the MDC context map)Copyright © 2016–2018 OpenTracing. All rights reserved.