4个版本
0.7.2 | 2024年8月16日 |
---|---|
0.7.1 | 2024年8月14日 |
0.7.0 | 2024年8月14日 |
0.6.8 | 2024年7月16日 |
#271 在 调试 中
18,254 每月下载量
在 13 个Crate中(12直接) 使用
180KB
3.5K SLoC
fastrace
fastrace是一个跟踪库,比其他库快10~100倍
功能
资源
入门
在库中
库应该将fastrace
作为依赖项,而不启用任何额外功能。
[dependencies]
fastrace = "0.7"
将trace
属性添加到您想跟踪的函数中。在本例中,如果调用者设置了跟踪上下文,则每次调用函数时都会收集一个SpanRecord
。
#[fastrace::trace]
pub fn send_request(req: HttpRequest) -> Result<(), Error> {
// ...
}
无论调用者是否设置了跟踪上下文,库都可以设置一个单独的跟踪上下文。这可以通过使用Span::root()
来启动一个新的跟踪,并使用Span::set_local_parent()
为当前线程设置本地上下文来实现。
func_path!()
宏可以检测函数的完整名称,该名称用作根跨度名称。
use fastrace::prelude::*;
pub fn send_request(req: HttpRequest) -> Result<(), Error> {
let root = Span::root(func_path!(), SpanContext::random());
let _guard = root.set_local_parent();
// ...
}
在应用程序中
应用程序应将fastrace
作为依赖项,并设置enable
功能。要静态禁用fastrace
,只需删除enable
功能。
[dependencies]
fastrace = { version = "0.7", features = ["enable"] }
应用程序应在程序的早期运行时初始化一个Reporter
实现。在初始化报告器之前生成的跨度记录将被忽略。在终止之前,应调用flush()
以确保报告所有收集到的跨度记录。
当根span被丢弃时,它的所有子span和本身都会一次性被报告。因此,建议为短期任务创建根span,例如处理请求,如下例所示。否则,将永远不会报告无休止的跟踪。
use fastrace::collector::Config;
use fastrace::collector::ConsoleReporter;
use fastrace::prelude::*;
fn main() {
fastrace::set_reporter(ConsoleReporter, Config::default());
loop {
let root = Span::root("worker-loop", SpanContext::random());
let _guard = root.set_local_parent();
handle_request();
}
fastrace::flush();
}
基准测试
按不同架构
x86-64 (Intel Broadwell) | x86-64 (Intel Skylake) | x86-64 (AMD Zen) | ARM (AWS Graviton2) | |
---|---|---|---|---|
tokio-tracing | 慢124倍 | 慢33倍 | 慢36倍 | 慢29倍 |
rustracing | 慢45倍 | 慢10倍 | 慢11倍 | 慢9倍 |
fastrace (基准) | 1倍 (3.4微秒) | 1倍 (3.2微秒) | 1倍 (3.8微秒) | 1倍 (4.2微秒) |
通过创建不同数量的span
1个span | 10个span | 100个span | 1000个span | |
---|---|---|---|---|
tokio-tracing | 慢19倍 | 慢61倍 | 慢124倍 | 慢151倍 |
rustracing | 慢13倍 | 慢26倍 | 慢45倍 | 慢55倍 |
fastrace (基准) | 1倍 (0.4微秒) | 1倍 (0.8微秒) | 1倍 (3.4微秒) | 1倍 (27.8微秒) |
详细结果可在 etc/benchmark-result 中查看。
支持的Rust版本 (MSRV 1.75.0)
Fastrace是针对最新稳定版本构建的。最低支持的版本是1.75.0。当前Fastrace版本不能保证在低于最低支持版本的Rust版本上构建。
使用fastrace的项目
请随意在此处打开PR并添加您的项目
- Conductor: 开源GraphQL网关
- Apache OpenDAL: 用于各种存储的数据访问层
- Databend: 雪花的高性价比替代品
- foyer: Rust中的混合内存和磁盘缓存
常见问题解答
为什么fastrace如此快?
fastrace维护者发布了一些文章
什么是库级别跟踪?
库级别跟踪是指将跟踪功能直接集成到库中,而不是将其限制在应用级别或系统级别跟踪。
跟踪可能会给程序的执行引入开销。虽然在应用级别通常是可以接受的,因为额外的开销与总体执行时间相比通常微不足道,但在库级别可能会更成问题。在这里,函数可能会频繁调用或性能可能至关重要,跟踪的开销可能会变得很大。因此,未考虑速度和效率的跟踪库可能不适合库级别跟踪。
在fastrace库的领域,库级别跟踪被设计得既快又轻量,在未激活时几乎没有开销。这使得fastrace成为性能敏感型应用的绝佳选择,并且可以像log crate一样无缝集成到库中,这是其他跟踪库可能不提供的。
fastrace与其他跟踪库有何不同?
虽然许多跟踪库追求功能丰富,但fastrace优先考虑性能和简单性。
例如,fastrace不引入新的日志宏,例如info!()
或error!()
,但与log
crate无缝集成。这允许您使用现有的日志宏和依赖项,日志会自动附加到当前跟踪span。
fastrace会包含span的'level'吗?
“级别”这个概念可能不是追踪系统的最佳特性。虽然tokio-tracing
包含了这个特性,但一个跨度中设置级别的潜在动机主要是围绕性能。更具体地说,这与追踪不感兴趣元素的性能影响相关。然而,追踪在两个方面与日志记录不同
- 忽略低级别跨度可能会无意中丢弃高级别子跨度。
- 在追踪系统中,过滤过程或通常所说的“级别”,应应用于整个追踪而不是追踪中的单个跨度。
在这种情况下,fastrace通过其独特的尾部采样设计过滤掉不感兴趣的整个追踪,从而提供了一种更有效的解决方案。因此,直接从日志系统中借用的“级别”概念可能不适合fastrace。
fastrace是否会支持OpenTelemetry特性'X'?
fastrace只关注高性能追踪。您可以提出一个关于您想要拥有的缺失追踪特性的问题。
请注意,我们始终优先考虑性能而非功能,因此并非所有追踪功能请求都可能被接受。
这个库的现状是什么?
API 不稳定:API尚未稳定,未来可能会发生变化。
代码库已测试:fastrace已经经过高覆盖率测试。然而,利用fastrace的应用程序尚未广泛部署,因此fastrace目前不被视为经过实战考验。
许可证
该项目采用Apache-2.0许可证。
最初,该项目是minitrace的分支。有关更多信息,请参阅此线程
依赖项
~1.2-6.5MB
~38K SLoC