mirror of
https://github.com/tokio-rs/tracing.git
synced 2025-09-30 06:20:38 +00:00

opentelemetry: Add dynamic span name field ## Motivation The OpenTelemetry [spec for HTTP server request](https://github.com/open-telemetry/opentelemetry-specification/blob/master/specification/trace/semantic_conventions/http.md#http-server-semantic-conventions) span names states that: > Given an inbound request for a route (e.g. "/users/:userID?") the name > attribute of the span SHOULD be set to this route. If the route does not > include the application root, it SHOULD be prepended to the span name. However, `tracing` span names must be `'static`, so it is currently not always possible to add this dynamic information. ## Solution This patch adds support for setting OpenTelemetry span names by specifying a field named `otel.name` for a given span. Resolves #720
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.