11次发布

0.6.1 2024年6月13日
0.6.0 2022年10月13日
0.5.1 2022年4月12日
0.5.0 2022年2月15日
0.3.0 2020年11月19日

网络编程中排名189

Download history 150/week @ 2024-04-21 53/week @ 2024-04-28 76/week @ 2024-05-05 144/week @ 2024-05-12 138/week @ 2024-05-19 210/week @ 2024-05-26 244/week @ 2024-06-02 300/week @ 2024-06-09 232/week @ 2024-06-16 159/week @ 2024-06-23 224/week @ 2024-06-30 197/week @ 2024-07-07 194/week @ 2024-07-14 448/week @ 2024-07-21 335/week @ 2024-07-28 224/week @ 2024-08-04

每月下载1,201

MIT 许可证

49KB
1K SLoC

Datadog apm (基于sync的) 用于Rust(从datadog-apm原始分支)

MIT licensed CI

致谢

最初基于来自https://github.com/pipefy/datadog-apm-rust的分支。原始代码由Fernando Gonçalves编写(github: https://github.com/fhsgoncalves)。

对原始作者的代码表示感谢。此仓库建立在他的辛勤工作和研究之上。

用法

添加到您的Cargo.toml

tracing = "0.1"
tracing-futures = "*"
datadog-apm-sync = {version = "0.2", git = "http://github.com/kitsuneninetails/datadog-apm-rust-sync"}

在您的Rust代码中,实例化一个DatadogTracer

# {
    let config = Config {
        service: "service_name".into(),
        logging_config: Some(LoggingConfig {
            level: Level::Debug,
            ..LoggingConfig::default()
        }),
        enable_tracing: true,
        ..Default::default()
    };
    let _client = DatadogTracing::new(config);
#}

然后,像通常使用跟踪库一样使用(带有#[instrument]标签,以及span! + span.enter()代码),您的数据将在适用的情况下记录跟踪-id/span-id(由于传递了logging_config;传递None以禁用DatadogTracing作为记录器)并通过跟踪::Subscriber调用准备datadog跟踪(由于enable_tracing被设置;将其设置为false以禁用DatadogTracing作为跟踪订阅者)。

使用事件(event!宏)发送错误信息(使用键:error_msg、error_stack和error_type)或HTTP元数据信息(使用http_url、http_method和http_status_code键)。此外,要实际强制发送到Datadog,请发送一个事件

event!(tracing::Level::INFO, send_trace=true);

与原始版本的其他更改

  • 删除了tokio crate。
  • 删除了所有关于async/await的提及。
  • 将MPSC改为std::sync版本,而不是tokio::sync版本。
  • 将MPSC发送者通道包装在Arc-Mutex中以弥补不是tokio版本的问题。
  • 将通道调用更改为与std::sync版本API保持一致。

这些更改背后的原因有两个。首先,由于与tokio::sync::mpsc通道冲突,代码无法直接使用,这会导致同时使用时引发panic。其次,对代码的微小修改只会导致失败、panic以及由于async/await而无法运行的代码块。这两点使得这项服务无法用于生产环境,并模糊了代码内部处理的大量内容(特别是难以理解为什么忙等循环从未运行,或者为什么某些代码部分从未被调用),这意味着如果出现问题,在生产环境中无法信任它。

由于整个服务中唯一的I/O密集型功能是调用Datadog Agent API,并且由于这是一个通常的本地服务,因此它甚至不是非常I/O密集型,因此进行了将服务移动到同步的具体修改。
鉴于已经存在的忙等循环来处理API调用发送,引入复杂的async/await系统(它无法直接使用)似乎并不必要。移除这一点大大减少了复杂性,并提高了代码的可理解性和清晰度,这使我在生产中使用它时更加自信。

此外,还对架构和实现进行了以下更改,因为一些设计决策和代码结构不符合我的需求

  • 移除了datadog发送的缓冲。由于忙等循环包含一个通道(用作缓冲),并且它基本上是发送到本地dogstatsd代理(它本身处理缓冲以发送到Datadog服务器),因此在此代码中添加缓冲只会增加复杂性,而几乎不会在性能或安全性方面带来任何收益。
  • 修改了API,使其仅发送单个跟踪。
  • 移除了数据的map-packing(这不起作用并且会错误地向DataDog Agent发送)。
    仅使用JSON(DataDog Agent API支持)。
  • 将客户端拆分为一个名为DatadogTracing的结构,它仅包含发送器通道(因为模块的用户只需要将跟踪发送到通道),以及一个“DdAgentClient”,它仅由忙等循环用于从通道读取并发送到DataDog Agent API。
  • 将跟踪和跨度结构移动到“model”模块,可以在通过“DatadogTracing”结构发送之前单独构建模型。
  • 将内部客户端特定代码移动到“api”(用于存储DataDog Agent API对象)以及每个相应结构上的转换器(RawTrace-它只是Vec的包装器,以及RawSpan)以将模型结构转换为DataDog Agent API所需的api结构。
  • 现在,仅公开“DatadogTracing”,因为DdAgentClient仅用于内部。
  • 将测试移动到与模块匹配的位置。

本项目许可协议为MIT许可

依赖关系

~4–11MB
~134K SLoC