#tracing #async #tokio #rust

tracing-tools

快速简单的临时修复,用于使用跟踪对异步代码进行工具化

7 个版本 (破坏性更新)

0.6.0 2021 年 12 月 4 日
0.5.0 2021 年 6 月 19 日
0.4.0 2021 年 6 月 19 日
0.3.0 2021 年 6 月 19 日
0.1.1 2021 年 5 月 26 日

#265 in #tracing

Download history 72/week @ 2024-03-12 43/week @ 2024-03-19 3/week @ 2024-03-26 57/week @ 2024-04-02 35/week @ 2024-04-09 36/week @ 2024-04-16

每月 57 次下载
2 crates 中使用

MIT 许可证

34KB
93

tracing-tools - 简化与跟踪集成的微小库

目前,tracing 与异步代码一起使用时有点不可用,因为推荐的为异步代码进行工具化的方式是通过使用 async 代码的宏 #instrument,它

  • 不支持错误格式化(当与 like anyhow 这样的 crate 一起使用时非常痛苦,因为它会吞掉错误链)
  • 跳过字段的语法非常繁琐,并且默认尝试暴露所有字段,这在我的 95% 的用例中完全没有意义

所以这个微小的 crate 尝试通过直接代码工具化来解决这些问题,示例

example

use anyhow::{anyhow, Context};
use tracing::{Level};
use tracing_tools::{span, TracingTask, PinnedFut};
use tokio::time::{sleep, Duration};

type Result<T> = anyhow::Result<T>;

struct Test {
}

impl Test {
    fn drink_coffee(&self, ) -> Result<()> {
        Err(anyhow!("out of coffee"))
    }

    fn fn1(&self, n: usize) -> PinnedFut<'_> {
        TracingTask::new(span!(Level::INFO, n=n, another_field="bow wow!"), async move {
            sleep(Duration::from_secs(1)).await;
            Ok(())
        }).instrument()
    }
    fn fn2(&self, n: usize) -> PinnedFut<'_> {
        TracingTask::new(span!(Level::INFO, n=n, another_field="bow wow!"), async move {
            Ok(self.drink_coffee().context("cannot drink coffee")?)
        }).instrument()
    }
    fn fn3(& self, n: usize) -> PinnedFut<'_> {
        TracingTask::new_short_lived(span!(Level::INFO, n=n, another_field="bow wow!"), async move {
            Ok(self.drink_coffee().context("cannot drink coffee")?)
        }).instrument()
    }
}

fn configure_tracing() -> Result<()>{
    let collector = tracing_subscriber::fmt()
        .with_target(false)
        .with_max_level(Level::INFO)
        .finish();
    tracing::subscriber::set_global_default(collector)?;
    Ok(())
}

#[tokio::main]
async fn main() -> Result<()> {
    configure_tracing()?;
    let s = Test {};
    let _ = s.fn1(1).await;
    let _ = s.fn2(2).await;
    let _ = s.fn3(3).await;
    Ok(())
}

欢迎 fork ;)

依赖关系

~600KB