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

0.2.1 2024年2月10日
0.2.0 2024年2月10日
0.1.6 2024年2月10日
0.1.5 2023年10月10日
0.0.1 2023年9月20日

网络编程 中排名 695

Download history 616/week @ 2024-03-14 621/week @ 2024-03-21 561/week @ 2024-03-28 790/week @ 2024-04-04 528/week @ 2024-04-11 500/week @ 2024-04-18 486/week @ 2024-04-25 551/week @ 2024-05-02 732/week @ 2024-05-09 714/week @ 2024-05-16 558/week @ 2024-05-23 445/week @ 2024-05-30 880/week @ 2024-06-06 813/week @ 2024-06-13 552/week @ 2024-06-20 645/week @ 2024-06-27

每月下载量 3,011

MIT 许可证

21KB
254

crates-badge docs-badge Crates.io

非官方的 Rust 服务 Datadog 追踪和日志关联。

此包包含连接 OpenTelemetry、追踪和 Datadog 之间差距所需的粘合剂。

功能

datadog-tracing 具有以下功能

  1. tracing:向 Datadog 代理发送追踪的 OpenTelemetry 追踪器/层的构建实用工具
  2. 日志关联:将追踪 ID 和跨度 ID 转换为 Datadog 本地格式,并将它们注入到 dd.trace_iddd.span_id 字段(更多信息
  3. 传播:设置 Datadog 传播者作为全局传播者的实用函数
  4. axum(通过 axum 功能启用):重新公开 axum-tracing-opentelemetry 的功能
  5. 具有偏好的追踪订阅者初始化函数,配置日志和 datadog 导出器。它是可选的,你可以构建自己的:它使用的函数是公开的。

配置

该库可以通过以下环境变量进行配置

环境变量 默认值 描述
DD_ENABLED false 启用 datadog 导出器和日志上的 trace_id/span_id
DD_SERVICE Datadog 服务名称
DD_AGENT_HOST localhost Datadog 代理主机
DD_AGENT_PORT 8126 Datadog 代理端口
RUST_LOG info
AXUM_TRACING_LOG_LEVEL 如果 DD_ENABLED=true,则 "trace",否则 "off"
OTEL_LOG_LEVEL debug

示例

  • 请参阅 axum 文件夹以获取使用 axum 的完整示例。
    • 请参阅 Cargo.toml 此处

进一步背景和理由

灵感

这个库高度受到了ddtrace crate的启发,它也是一种在追踪、OpenTelemetry和Datadog之间的粘合剂。主要区别在于它使用opentelemetry_otlp导出器,而此库使用opentelemetry_datadog,因此无需配置Datadog代理以通过OTLP接收追踪,默认的Datadog APM也能正常工作!

传播

两种常用的传播标准是B3(OpenZipkin的传播风格)和Jaeger。OpenTelemetry支持这两种

大多数Datadog SDK都支持B3和Datadog原生传播风格。例如,Python的datadog-tracing库支持B3,但需要显式启用

为了方便与其他语言编写的、使用官方Datadog SDK的服务集成,我们选择坚持使用Datadog风格的传播而不是B3。这通过set_global_propagator函数设置,该函数在创建追踪器时自动调用。

Reqwest传播

Python库会自动处理追踪上下文的传播。不幸的是,在Rust中我们需要手动处理。

在HTTP请求中的传播可能是最常见的需求。此crate不提供任何额外支持,但建议使用reqwest-middleware crate在使用reqwest时注入必要的头信息。如果您使用datadog-tracing设置全局传播器,它将直接工作。

use datadog-tracing::set_global_propagator;
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
use reqwest_tracing::TracingMiddleware;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let (_guard, tracer_shutdown) = datadog_tracing::init()?;
    client = get_http_client();
    
    // setup your app and inject the client
}

fn get_http_client() -> ClientWithMiddleware {
    ClientBuilder::new(reqwest::Client::new())
        .with(TracingMiddleware::default())
        .build()
}

依赖

~15–32MB
~471K SLoC