Skip to content

Commit 13a2ad1

Browse files
authored
chore: migrate examples from the main tracing rep (#13)
As part of moving tracing-opentelemetry over, I'm moving the tracing-opentelemetry examples over from `tokio-rs/tracing` to here.
1 parent cf4a651 commit 13a2ad1

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ thiserror = { version = "1.0.31", optional = true }
4040
async-trait = "0.1.56"
4141
criterion = { version = "0.3.6", default-features = false }
4242
opentelemetry-jaeger = "0.16.0"
43+
tracing = { version = "0.1.35", default-features = false, features = ["std", "attributes"] }
44+
tracing-subscriber = { version = "0.3.0", default-features = false, features = ["registry", "std"] }
4345
futures-util = { version = "0.3", default-features = false }
4446
tokio = { version = "1", features = ["full"] }
4547
tokio-stream = "0.1"
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
use opentelemetry::sdk::propagation::TraceContextPropagator;
2+
use opentelemetry::{global, Context};
3+
use std::collections::HashMap;
4+
use tracing::span;
5+
use tracing_opentelemetry::OpenTelemetrySpanExt;
6+
use tracing_subscriber::layer::SubscriberExt;
7+
use tracing_subscriber::Registry;
8+
9+
fn make_request(_cx: Context) {
10+
// perform external request after injecting context
11+
// e.g. if there are request headers that impl `opentelemetry::propagation::Injector`
12+
// then `propagator.inject_context(cx, request.headers_mut())`
13+
}
14+
15+
fn build_example_carrier() -> HashMap<String, String> {
16+
let mut carrier = HashMap::new();
17+
carrier.insert(
18+
"traceparent".to_string(),
19+
"00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01".to_string(),
20+
);
21+
22+
carrier
23+
}
24+
25+
fn main() {
26+
// Set a format for propagating context. This MUST be provided, as the default is a no-op.
27+
global::set_text_map_propagator(TraceContextPropagator::new());
28+
let subscriber = Registry::default().with(tracing_opentelemetry::layer());
29+
30+
tracing::subscriber::with_default(subscriber, || {
31+
// Extract context from request headers
32+
let parent_context = global::get_text_map_propagator(|propagator| {
33+
propagator.extract(&build_example_carrier())
34+
});
35+
36+
// Generate tracing span as usual
37+
let app_root = span!(tracing::Level::INFO, "app_start");
38+
39+
// Assign parent trace from external context
40+
app_root.set_parent(parent_context);
41+
42+
// To include tracing context in client requests from _this_ app,
43+
// use `context` to extract the current OpenTelemetry context.
44+
make_request(app_root.context());
45+
});
46+
}

examples/opentelemetry.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
use opentelemetry::global;
2+
use std::{error::Error, thread, time::Duration};
3+
use tracing::{instrument, span, trace, warn};
4+
use tracing_subscriber::prelude::*;
5+
6+
#[instrument]
7+
#[inline]
8+
fn expensive_work() -> &'static str {
9+
span!(tracing::Level::INFO, "expensive_step_1")
10+
.in_scope(|| thread::sleep(Duration::from_millis(25)));
11+
span!(tracing::Level::INFO, "expensive_step_2")
12+
.in_scope(|| thread::sleep(Duration::from_millis(25)));
13+
14+
"success"
15+
}
16+
17+
fn main() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
18+
// Install an otel pipeline with a simple span processor that exports data one at a time when
19+
// spans end. See the `install_batch` option on each exporter's pipeline builder to see how to
20+
// export in batches.
21+
let tracer = opentelemetry_jaeger::new_pipeline()
22+
.with_service_name("report_example")
23+
.install_simple()?;
24+
let opentelemetry = tracing_opentelemetry::layer().with_tracer(tracer);
25+
tracing_subscriber::registry()
26+
.with(opentelemetry)
27+
.try_init()?;
28+
29+
{
30+
let root = span!(tracing::Level::INFO, "app_start", work_units = 2);
31+
let _enter = root.enter();
32+
33+
let work_result = expensive_work();
34+
35+
span!(tracing::Level::INFO, "faster_work")
36+
.in_scope(|| thread::sleep(Duration::from_millis(10)));
37+
38+
warn!("About to exit!");
39+
trace!("status: {}", work_result);
40+
} // Once this scope is closed, all spans inside are closed as well
41+
42+
// Shut down the current tracer provider. This will invoke the shutdown
43+
// method on all span processors. span processors should export remaining
44+
// spans before return.
45+
global::shutdown_tracer_provider();
46+
47+
Ok(())
48+
}

0 commit comments

Comments
 (0)