7 个版本

0.2.1-eaze.72021 年 3 月 29 日
0.2.1-eaze.62021 年 3 月 24 日
0.2.1-eaze.22021 年 2 月 18 日

#600 in 调试

MIT 许可证

31KB
494

tracing-honeycomb on crates.io Documentation (latest release) Documentation (master) License CircleCI status

eaze-tracing-honeycomb

此软件包提供

  • 一个追踪层,TelemetryLayer,可用于将追踪数据发布到 honeycomb.io
  • 针对 honeycomb.io 后端实现分布式追踪的实用工具

作为追踪层,TelemetryLayer 可以与其他层组合以提供标准输出日志记录、过滤等。

用法

将以下内容添加到你的 Cargo.toml 中以开始使用。

tracing-honeycomb = "0.2.1-eaze.7"

传播分布式追踪元数据

此软件包提供了两个与 TelemetryLayer 的带外交互函数。

  • register_dist_tracing_root 将当前跨度注册为分布式追踪的本地根。
  • current_dist_trace_ctx 获取与当前跨度关联的 TraceIdSpanId

以下是如何一起使用它们的示例

  1. 使用新生成的 TraceId 将某个跨度注册为全局追踪根。
  2. 该跨度的子跨度使用 current_dist_trace_ctx 获取当前 TraceIdSpanId。它将这些值作为元数据与 RPC 请求一起传递。
  3. RPC 服务处理程序使用请求元数据中提供的 TraceId 和远程父 SpanId 将处理函数的跨度注册为分布式追踪的本地根,该追踪在步骤 1 中启动。

注册全局订阅者

以下示例展示了如何通过组合 TelemetryLayer 与其他层以及由 tracing_subscriber crate 提供的 Registry 订阅者来创建和注册订阅者。

let honeycomb_config = libhoney::Config {
    options: libhoney::client::Options {
        api_key: honeycomb_key,
        dataset: "my-dataset-name".to_string(),
        ..libhoney::client::Options::default()
    },
    transmission_options: libhoney::transmission::Options::default(),
};

let telemetry_layer = mk_honeycomb_tracing_layer("my-service-name", honeycomb_config);

// NOTE: the underlying subscriber MUST be the Registry subscriber
let subscriber = registry::Registry::default() // provide underlying span data store
    .with(LevelFilter::INFO) // filter out low-level debug tracing (eg tokio executor)
    .with(tracing_subscriber::fmt::Layer::default()) // log to stdout
    .with(telemetry_layer); // publish to honeycomb backend


tracing::subscriber::set_global_default(subscriber).expect("setting global default failed");

测试

由于 TraceCtx::current_trace_ctxTraceCtx::record_on_current_span 只要作为层/订阅者堆栈的一部分注册了某个 TelemetryLayer,并且当前跨度是活动的,就可以期望它们返回 Ok,因此可以合理地期望它们总是成功,并在它们失败时引发恐慌。结果,您可能会编写在不存在分布式跟踪上下文时失败的代码。这意味着覆盖此类代码的单元和集成测试必须提供 TelemetryLayer。然而,在运行单元或集成测试时,您可能不希望发布遥测数据。您可以通过使用 BlackholeTelemetry 构造的 TelemetryLayer 来解决这个问题。 BlackholeTelemetry 丢弃跨度事件,而不会将它们发布到任何后端。

let telemetry_layer = mk_honeycomb_blackhole_tracing_layer(); 

// NOTE: the underlying subscriber MUST be the Registry subscriber
let subscriber = registry::Registry::default() // provide underlying span data store
    .with(LevelFilter::INFO) // filter out low-level debug tracing (eg tokio executor)
    .with(tracing_subscriber::fmt::Layer::default()) // log to stdout
    .with(telemetry_layer); // publish to blackhole backend

tracing::subscriber::set_global_default(subscriber).expect("setting global default failed");

许可协议

MIT

依赖关系

~11-20MB
~304K SLoC