7 个版本

0.2.2 2022 年 4 月 26 日
0.2.1 2020 年 11 月 11 日
0.2.0 2020 年 7 月 9 日
0.1.3 2020 年 3 月 17 日
0.1.2 2020 年 1 月 24 日

#206 in 调试

Download history 720/week @ 2024-03-13 489/week @ 2024-03-20 256/week @ 2024-03-27 306/week @ 2024-04-03 1111/week @ 2024-04-10 1388/week @ 2024-04-17 1135/week @ 2024-04-24 1537/week @ 2024-05-01 1253/week @ 2024-05-08 1844/week @ 2024-05-15 555/week @ 2024-05-22 482/week @ 2024-05-29 923/week @ 2024-06-05 1298/week @ 2024-06-12 1080/week @ 2024-06-19 689/week @ 2024-06-26

4,225 每月下载量
用于 11 个 Crates(直接使用 4 个)

MIT/Apache

17KB
91

spandoc

Build Status Latest Version Rust Documentation

将函数中的文档注释转换为跟踪 spans 的属性宏。

详细信息

所有打算转换为范围的文档注释必须以 SPANDOC: 开头

use spandoc::spandoc;
use tracing::info;

#[spandoc]
fn foo() {
    /// SPANDOC: this will be converted into a span
    info!("event 1");

    /// this will be ignored and produce a warning for an unused doc comment
    info!("event 2");
}

spandoc 创建的范围被明确地限制与它们关联的表达式的作用域。

use spandoc::spandoc;
use tracing::info;

#[spandoc]
fn main() {
    tracing_subscriber::fmt::init();
    let local = 4;

    /// SPANDOC: Emit a tracing info event {?local}
    info!("event 1");

    info!("event 2");
}

运行上面的示例将产生以下输出

spandoc on  await-support [!+] is 📦 v0.1.3 via 🦀 v1.44.1
 cargo run --example scoped
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target/debug/examples/scoped`
Jul 09 12:42:43.691  INFO main::comment{local=4 text=Emit a tracing info event}: scoped: event 1
Jul 09 12:42:43.691  INFO scoped: event 2

可以通过在文档注释中添加尾随块将局部变量与生成的范围关联。范围的字段语法与 tracing 中相同。

use spandoc::spandoc;
use tracing::info;

#[spandoc]
fn foo() {
    let path = "fake.txt";
    /// SPANDOC: going to load config {?path}
    info!("event 1");

    /// this will be ignored and produce a warning for an unused doc comment
    info!("event 2");
}

当应用于包含 await 的表达式时,spandoc 将正确使用 instrument() 并在挂起和恢复未来时退出/进入范围。如果注释的表达式中有多个 await 表达式,则将相同的范围应用于每个表达式。宏不会递归到 async 块中。

use std::future::Future;
use spandoc::spandoc;
use tracing::info;

fn make_liz() -> impl Future<Output = Result<(), ()>> {
    info!("this will be printed in the span from `clever_girl`");

    liz()
}

async fn liz() -> Result<(), ()> {
    info!("this will also be printed in the span from `clever_girl`");

    // return a result so we can call map outside of the scope of the future
    Ok(())
}

#[spandoc]
async fn clever_girl() {
    // This span will be entered before the await, exited correctly when the
    // future suspends, and instrument the future returned from `liz` with
    // `tracing-futures`
    /// SPANDOC: clever_girl async span
    make_liz().await.map(|()| info!("this will also be printed in the span"));
}

许可证

根据您的选择,此软件受 Apache 许可证 2.0 版MIT 许可证 的许可。
除非您明确表示,否则您根据Apache-2.0许可证定义的,有意提交以包含在此软件包中的任何贡献,均应按上述方式双许可,不附加任何额外条款或条件。

依赖关系

~2MB
~41K SLoC