Interface Context


public interface Context
A context propagation mechanism which can carry scoped-values across API boundaries and between threads.

A Context object can be set to the ContextStorage, which effectively forms a scope for the context. The scope is bound to the current thread. Within a scope, its Context is accessible even across API boundaries, through current(). The scope is later exited by Scope.close() closing} the scope.

Context objects are immutable and inherit state from their parent. To add or overwrite the current state a new context object must be created and then attached, replacing the previously bound context. For example:


 Context withCredential = Context.current().with(CRED_KEY, cred);
 withCredential.wrap(new Runnable() {
   public void run() {
      readUserRecords(userId, CRED_KEY.get());
   }
 }).run();
 

Notes and cautions on use:

  • Every makeCurrent() must be followed by a Scope.close(). Breaking these rules may lead to memory leaks and incorrect scoping.
  • While Context objects are immutable they do not place such a restriction on the state they store.
  • Context is not intended for passing optional parameters to an API and developers should take care to avoid excessive dependence on context when designing an API.
  • Attaching Context from a different ancestor will cause information in the current Context to be lost. This should generally be avoided.

Context propagation is not trivial, and when done incorrectly can lead to broken traces or even mixed traces. We provide a debug mechanism for context propagation, which can be enabled by setting -Dio.opentelemetry.context.enableStrictContext=true in your JVM args. This will enable a strict checker that makes sure that Scopes are closed on the correct thread and that they are not garbage collected before being closed. This is done with some relatively expensive stack trace walking. It is highly recommended to enable this in unit tests and staging environments, and you may consider enabling it in production if you have the CPU budget or have very strict requirements on context being propagated correctly (i.e., because you use context in a multi-tenant system). For kotlin coroutine users, this will also detect invalid usage of makeCurrent() from coroutines and suspending functions. This detection relies on internal APIs of kotlin coroutines and may not function across all versions - let us know if you find a version of kotlin coroutines where this mechanism does not function.

See Also:
  • StrictContextStorage
  • Method Details