• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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()8 fn 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