[−][src]Struct opentelemetry::Context
An execution-scoped collection of values.
A Context
is a propagation mechanism which carries execution-scoped
values across API boundaries and between logically associated execution
units. Cross-cutting concerns access their data in-process using the same
shared context object.
Context
s are immutable, and their write operations result in the creation
of a new context containing the original values and the new specified values.
Context state
Concerns can create and retrieve their local state in the current execution
state represented by a context through the get
and with_value
methods. It is recommended to use application-specific types when storing new
context values to avoid unintentionally overwriting existing state.
Managing the current context
Contexts can be associated with the caller's current execution unit on a
given thread via the attach
method, and previous contexts can be restored
by dropping the returned ContextGuard
. Context can be nested, and will
restore their parent outer context when detached on drop. To access the
values of the context, a snapshot can be created via the Context::current
method.
Examples
use opentelemetry::Context; // Application-specific `a` and `b` values #[derive(Debug, PartialEq)] struct ValueA(&'static str); #[derive(Debug, PartialEq)] struct ValueB(u64); let _outer_guard = Context::new().with_value(ValueA("a")).attach(); // Only value a has been set let current = Context::current(); assert_eq!(current.get::<ValueA>(), Some(&ValueA("a"))); assert_eq!(current.get::<ValueB>(), None); { let _inner_guard = Context::current_with_value(ValueB(42)).attach(); // Both values are set in inner context let current = Context::current(); assert_eq!(current.get::<ValueA>(), Some(&ValueA("a"))); assert_eq!(current.get::<ValueB>(), Some(&ValueB(42))); } // Resets to only the `a` value when inner guard is dropped let current = Context::current(); assert_eq!(current.get::<ValueA>(), Some(&ValueA("a"))); assert_eq!(current.get::<ValueB>(), None);
Implementations
impl Context
[src]
pub fn new() -> Self
[src]
Creates an empty Context
.
The context is initially created with a capacity of 0, so it will not
allocate. Use with_value
to create a new context that has entries.
pub fn current() -> Self
[src]
Returns an immutable snapshot of the current thread's context.
Examples
use opentelemetry::Context; #[derive(Debug, PartialEq)] struct ValueA(&'static str); fn do_work() { assert_eq!(Context::current().get(), Some(&ValueA("a"))); } let _guard = Context::new().with_value(ValueA("a")).attach(); do_work()
pub fn current_with_value<T: 'static + Send + Sync>(value: T) -> Self
[src]
Returns a clone of the current thread's context with the given value.
This is a more efficient form of Context::current().with_value(value)
as it avoids the intermediate context clone.
Examples
use opentelemetry::Context; // Given some value types defined in your application #[derive(Debug, PartialEq)] struct ValueA(&'static str); #[derive(Debug, PartialEq)] struct ValueB(u64); // You can create and attach context with the first value set to "a" let _guard = Context::new().with_value(ValueA("a")).attach(); // And create another context based on the fist with a new value let all_current_and_b = Context::current_with_value(ValueB(42)); // The second context now contains all the current values and the addition assert_eq!(all_current_and_b.get::<ValueA>(), Some(&ValueA("a"))); assert_eq!(all_current_and_b.get::<ValueB>(), Some(&ValueB(42)));
pub fn get<T: 'static>(&self) -> Option<&T>
[src]
Returns a reference to the entry for the corresponding value type.
Examples
use opentelemetry::Context; // Given some value types defined in your application #[derive(Debug, PartialEq)] struct ValueA(&'static str); #[derive(Debug, PartialEq)] struct MyUser(); let cx = Context::new().with_value(ValueA("a")); // Values can be queried by type assert_eq!(cx.get::<ValueA>(), Some(&ValueA("a"))); // And return none if not yet set assert_eq!(cx.get::<MyUser>(), None);
pub fn with_value<T: 'static + Send + Sync>(&self, value: T) -> Self
[src]
Returns a copy of the context with the new value included.
Examples
use opentelemetry::Context; // Given some value types defined in your application #[derive(Debug, PartialEq)] struct ValueA(&'static str); #[derive(Debug, PartialEq)] struct ValueB(u64); // You can create a context with the first value set to "a" let cx_with_a = Context::new().with_value(ValueA("a")); // And create another context based on the fist with a new value let cx_with_a_and_b = cx_with_a.with_value(ValueB(42)); // The first context is still available and unmodified assert_eq!(cx_with_a.get::<ValueA>(), Some(&ValueA("a"))); assert_eq!(cx_with_a.get::<ValueB>(), None); // The second context now contains both values assert_eq!(cx_with_a_and_b.get::<ValueA>(), Some(&ValueA("a"))); assert_eq!(cx_with_a_and_b.get::<ValueB>(), Some(&ValueB(42)));
pub fn attach(self) -> ContextGuard
[src]
Replaces the current context on this thread with this context.
Dropping the returned ContextGuard
will reset the current context to the
previous value.
Examples
use opentelemetry::Context; #[derive(Debug, PartialEq)] struct ValueA(&'static str); let my_cx = Context::new().with_value(ValueA("a")); // Set the current thread context let cx_guard = my_cx.attach(); assert_eq!(Context::current().get::<ValueA>(), Some(&ValueA("a"))); // Drop the guard to restore the previous context drop(cx_guard); assert_eq!(Context::current().get::<ValueA>(), None);
Guards do not need to be explicitly dropped:
use opentelemetry::Context; #[derive(Debug, PartialEq)] struct ValueA(&'static str); fn my_function() -> String { // attach a context the duration of this function. let my_cx = Context::new().with_value(ValueA("a")); // NOTE: a variable name after the underscore is **required** or rust // will drop the guard, restoring the previous context _immediately_. let _guard = my_cx.attach(); // anything happening in functions we call can still access my_cx... my_other_function(); // returning from the function drops the guard, exiting the span. return "Hello world".to_owned(); } fn my_other_function() { // ... }
Sub-scopes may be created to limit the duration for which the span is entered:
use opentelemetry::Context; #[derive(Debug, PartialEq)] struct ValueA(&'static str); let my_cx = Context::new().with_value(ValueA("a")); { let _guard = my_cx.attach(); // the current context can access variables in assert_eq!(Context::current().get::<ValueA>(), Some(&ValueA("a"))); // exiting the scope drops the guard, detaching the context. } // this is back in the default empty context assert_eq!(Context::current().get::<ValueA>(), None);
Trait Implementations
impl BaggageExt for Context
[src]
fn with_baggage<T: IntoIterator<Item = I>, I: Into<KeyValueMetadata>>(
&self,
baggage: T
) -> Self
[src]
&self,
baggage: T
) -> Self
fn current_with_baggage<T: IntoIterator<Item = I>, I: Into<KeyValueMetadata>>(
kvs: T
) -> Self
[src]
kvs: T
) -> Self
fn with_cleared_baggage(&self) -> Self
[src]
fn baggage(&self) -> &Baggage
[src]
impl Clone for Context
[src]
impl Debug for Context
[src]
impl Default for Context
[src]
impl TraceContextExt for Context
[src]
fn current_with_span<T: Span + Send + Sync>(span: T) -> Self
[src]
fn with_span<T: Span + Send + Sync>(&self, span: T) -> Self
[src]
fn span(&self) -> &dyn Span
[src]
fn has_active_span(&self) -> bool
[src]
fn with_remote_span_context(&self, span_context: SpanContext) -> Self
[src]
fn remote_span_context(&self) -> Option<&SpanContext>
[src]
Auto Trait Implementations
impl !RefUnwindSafe for Context
impl Send for Context
impl Sync for Context
impl Unpin for Context
impl !UnwindSafe for Context
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.
pub fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>
[src]
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
[src]
V: MultiLane<T>,