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
每月下载1,201次
49KB
1K SLoC
Datadog apm (基于sync的) 用于Rust(从datadog-apm原始分支)
致谢
最初基于来自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