pub trait OpenTelemetrySpanExt {
    // Required methods
    fn set_parent(&self, cx: Context);
    fn add_link(&self, cx: SpanContext);
    fn add_link_with_attributes(
        &self,
        cx: SpanContext,
        attributes: Vec<KeyValue>
    );
    fn context(&self) -> Context;
    fn set_attribute(&self, key: impl Into<Key>, value: impl Into<Value>);
}
Expand description

Utility functions to allow tracing Spans to accept and return OpenTelemetry Contexts.

Required Methods§

source

fn set_parent(&self, cx: Context)

Associates self with a given OpenTelemetry trace, using the provided parent Context.

Examples
use opentelemetry::{propagation::TextMapPropagator, trace::TraceContextExt};
use opentelemetry_sdk::propagation::TraceContextPropagator;
use tracing_opentelemetry::OpenTelemetrySpanExt;
use std::collections::HashMap;
use tracing::Span;

// Example carrier, could be a framework header map that impls otel's `Extractor`.
let mut carrier = HashMap::new();

// Propagator can be swapped with b3 propagator, jaeger propagator, etc.
let propagator = TraceContextPropagator::new();

// Extract otel parent context via the chosen propagator
let parent_context = propagator.extract(&carrier);

// Generate a tracing span as usual
let app_root = tracing::span!(tracing::Level::INFO, "app_start");

// Assign parent trace from external context
app_root.set_parent(parent_context.clone());

// Or if the current span has been created elsewhere:
Span::current().set_parent(parent_context);

Associates self with a given OpenTelemetry trace, using the provided followed span SpanContext.

Examples
use opentelemetry::{propagation::TextMapPropagator, trace::TraceContextExt};
use opentelemetry_sdk::propagation::TraceContextPropagator;
use tracing_opentelemetry::OpenTelemetrySpanExt;
use std::collections::HashMap;
use tracing::Span;

// Example carrier, could be a framework header map that impls otel's `Extractor`.
let mut carrier = HashMap::new();

// Propagator can be swapped with b3 propagator, jaeger propagator, etc.
let propagator = TraceContextPropagator::new();

// Extract otel context of linked span via the chosen propagator
let linked_span_otel_context = propagator.extract(&carrier);

// Extract the linked span context from the otel context
let linked_span_context = linked_span_otel_context.span().span_context().clone();

// Generate a tracing span as usual
let app_root = tracing::span!(tracing::Level::INFO, "app_start");

// Assign linked trace from external context
app_root.add_link(linked_span_context);

// Or if the current span has been created elsewhere:
let linked_span_context = linked_span_otel_context.span().span_context().clone();
Span::current().add_link(linked_span_context);

Associates self with a given OpenTelemetry trace, using the provided followed span SpanContext and attributes.

source

fn context(&self) -> Context

Extracts an OpenTelemetry Context from self.

Examples
use opentelemetry::Context;
use tracing_opentelemetry::OpenTelemetrySpanExt;
use tracing::Span;

fn make_request(cx: Context) {
    // perform external request after injecting context
    // e.g. if the request's headers impl `opentelemetry::propagation::Injector`
    // then `propagator.inject_context(cx, request.headers_mut())`
}

// Generate a tracing span as usual
let app_root = tracing::span!(tracing::Level::INFO, "app_start");

// To include tracing context in client requests from _this_ app,
// extract the current OpenTelemetry context.
make_request(app_root.context());

// Or if the current span has been created elsewhere:
make_request(Span::current().context())
source

fn set_attribute(&self, key: impl Into<Key>, value: impl Into<Value>)

Sets an OpenTelemetry attribute directly for this span, bypassing tracing. If fields set here conflict with tracing fields, the tracing fields will supersede fields set with set_attribute. This allows for more than 32 fields.

Examples
use opentelemetry::Context;
use tracing_opentelemetry::OpenTelemetrySpanExt;
use tracing::Span;

// Generate a tracing span as usual
let app_root = tracing::span!(tracing::Level::INFO, "app_start");

// Set the `http.request.header.x_forwarded_for` attribute to `example`.
app_root.set_attribute("http.request.header.x_forwarded_for", "example");

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl OpenTelemetrySpanExt for Span

source§

fn set_parent(&self, cx: Context)

source§

fn context(&self) -> Context

source§

fn set_attribute(&self, key: impl Into<Key>, value: impl Into<Value>)

Implementors§