Rework telemetry to replace the use of tracing with an object we pass around (#8143)

polkadot companion: paritytech/polkadot#2535
This commit is contained in:
Cecile Tonglet
2021-03-11 11:05:45 +01:00
committed by GitHub
parent 7aaba0c154
commit 8031b6eacb
55 changed files with 1028 additions and 838 deletions
+1 -35
View File
@@ -24,7 +24,7 @@
//!
//! See `sp-tracing` for examples on how to use tracing.
//!
//! Currently we provide `Log` (default), `Telemetry` variants for `Receiver`
//! Currently we only provide `Log` (default).
#![warn(missing_docs)]
@@ -46,7 +46,6 @@ use tracing_subscriber::{
CurrentSpan,
layer::{Layer, Context},
};
use sc_telemetry::{telemetry, SUBSTRATE_INFO};
use sp_tracing::{WASM_NAME_KEY, WASM_TARGET_KEY, WASM_TRACE_IDENTIFIER};
#[doc(hidden)]
@@ -67,8 +66,6 @@ pub struct ProfilingLayer {
pub enum TracingReceiver {
/// Output to logger
Log,
/// Output to telemetry
Telemetry,
}
impl Default for TracingReceiver {
@@ -214,10 +211,6 @@ impl ProfilingLayer {
pub fn new(receiver: TracingReceiver, targets: &str) -> Self {
match receiver {
TracingReceiver::Log => Self::new_with_handler(Box::new(LogTraceHandler), targets),
TracingReceiver::Telemetry => Self::new_with_handler(
Box::new(TelemetryTraceHandler),
targets,
),
}
}
@@ -392,33 +385,6 @@ impl TraceHandler for LogTraceHandler {
}
}
/// TraceHandler for sending span data to telemetry,
/// Please see telemetry documentation for details on how to specify endpoints and
/// set the required telemetry level to activate tracing messages
pub struct TelemetryTraceHandler;
impl TraceHandler for TelemetryTraceHandler {
fn handle_span(&self, span_datum: SpanDatum) {
telemetry!(SUBSTRATE_INFO; "tracing.profiling";
"name" => span_datum.name,
"target" => span_datum.target,
"time" => span_datum.overall_time.as_nanos(),
"id" => span_datum.id.into_u64(),
"parent_id" => span_datum.parent_id.as_ref().map(|i| i.into_u64()),
"values" => span_datum.values
);
}
fn handle_event(&self, event: TraceEvent) {
telemetry!(SUBSTRATE_INFO; "tracing.event";
"name" => event.name,
"target" => event.target,
"parent_id" => event.parent_id.as_ref().map(|i| i.into_u64()),
"values" => event.values
);
}
}
#[cfg(test)]
mod tests {
use super::*;
@@ -62,10 +62,6 @@ where
S: Subscriber + for<'a> LookupSpan<'a>,
N: for<'a> FormatFields<'a> + 'static,
{
if event.metadata().target() == sc_telemetry::TELEMETRY_LOG_SPAN {
return Ok(());
}
let writer = &mut MaybeColorWriter::new(self.enable_color, writer);
let normalized_meta = event.normalized_metadata();
let meta = normalized_meta.as_ref().unwrap_or_else(|| event.metadata());
+19 -47
View File
@@ -29,16 +29,16 @@ mod layers;
pub use directives::*;
pub use sc_tracing_proc_macro::*;
use sc_telemetry::{ExtTransport, TelemetryWorker};
use std::io;
use tracing::Subscriber;
use tracing_subscriber::{
filter::LevelFilter,
fmt::time::ChronoLocal,
fmt::{
format, FormatEvent, FormatFields, Formatter, Layer as FmtLayer, MakeWriter,
SubscriberBuilder,
},
layer::{self, SubscriberExt}, filter::LevelFilter,
layer::{self, SubscriberExt},
registry::LookupSpan,
EnvFilter, FmtSubscriber, Layer, Registry,
};
@@ -75,8 +75,6 @@ fn prepare_subscriber<N, E, F, W>(
directives: &str,
profiling_targets: Option<&str>,
force_colors: Option<bool>,
telemetry_buffer_size: Option<usize>,
telemetry_external_transport: Option<ExtTransport>,
builder_hook: impl Fn(
SubscriberBuilder<
format::DefaultFields,
@@ -85,7 +83,7 @@ fn prepare_subscriber<N, E, F, W>(
fn() -> std::io::Stderr,
>,
) -> SubscriberBuilder<N, E, F, W>,
) -> Result<(impl Subscriber + for<'a> LookupSpan<'a>, TelemetryWorker)>
) -> Result<impl Subscriber + for<'a> LookupSpan<'a>>
where
N: for<'writer> FormatFields<'writer> + 'static,
E: FormatEvent<Registry, N> + 'static,
@@ -130,10 +128,9 @@ where
if let Some(profiling_targets) = profiling_targets {
env_filter = parse_user_directives(env_filter, profiling_targets)?;
env_filter = env_filter
.add_directive(
parse_default_directive("sc_tracing=trace").expect("provided directive is valid")
);
env_filter = env_filter.add_directive(
parse_default_directive("sc_tracing=trace").expect("provided directive is valid"),
);
}
let max_level_hint = Layer::<FmtSubscriber>::max_level_hint(&env_filter);
@@ -164,8 +161,6 @@ where
"%Y-%m-%d %H:%M:%S%.3f".to_string()
});
let (telemetry_layer, telemetry_worker) =
sc_telemetry::TelemetryLayer::new(telemetry_buffer_size, telemetry_external_transport)?;
let event_format = EventFormat {
timer,
display_target: !simple,
@@ -187,20 +182,18 @@ where
#[cfg(not(target_os = "unknown"))]
let builder = builder_hook(builder);
let subscriber = builder.finish().with(PrefixLayer).with(telemetry_layer);
let subscriber = builder.finish().with(PrefixLayer);
#[cfg(target_os = "unknown")]
let subscriber = subscriber.with(ConsoleLogLayer::new(event_format));
Ok((subscriber, telemetry_worker))
Ok(subscriber)
}
/// A builder that is used to initialize the global logger.
pub struct LoggerBuilder {
directives: String,
profiling: Option<(crate::TracingReceiver, String)>,
telemetry_buffer_size: Option<usize>,
telemetry_external_transport: Option<ExtTransport>,
log_reloading: bool,
force_colors: Option<bool>,
}
@@ -211,8 +204,6 @@ impl LoggerBuilder {
Self {
directives: directives.into(),
profiling: None,
telemetry_buffer_size: None,
telemetry_external_transport: None,
log_reloading: true,
force_colors: None,
}
@@ -234,18 +225,6 @@ impl LoggerBuilder {
self
}
/// Set a custom buffer size for the telemetry.
pub fn with_telemetry_buffer_size(&mut self, buffer_size: usize) -> &mut Self {
self.telemetry_buffer_size = Some(buffer_size);
self
}
/// Set a custom network transport (used for the telemetry).
pub fn with_transport(&mut self, transport: ExtTransport) -> &mut Self {
self.telemetry_external_transport = Some(transport);
self
}
/// Force enable/disable colors.
pub fn with_colors(&mut self, enable: bool) -> &mut Self {
self.force_colors = Some(enable);
@@ -255,64 +234,56 @@ impl LoggerBuilder {
/// Initialize the global logger
///
/// This sets various global logging and tracing instances and thus may only be called once.
pub fn init(self) -> Result<TelemetryWorker> {
pub fn init(self) -> Result<()> {
if let Some((tracing_receiver, profiling_targets)) = self.profiling {
if self.log_reloading {
let (subscriber, telemetry_worker) = prepare_subscriber(
let subscriber = prepare_subscriber(
&self.directives,
Some(&profiling_targets),
self.force_colors,
self.telemetry_buffer_size,
self.telemetry_external_transport,
|builder| enable_log_reloading!(builder),
)?;
let profiling = crate::ProfilingLayer::new(tracing_receiver, &profiling_targets);
tracing::subscriber::set_global_default(subscriber.with(profiling))?;
Ok(telemetry_worker)
Ok(())
} else {
let (subscriber, telemetry_worker) = prepare_subscriber(
let subscriber = prepare_subscriber(
&self.directives,
Some(&profiling_targets),
self.force_colors,
self.telemetry_buffer_size,
self.telemetry_external_transport,
|builder| builder,
)?;
let profiling = crate::ProfilingLayer::new(tracing_receiver, &profiling_targets);
tracing::subscriber::set_global_default(subscriber.with(profiling))?;
Ok(telemetry_worker)
Ok(())
}
} else {
if self.log_reloading {
let (subscriber, telemetry_worker) = prepare_subscriber(
let subscriber = prepare_subscriber(
&self.directives,
None,
self.force_colors,
self.telemetry_buffer_size,
self.telemetry_external_transport,
|builder| enable_log_reloading!(builder),
)?;
tracing::subscriber::set_global_default(subscriber)?;
Ok(telemetry_worker)
Ok(())
} else {
let (subscriber, telemetry_worker) = prepare_subscriber(
let subscriber = prepare_subscriber(
&self.directives,
None,
self.force_colors,
self.telemetry_buffer_size,
self.telemetry_external_transport,
|builder| builder,
)?;
tracing::subscriber::set_global_default(subscriber)?;
Ok(telemetry_worker)
Ok(())
}
}
}
@@ -335,7 +306,8 @@ mod tests {
#[test]
fn test_logger_filters() {
if env::var("RUN_TEST_LOGGER_FILTERS").is_ok() {
let test_directives = "afg=debug,sync=trace,client=warn,telemetry,something-with-dash=error";
let test_directives =
"afg=debug,sync=trace,client=warn,telemetry,something-with-dash=error";
init_logger(&test_directives);
tracing::dispatcher::get_default(|dispatcher| {