如何使用 Rust 跟踪记录跨度持续时间?

ale*_*tes 9 rust rust-tracing

Rust 有一个看起来很受欢迎的跟踪库。它使用一个名为“span”的构建块:

跨度表示程序执行的时间段。

现在我已经在整个应用程序中设置了跨度,我如何实际记录它们的持续时间?

到目前为止我发现:

  • 追踪计时。很棒,但有点复杂,当我想要简单的持续时间时,打印整个直方图。
  • 追踪树。这个非常接近我正在寻找的东西,目前的设置对我来说失败了,我会弄清楚的,但是这个仍然将它们打印在一棵树中,我正在寻找更多的简单持续时间。没有树。

有什么办法可以通过追踪来做到这一点吗?

kmd*_*eko 10

基本格式化层来自跟踪订阅者对于记录的内容非常灵活。默认情况下,它只会显示日志事件,但还有其他可用于跨度的事件(新建、进入、退出、关闭)。您可能对记录“关闭”事件感兴趣,这些事件指示跨度何时结束,并且知道从开始时起经过的时间。

\n

您可以简单地使用.with_span_events()和来完成此操作FmtSpan::CLOSE即可完成此操作。这是一个示例:

\n
[dependencies]\ntracing = "0.1.36"\ntracing-subscriber = "0.3.15"\n
Run Code Online (Sandbox Code Playgroud)\n
use std::time::Duration;\nuse tracing_subscriber::fmt;\nuse tracing_subscriber::fmt::format::FmtSpan;\n\n#[tracing::instrument]\nfn do_some_work(n: i32) {\n    std::thread::sleep(Duration::from_millis(100));\n    if n == 1 {\n        do_some_more_work();\n    }\n}\n\n#[tracing::instrument]\nfn do_some_more_work() {\n    std::thread::sleep(Duration::from_millis(100));\n}\n\nfn main() {\n    fmt::fmt()\n        .with_span_events(FmtSpan::CLOSE)\n        .with_target(false)\n        .with_level(false)\n        .init();\n\n    for n in 0..3 {\n        do_some_work(n);\n    }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n
use std::time::Duration;\nuse tracing_subscriber::fmt;\nuse tracing_subscriber::fmt::format::FmtSpan;\n\n#[tracing::instrument]\nfn do_some_work(n: i32) {\n    std::thread::sleep(Duration::from_millis(100));\n    if n == 1 {\n        do_some_more_work();\n    }\n}\n\n#[tracing::instrument]\nfn do_some_more_work() {\n    std::thread::sleep(Duration::from_millis(100));\n}\n\nfn main() {\n    fmt::fmt()\n        .with_span_events(FmtSpan::CLOSE)\n        .with_target(false)\n        .with_level(false)\n        .init();\n\n    for n in 0..3 {\n        do_some_work(n);\n    }\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用其他方法或创建自定义来根据您的喜好进一步定制它FormatEvent实现来根据您的喜好进一步自定义它。

\n

我确实想提一下,跟踪“一个用于检测 Rust 程序以收集结构化、基于事件的诊断信息的框架”。虽然功能计时是该诊断信息的一部分,但它的设计方式是在现场收集该信息。如果您尝试在合成环境中评估代码的性能,我鼓励您使用更强大的基准测试库,例如criteria

\n