#tracing-layer #spans #plain-text #events #tracing-subscriber #timeline #examine

tracing-texray

用于查看跨度的事件和事件的纯文本时间线的跟踪层

2个不稳定版本

0.2.0 2023年5月6日
0.1.2 2022年1月24日
0.1.1 2022年1月18日
0.1.0 2022年1月17日

#262 in 调试

Download history 1853/week @ 2024-03-14 1636/week @ 2024-03-21 1606/week @ 2024-03-28 1948/week @ 2024-04-04 1736/week @ 2024-04-11 2160/week @ 2024-04-18 2261/week @ 2024-04-25 2033/week @ 2024-05-02 1670/week @ 2024-05-09 1613/week @ 2024-05-16 1525/week @ 2024-05-23 1662/week @ 2024-05-30 1701/week @ 2024-06-06 2096/week @ 2024-06-13 999/week @ 2024-06-20 834/week @ 2024-06-27

6,016每月下载量
用于 2 crates

MIT许可证

48KB
1K SLoC

tracing-texray 最新版本

tracing-texray 是一个 跟踪 层,用于以纯文本形式内省跨度和事件。通过 examine-ing 特定跨度,当该跨度退出时将输出完整的树。使用如下代码(实际程序省略)

fn main() {
    // initialize & install as the global subscriber
    tracing_texray::init();
    // examine the `load_data` span:
    tracing_texray::examine(tracing::info_span!("load_data")).in_scope(|| {
        do_a_thing()
    });
}

fn do_a_thing() {
    // ...
}

你将在标准错误输出看到以下输出

load_data                                52ms ├────────────────────────────────┤
  download_results{uri: www.crates.io}   11ms                ├─────┤
   >URI resolved                                             ┼
   >connected                                                   ┼
  compute_stats                          10ms                        ├─────┤
  render_response                         6ms                               ├──┤

在不需要像 tracing-chrome 这样的强大解决方案的情况下,tracing-texray 可以渲染事件发生的轻量级时间线。

用法

tracing-texray 结合了两个部分:全局订阅者和本地跨度检查。默认情况下,tracing-texray 不会打印任何内容——它只是静静地坐在后台。但是:一旦检查了跨度,tracing-texray 将跟踪该跨度及其所有子跨度。当跨度退出时,跨度诊断将打印到标准错误(或其他配置的 impl)。

首先,必须在全局范围内安装层

use std::time::Duration;
use tracing_texray::TeXRayLayer;
use tracing_subscriber::{Registry, EnvFilter, layer::SubscriberExt};
fn main() {
    // Option A: Exclusively using tracing_texray:
    tracing_texray::init();
    
    // Option B: install the layer in combination with other layers, eg. tracing_subscriber::fmt:
    let subscriber = Registry::default()
        .with(EnvFilter::try_from_default_env().expect("invalid env filter"))
        .with(tracing_subscriber::fmt::layer())
        .with(
            TeXRayLayer::new()
                // by default, all metadata fields will be printed. If this is too noisy,
                // fitler only the fields you care about
                .only_show_fields(&["name", "operation", "service"])
                // only print spans longer than a certain duration
                .min_duration(Duration::from_millis(100)),
        );
    tracing::subscriber::set_global_default(subscriber).unwrap();
}

接下来,使用 examine 包装你想要跟踪的任何跨度

use tracing::info_span;
use tracing_texray::examine;

fn somewhere_deep_in_my_program() {
    tracing_texray::examine(info_span!("do_a_thing")).in_scope(|| {
        for id in 0..5 {
            some_other_function(id);
        }
    })
}

fn some_other_function(id: usize) {
    info_span!("inner_task", id = %id).in_scope(|| tracing::info!("buzz"));
    // ...
}

do_a_thing 跨度退出时,将打印以下输出

do_a_thing           509μs ├───────────────────────────────────────────────────┤
  inner_task{id: 0}   92μs         ├────────┤
   >buzz                             ┼
  inner_task{id: 1}   36μs                       ├──┤
   >buzz                                         ┼
  inner_task{id: 2}   35μs                               ├──┤
   >buzz                                                 ┼
  inner_task{id: 3}   36μs                                         ├──┤
   >buzz                                                           ┼
  inner_task{id: 4}   35μs                                                 ├──┤
   >buzz                                                                   ┼

依赖关系

~1.6–7MB
~33K SLoC