Class ThreadLocalCurrentTraceContext

  • Direct Known Subclasses:
    CurrentTraceContext.Default

    public class ThreadLocalCurrentTraceContext
    extends CurrentTraceContext
    In-process trace context propagation backed by a static thread local.

    Design notes

    A static thread local ensures we have one context per thread, as opposed to one per thread- tracer. This means all tracer instances will be able to see any tracer's contexts.

    The trade-off of this (instance-based reference) vs the reverse: trace contexts are not separated by tracer by default. For example, to make a trace invisible to another tracer, you have to use a non-default implementation.

    Sometimes people make different instances of the tracer just to change configuration like the local service name. If we used a thread-instance approach, none of these would be able to see eachother's scopes. This would break Tracing.currentTracer() scope visibility in a way few would want to debug. It might be phrased as "MySQL always starts a new trace and I don't know why."

    If you want a different behavior, use a different subtype of CurrentTraceContext, possibly your own, or raise an issue and explain what your use case is.

    • Method Detail

      • clear

        public void clear()
        This component is backed by a possibly static shared thread local. Call this to clear the reference when you are sure any residual state is due to a leak. This is generally only useful in tests.
        Since:
        5.11
      • newScope

        public CurrentTraceContext.Scope newScope​(@Nullable
                                                  TraceContext currentSpan)
        Description copied from class: CurrentTraceContext
        Sets the current span in scope until the returned object is closed. It is a programming error to drop or never close the result. Using try-with-resources is preferred for this reason.
        Specified by:
        newScope in class CurrentTraceContext
        Parameters:
        currentSpan - span to place into scope or null to clear the scope