Skip to content

Commit 0b3e73b

Browse files
committed
fixup! refactor(log): reimplement log using tracing
1 parent 2b5d4dd commit 0b3e73b

File tree

2 files changed

+85
-60
lines changed

2 files changed

+85
-60
lines changed

src/bin/rustup-init.rs

+5-54
Original file line numberDiff line numberDiff line change
@@ -55,63 +55,14 @@ fn main() {
5555
}
5656

5757
async fn maybe_trace_rustup() -> Result<utils::ExitCode> {
58-
use tracing_subscriber::{
59-
filter::LevelFilter, layer::SubscriberExt, EnvFilter, Layer, Registry,
60-
};
61-
62-
let curr_process = process();
63-
let has_ansi = curr_process.stderr().is_a_tty();
64-
let maybe_rust_log_directives = curr_process.var_os("RUST_LOG").clone();
58+
use tracing_subscriber::{layer::SubscriberExt, Registry};
6559

6660
#[cfg(feature = "otel")]
67-
let telemetry = {
68-
use std::time::Duration;
69-
70-
use opentelemetry::{global, KeyValue};
71-
use opentelemetry_otlp::WithExportConfig;
72-
use opentelemetry_sdk::{
73-
propagation::TraceContextPropagator,
74-
trace::{self, Sampler},
75-
Resource,
76-
};
77-
78-
global::set_text_map_propagator(TraceContextPropagator::new());
79-
80-
let tracer = opentelemetry_otlp::new_pipeline()
81-
.tracing()
82-
.with_exporter(
83-
opentelemetry_otlp::new_exporter()
84-
.tonic()
85-
.with_timeout(Duration::from_secs(3)),
86-
)
87-
.with_trace_config(
88-
trace::config()
89-
.with_sampler(Sampler::AlwaysOn)
90-
.with_resource(Resource::new(vec![KeyValue::new("service.name", "rustup")])),
91-
)
92-
.install_batch(opentelemetry_sdk::runtime::Tokio)?;
93-
let env_filter = EnvFilter::try_from_default_env().unwrap_or(EnvFilter::new("INFO"));
94-
tracing_opentelemetry::layer()
95-
.with_tracer(tracer)
96-
.with_filter(env_filter)
97-
};
61+
let telemetry = rustup::cli::log::telemetry()?;
9862
let console_logger = {
99-
let logger = tracing_subscriber::fmt::layer()
100-
.with_writer(move || curr_process.stderr())
101-
.with_ansi(has_ansi);
102-
if let Some(directives) = maybe_rust_log_directives {
103-
let env_filter = EnvFilter::builder()
104-
.with_default_directive(LevelFilter::INFO.into())
105-
.parse_lossy(directives.to_string_lossy());
106-
logger.compact().with_filter(env_filter).boxed()
107-
} else {
108-
// Receive log lines from Rustup only.
109-
let env_filter = EnvFilter::new("rustup=DEBUG");
110-
logger
111-
.event_format(rustup::cli::log::EventFormatter)
112-
.with_filter(env_filter)
113-
.boxed()
114-
}
63+
let curr_process = process();
64+
let has_ansi = curr_process.stderr().is_a_tty();
65+
rustup::cli::log::console_logger(curr_process, has_ansi)
11566
};
11667
let subscriber = {
11768
#[cfg(feature = "otel")]

src/cli/log.rs

+80-6
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
use std::{fmt, io::Write};
22

33
use termcolor::{Color, ColorSpec, WriteColor};
4-
use tracing::{Event, Subscriber};
5-
use tracing_subscriber::fmt::{
6-
format::{self, FormatEvent, FormatFields},
7-
FmtContext,
4+
use tracing::{level_filters::LevelFilter, Event, Subscriber};
5+
use tracing_subscriber::{
6+
fmt::{
7+
format::{self, FormatEvent, FormatFields},
8+
FmtContext,
9+
},
10+
registry::LookupSpan,
11+
EnvFilter, Layer,
812
};
9-
use tracing_subscriber::registry::LookupSpan;
1013

11-
use crate::utils::notify::NotificationLevel;
14+
use crate::{
15+
currentprocess::{filesource::StderrSource as _, varsource::VarSource as _, Process},
16+
utils::notify::NotificationLevel,
17+
};
1218

1319
macro_rules! debug {
1420
( $ ( $ arg : tt ) * ) => ( ::tracing::trace ! ( $ ( $ arg ) * ) )
@@ -30,6 +36,74 @@ macro_rules! err {
3036
( $ ( $ arg : tt ) * ) => ( ::tracing::error ! ( $ ( $ arg ) * ) )
3137
}
3238

39+
/// A [`tracing::Subscriber`] [`Layer`][`tracing_subscriber::Layer`] that prints out the log
40+
/// lines to the current [`Process`]' `stderr`.
41+
///
42+
/// When the `RUST_LOG` environment variable is present, a standard [`tracing_subscriber`]
43+
/// formatter will be used according to the filtering directives set in its value.
44+
/// Otherwise, this logger will use [`EventFormatter`] to mimic "classic" Rustup `stderr` output.
45+
pub fn console_logger<S>(process: Process, with_ansi: bool) -> impl Layer<S>
46+
where
47+
S: Subscriber + for<'span> LookupSpan<'span>,
48+
{
49+
let maybe_rust_log_directives = process.var_os("RUST_LOG").clone();
50+
let logger = tracing_subscriber::fmt::layer()
51+
.with_writer(move || process.stderr())
52+
.with_ansi(with_ansi);
53+
if let Some(directives) = maybe_rust_log_directives {
54+
let env_filter = EnvFilter::builder()
55+
.with_default_directive(LevelFilter::INFO.into())
56+
.parse_lossy(directives.to_string_lossy());
57+
logger.compact().with_filter(env_filter).boxed()
58+
} else {
59+
// Receive log lines from Rustup only.
60+
let env_filter = EnvFilter::new("rustup=DEBUG");
61+
logger
62+
.event_format(EventFormatter)
63+
.with_filter(env_filter)
64+
.boxed()
65+
}
66+
}
67+
68+
/// A [`tracing::Subscriber`] [`Layer`][`tracing_subscriber::Layer`] that corresponds to Rustup's
69+
/// optional `opentelemetry` (a.k.a. `otel`) feature.
70+
#[cfg(feature = "otel")]
71+
pub fn telemetry<S>() -> anyhow::Result<impl Layer<S>>
72+
where
73+
S: Subscriber + for<'span> LookupSpan<'span>,
74+
{
75+
use std::time::Duration;
76+
77+
use opentelemetry::{global, KeyValue};
78+
use opentelemetry_otlp::WithExportConfig;
79+
use opentelemetry_sdk::{
80+
propagation::TraceContextPropagator,
81+
trace::{self, Sampler},
82+
Resource,
83+
};
84+
85+
global::set_text_map_propagator(TraceContextPropagator::new());
86+
87+
let tracer = opentelemetry_otlp::new_pipeline()
88+
.tracing()
89+
.with_exporter(
90+
opentelemetry_otlp::new_exporter()
91+
.tonic()
92+
.with_timeout(Duration::from_secs(3)),
93+
)
94+
.with_trace_config(
95+
trace::config()
96+
.with_sampler(Sampler::AlwaysOn)
97+
.with_resource(Resource::new(vec![KeyValue::new("service.name", "rustup")])),
98+
)
99+
.install_batch(opentelemetry_sdk::runtime::Tokio)?;
100+
// NOTE: This reads from the real environment variables instead of `process().var_os()`.
101+
let env_filter = EnvFilter::try_from_default_env().unwrap_or(EnvFilter::new("INFO"));
102+
Ok(tracing_opentelemetry::layer()
103+
.with_tracer(tracer)
104+
.with_filter(env_filter))
105+
}
106+
33107
// Adapted from
34108
// https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/trait.FormatEvent.html#examples
35109
pub struct EventFormatter;

0 commit comments

Comments
 (0)