#tracing #dynamic #fields #instrumentation #logging #field

tracing_dynamic

用于处理 Tokio Tracing 的实用工具,具有用于事件和范围的动态字段

4 个版本 (2 个破坏性更新)

0.3.1 2023年10月31日
0.3.0 2023年10月31日
0.2.0 2023年10月27日
0.1.0 2023年10月26日

#26 in #instrumentation

Apache-2.0

23KB
572 行(不包括注释)

tracing-dynamic

⚠️ 使用此库前请阅读此内容 ⚠️

这是一个小型库,允许您在跨度(span)和事件上创建动态属性。

使用前需要考虑的事项

  • 它将导致内存泄漏。这发生在 SpanFactory 或 EventFactory 的每次实例化时。您需要谨慎创建工厂并重复使用它们。
  • 我没有在实际程序中测试它。
  • 它的速度会比 tracing 宏慢,但您来这里是为了灵活性,对吧?

在阅读上述内容后,如果您想尝试它,以下是使用方法

tracing_dynamic = "0.3.1"
  use tracing_dynamic::{EventFactory, SpanFactory};
  // Some dynamic attributes, these could be read from a file or a database.
  let attrs = vec!["dyn_attr_1", "dyn_attr_2"];
  
  // Factories leak, create these once and reuse them.
  let span_factory = SpanFactory::new(
    "span_name",
    "span_target",
    tracing::Level::INFO,
    None,
    None,
    None,
    &attrs,
  );
  let event_factory = EventFactory::new(
    "event_name",
    "event_target",
    tracing::Level::INFO,
    None,
    None,
    None,
    &attrs,
  );
  
  let subscriber = tracing_subscriber::fmt().pretty().finish();
  tracing::subscriber::with_default(subscriber, || {
  // Create a span with attributes defined at runtime
    let span = span_factory.create()
      .with("dyn_attr_1", &"dyn_attr_1") // Field created at span creation time
      .build();
    let _guard = span.enter();
    span.record("dyn_attr_2", "dyn_attr_2");
    span.record("dyn_attr_4", "dyn_attr_4"); // Not in the original metadata, it'll be ignored.
    
    // Create an event with fields defined at runtime
    event_factory
      .create()
      .with("dyn_attr_1", &"dyn_attr_1")
      .with("dyn_attr_2", &"dyn_attr_2")
      .with("dyn_attr_4", &"dyn_attr_4") // Not in the original metadata, it'll be ignored.
      .finish();
  });

输出

  2023-10-30T08:44:52.178162Z  INFO event_target: dyn_attr_1: "dyn_attr_1", dyn_attr_2: "dyn_attr_2"
    in span_target::span_name with dyn_attr_1: "dyn_attr_1", dyn_attr_2: "dyn_attr_2"

依赖关系

~315–435KB