#tracing #logging #wasm-module

无 std tracing-tunnel

跨 API 边界传输跟踪信息

2 个不稳定版本

0.2.0-beta.12024 年 3 月 3 日
0.1.0 2022 年 12 月 9 日

调试 中排名第 117

Download history 1923/week @ 2024-04-15 1329/week @ 2024-04-22 1247/week @ 2024-04-29 1755/week @ 2024-05-06 1830/week @ 2024-05-13 1836/week @ 2024-05-20 1665/week @ 2024-05-27 2072/week @ 2024-06-03 2265/week @ 2024-06-10 1958/week @ 2024-06-17 2526/week @ 2024-06-24 1683/week @ 2024-07-01 2552/week @ 2024-07-08 2423/week @ 2024-07-15 2874/week @ 2024-07-22 3231/week @ 2024-07-29

每月下载量 11,203
4 个 crates 中使用(通过 tracing-capture

MIT/Apache

79KB
1.5K SLoC

跨 API 边界传输跟踪信息

Build Status License: MIT OR Apache-2.0 rust 1.70+ required no_std tested

文档: Docs.rs crate docs (main)

此 crate 提供了 tracing 基础设施助手,允许跨 API 边界传输跟踪事件

  • TracingEventSender 是一个跟踪 Subscriber,它将跟踪事件转换为(反)可序列化的表示形式,可以通过自定义钩子发送到其他地方。
  • TracingEventReceiver 消耗由 TracingEventSender 产生的事件并将它们转发到跟踪基础设施。假设事件源可能比特定 TracingEventReceiver 实例的生命周期和封装接收器的程序的生命周期都要长。为了处理这个问题,接收器提供了持久化/恢复其状态的手段。

这解决了拥有 动态 跟踪跨度/事件的调用点的问题,即编译期间未知的问题。如果调用点在动态加载的模块中定义,并且其执行被嵌入到程序中,例如 WASM 模块,则可能会发生这种情况。

有关 crate 设计和潜在用例的详细信息,请参阅 crate 文档。

用法

将此添加到您的 Crate.toml

[dependencies]
tracing-tunnel = "0.2.0-beta.1"

请注意,上述两种功能都受 opt-in 功能的限制;有关详细信息,请参阅 crate 文档。

发送跟踪事件

use std::sync::mpsc;
use tracing_tunnel::{TracingEvent, TracingEventSender, TracingEventReceiver};

// Let's collect tracing events using an MPSC channel.
let (events_sx, events_rx) = mpsc::sync_channel(10);
let subscriber = TracingEventSender::new(move |event| {
    events_sx.send(event).ok();
});

tracing::subscriber::with_default(subscriber, || {
    tracing::info_span!("test", num = 42_i64).in_scope(|| {
        tracing::warn!("I feel disturbance in the Force...");
    });
});

let events: Vec<TracingEvent> = events_rx.iter().collect();
println!("{events:?}");
// Do something with events...

接收跟踪事件

use std::sync::mpsc;
use tracing_tunnel::{
    LocalSpans, PersistedMetadata, PersistedSpans, TracingEvent, TracingEventReceiver,
};

tracing_subscriber::fmt().pretty().init();

fn replay_events(events: &[TracingEvent]) {
    let mut spans = PersistedSpans::default();
    let mut local_spans = LocalSpans::default();
    let mut receiver = TracingEventReceiver::default();
    for event in events {
        if let Err(err) = receiver.try_receive(event.clone()) {
            tracing::warn!(%err, "received invalid tracing event");
        }
    }

    // Persist the resulting receiver state. There are two pieces
    // of the state: metadata and alive spans. The spans are further split
    // into the persisted and local parts.
    let metadata = receiver.persist_metadata();
    let (spans, local_spans) = receiver.persist();
    // Store `metadata` and `spans`, e.g., in a DB, and `local_spans`
    // in a local data struct such as `HashMap` keyed by the executable ID.
}

许可协议

根据您的选择,该项目受Apache License, Version 2.0MIT许可证许可。

除非您明确说明,否则根据Apache-2.0许可证定义,您提交的旨在包含在tracing-toolbox中的任何贡献,将按上述方式双许可,不附加任何额外的条款或条件。

依赖项

~0.5–1.1MB
~25K SLoC