1 use std::thread::sleep; 2 use std::time::Duration; 3 use tracing::{span, Level}; 4 use tracing_flame::FlameLayer; 5 use tracing_subscriber::{prelude::*, registry::Registry}; 6 7 #[test] capture_supported()8fn capture_supported() { 9 let tmp_dir = tempfile::Builder::new() 10 .prefix("tracing-flamegraph-test-") 11 .tempdir() 12 .expect("failed to create tempdir"); 13 let path = tmp_dir.path().join("tracing.folded"); 14 let (flame_layer, flame_guard) = FlameLayer::with_file(&path).unwrap(); 15 16 let subscriber = Registry::default().with(flame_layer); 17 18 tracing::subscriber::set_global_default(subscriber).expect("Could not set global default"); 19 let span = span!(Level::ERROR, "main"); 20 let _guard = span.enter(); 21 22 let thread = span!(Level::ERROR, "outer").in_scope(|| { 23 sleep(Duration::from_millis(10)); 24 let span = span!(Level::ERROR, "Inner"); 25 let thread = std::thread::spawn(move || { 26 span.in_scope(|| { 27 sleep(Duration::from_millis(50)); 28 }); 29 }); 30 sleep(Duration::from_millis(20)); 31 thread 32 }); 33 34 sleep(Duration::from_millis(100)); 35 36 thread.join().unwrap(); 37 flame_guard.flush().unwrap(); 38 39 let traces = std::fs::read_to_string(&path).unwrap(); 40 println!("{}", traces); 41 assert_eq!(5, traces.lines().count()); 42 43 tmp_dir.close().expect("failed to delete tempdir"); 44 } 45