Skip to content

Commit 3ea4355

Browse files
committed
refactor(log): extract telemetry()
1 parent 0208b6d commit 3ea4355

File tree

2 files changed

+65
-29
lines changed

2 files changed

+65
-29
lines changed

src/bin/rustup-init.rs

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -60,34 +60,17 @@ async fn maybe_trace_rustup() -> Result<utils::ExitCode> {
6060
}
6161
#[cfg(feature = "otel")]
6262
{
63-
use std::time::Duration;
64-
65-
use opentelemetry::{global, KeyValue};
66-
use opentelemetry_otlp::WithExportConfig;
67-
use opentelemetry_sdk::{
68-
propagation::TraceContextPropagator,
69-
trace::{self, Sampler},
70-
Resource,
63+
use tracing_subscriber::{layer::SubscriberExt, Registry};
64+
65+
let telemetry = {
66+
use opentelemetry::global;
67+
use opentelemetry_sdk::propagation::TraceContextPropagator;
68+
69+
global::set_text_map_propagator(TraceContextPropagator::new());
70+
rustup::cli::log::telemetry()
7171
};
72-
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Registry};
73-
74-
global::set_text_map_propagator(TraceContextPropagator::new());
75-
let tracer = opentelemetry_otlp::new_pipeline()
76-
.tracing()
77-
.with_exporter(
78-
opentelemetry_otlp::new_exporter()
79-
.tonic()
80-
.with_timeout(Duration::from_secs(3)),
81-
)
82-
.with_trace_config(
83-
trace::config()
84-
.with_sampler(Sampler::AlwaysOn)
85-
.with_resource(Resource::new(vec![KeyValue::new("service.name", "rustup")])),
86-
)
87-
.install_batch(opentelemetry_sdk::runtime::Tokio)?;
88-
let env_filter = EnvFilter::try_from_default_env().unwrap_or(EnvFilter::new("INFO"));
89-
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
90-
let subscriber = Registry::default().with(env_filter).with(telemetry);
72+
73+
let subscriber = Registry::default().with(telemetry);
9174
tracing::subscriber::set_global_default(subscriber)?;
9275
let result = run_rustup().await;
9376
// We're tracing, so block until all spans are exported.

src/cli/log.rs

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1-
use std::fmt;
2-
use std::io::Write;
1+
use std::{fmt, io::Write};
2+
3+
#[cfg(feature = "otel")]
4+
use once_cell::sync::Lazy;
5+
#[cfg(feature = "otel")]
6+
use opentelemetry_sdk::trace::Tracer;
7+
#[cfg(feature = "otel")]
8+
use tracing::Subscriber;
9+
#[cfg(feature = "otel")]
10+
use tracing_subscriber::{registry::LookupSpan, EnvFilter, Layer};
311

412
use crate::currentprocess::{process, terminalsource};
513

@@ -71,3 +79,48 @@ pub(crate) fn debug_fmt(args: fmt::Arguments<'_>) {
7179
let _ = writeln!(t.lock());
7280
}
7381
}
82+
83+
/// A [`tracing::Subscriber`] [`Layer`][`tracing_subscriber::Layer`] that corresponds to Rustup's
84+
/// optional `opentelemetry` (a.k.a. `otel`) feature.
85+
#[cfg(feature = "otel")]
86+
pub fn telemetry<S>() -> impl Layer<S>
87+
where
88+
S: Subscriber + for<'span> LookupSpan<'span>,
89+
{
90+
// NOTE: This reads from the real environment variables instead of `process().var_os()`.
91+
let env_filter = EnvFilter::try_from_default_env().unwrap_or(EnvFilter::new("INFO"));
92+
tracing_opentelemetry::layer()
93+
.with_tracer(TELEMETRY_DEFAULT_TRACER.clone())
94+
.with_filter(env_filter)
95+
}
96+
97+
/// The default `opentelemetry` tracer used across Rustup.
98+
///
99+
/// # Note
100+
/// The initializer function will panic if not called within the context of a [`tokio`] runtime.
101+
#[cfg(feature = "otel")]
102+
static TELEMETRY_DEFAULT_TRACER: Lazy<Tracer> = Lazy::new(|| {
103+
use std::time::Duration;
104+
105+
use opentelemetry::KeyValue;
106+
use opentelemetry_otlp::WithExportConfig;
107+
use opentelemetry_sdk::{
108+
trace::{self, Sampler},
109+
Resource,
110+
};
111+
112+
opentelemetry_otlp::new_pipeline()
113+
.tracing()
114+
.with_exporter(
115+
opentelemetry_otlp::new_exporter()
116+
.tonic()
117+
.with_timeout(Duration::from_secs(3)),
118+
)
119+
.with_trace_config(
120+
trace::config()
121+
.with_sampler(Sampler::AlwaysOn)
122+
.with_resource(Resource::new(vec![KeyValue::new("service.name", "rustup")])),
123+
)
124+
.install_batch(opentelemetry_sdk::runtime::Tokio)
125+
.expect("error installing `OtlpTracePipeline` in the current `tokio` runtime")
126+
});

0 commit comments

Comments
 (0)