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>);
fn set_status(&self, status: Status);
}
Expand description
Utility functions to allow tracing Span
s to accept and return
OpenTelemetry Context
s.
Required Methods§
Sourcefn set_parent(&self, cx: Context)
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);
Sourcefn add_link(&self, cx: SpanContext)
fn add_link(&self, cx: SpanContext)
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);
Sourcefn add_link_with_attributes(&self, cx: SpanContext, attributes: Vec<KeyValue>)
fn add_link_with_attributes(&self, cx: SpanContext, attributes: Vec<KeyValue>)
Associates self
with a given OpenTelemetry trace, using the provided
followed span SpanContext
and attributes.
Sourcefn context(&self) -> Context
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())
Sourcefn set_attribute(&self, key: impl Into<Key>, value: impl Into<Value>)
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");
Sourcefn set_status(&self, status: Status)
fn set_status(&self, status: Status)
Sets an OpenTelemetry status for this span. This is useful for setting the status of a span that was created by a library that does not declare the otel.status_code field of the span in advance.
§Examples
use opentelemetry::trace::Status;
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 Status of the span to `Status::Ok`.
app_root.set_status(Status::Ok);
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.