#[cfg(feature = "opentelemetry")]
use {
tracing::{info_span, instrument},
tracing_subscriber::{layer::SubscriberExt as _, registry::Registry},
};
#[cfg(feature = "opentelemetry")]
#[instrument]
fn span_with_export() {
tracing::info!("This span should be exported");
}
#[cfg(feature = "opentelemetry")]
#[instrument(skip_all, fields(opentelemetry.skip = true))]
fn span_without_export() {
tracing::info!("This span should NOT be exported");
}
#[cfg(feature = "opentelemetry")]
#[test]
fn test_opentelemetry_filters_skip() {
let (opentelemetry_layer, exporter, tracer_provider) =
linera_base::tracing_opentelemetry::build_opentelemetry_layer_with_test_exporter(
"test_opentelemetry",
);
let subscriber = Registry::default().with(opentelemetry_layer);
tracing::subscriber::with_default(subscriber, || {
span_with_export();
span_without_export();
let manual_exported_span = info_span!("manual_exported").entered();
tracing::info!("Manual span without skip");
drop(manual_exported_span);
let manual_skipped_span = info_span!("manual_skipped", opentelemetry.skip = true).entered();
tracing::info!("Manual span with opentelemetry.skip");
drop(manual_skipped_span);
});
drop(tracer_provider);
let exported_spans = exporter
.get_finished_spans()
.expect("Failed to get exported spans");
let span_names: Vec<String> = exported_spans.iter().map(|s| s.name.to_string()).collect();
assert!(
span_names.contains(&"span_with_export".to_string()),
"Regular span should be exported to OpenTelemetry. Found spans: {span_names:?}"
);
assert!(
!span_names.contains(&"span_without_export".to_string()),
"Span with opentelemetry.skip should NOT be exported to OpenTelemetry. Found spans: {span_names:?}"
);
assert!(
span_names.contains(&"manual_exported".to_string()),
"Manual span without skip should be exported. Found spans: {span_names:?}"
);
assert!(
!span_names.contains(&"manual_skipped".to_string()),
"Manual span with opentelemetry.skip should NOT be exported. Found spans: {span_names:?}"
);
}