mirror of
https://github.com/tokio-rs/tracing.git
synced 2025-10-02 15:24:47 +00:00

The [OpenTelemetry Propagation Spec](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/context/api-propagators.md) has been changed from operating primarily on `SpanContext`s to a more generic `Context` struct which is a propagation mechanism that carries execution-scoped values across API boundaries and between logically associated execution units. The following APIs are updated to facilitate this change: * OpenTelemetrySpanExt's `set_parent` now accepts a reference to an extracted parent context. * OpenTelemetrySpanExt's `context` now returns a context. Additionally the need to sample spans before their context can be injected into `Carrier`s necessitates that a `Sampler` is stored in the `OpenTelemetryLayer`. Accordingly: * `OpenTelemetryLayer::with_tracer(tracer)` has been removed in favor of `tracing_opentelemetry::layer().with_tracer(tracer).with_sampler(sampler)` Co-authored-by: Eliza Weisman <eliza@buoyant.io>
Tracing OpenTelemetry
Utilities for adding OpenTelemetry interoperability to tracing
.
Overview
tracing
is a framework for instrumenting Rust programs to collect
structured, event-based diagnostic information. This crate provides a layer
that connects spans from multiple systems into a trace and emits them to
OpenTelemetry-compatible distributed tracing systems for processing and
visualization.
The crate provides the following types:
OpenTelemetryLayer
adds OpenTelemetry context to alltracing
spans.OpenTelemetrySpanExt
allows OpenTelemetry parent trace information to be injected and extracted from atracing
span.
Examples
Basic Usage
use opentelemetry::{api::Provider, sdk};
use tracing::{error, span};
use tracing_subscriber::layer::SubscriberExt;
use tracing_subscriber::Registry;
fn main() {
// Create a new tracer
let tracer = sdk::Provider::default().get_tracer("component_name");
// Create a new OpenTelemetry tracing layer
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
let subscriber = Registry::default().with(telemetry);
// Trace executed code
tracing::subscriber::with_default(subscriber, || {
let root = span!(tracing::Level::TRACE, "app_start", work_units = 2);
let _enter = root.enter();
error!("This event will be logged in the root span.");
});
}
Visualization example
# Run a supported collector like jaeger in the background
$ docker run -d -p6831:6831/udp -p6832:6832/udp -p16686:16686 jaegertracing/all-in-one:latest
# Run example to produce spans (from parent examples directory)
$ cargo run --example opentelemetry
# View spans (see the image below)
$ firefox http://localhost:16686/
License
This project is licensed under the MIT license.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in Tracing by you, shall be licensed as MIT, without any additional terms or conditions.