#tracing #spans #datadog #jaeger #open-telemetry

fastrace

为Rust提供高性能的时间轴跟踪库

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调试

Download history 1220/week @ 2024-07-13 2573/week @ 2024-07-20 2436/week @ 2024-07-27 5353/week @ 2024-08-03 4734/week @ 2024-08-10 4847/week @ 2024-08-17

18,254 每月下载量
13 个Crate中(12直接) 使用

Apache-2.0

180KB
3.5K SLoC

fastrace

Crates.io Documentation MSRV 1.75.0 CI Status License

fastrace是一个跟踪库,比其他库快10~100倍

benchmark

功能

资源

入门

在库中

库应该将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();
}

基准测试

按不同架构

Benchmark result by architecture

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

Benchmark result by number of spans

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并添加您的项目

常见问题解答

为什么fastrace如此快?

fastrace维护者发布了一些文章

什么是库级别跟踪?

库级别跟踪是指将跟踪功能直接集成到库中,而不是将其限制在应用级别或系统级别跟踪。

跟踪可能会给程序的执行引入开销。虽然在应用级别通常是可以接受的,因为额外的开销与总体执行时间相比通常微不足道,但在库级别可能会更成问题。在这里,函数可能会频繁调用或性能可能至关重要,跟踪的开销可能会变得很大。因此,未考虑速度和效率的跟踪库可能不适合库级别跟踪。

在fastrace库的领域,库级别跟踪被设计得既快又轻量,在未激活时几乎没有开销。这使得fastrace成为性能敏感型应用的绝佳选择,并且可以像log crate一样无缝集成到库中,这是其他跟踪库可能不提供的。

fastrace与其他跟踪库有何不同?

虽然许多跟踪库追求功能丰富,但fastrace优先考虑性能和简单性。

例如,fastrace不引入新的日志宏,例如info!()error!(),但与log crate无缝集成。这允许您使用现有的日志宏和依赖项,日志会自动附加到当前跟踪span。

fastrace会包含span的'level'吗?

“级别”这个概念可能不是追踪系统的最佳特性。虽然tokio-tracing包含了这个特性,但一个跨度中设置级别的潜在动机主要是围绕性能。更具体地说,这与追踪不感兴趣元素的性能影响相关。然而,追踪在两个方面与日志记录不同

  1. 忽略低级别跨度可能会无意中丢弃高级别子跨度。
  2. 在追踪系统中,过滤过程或通常所说的“级别”,应应用于整个追踪而不是追踪中的单个跨度。

在这种情况下,fastrace通过其独特的尾部采样设计过滤掉不感兴趣的整个追踪,从而提供了一种更有效的解决方案。因此,直接从日志系统中借用的“级别”概念可能不适合fastrace。

fastrace是否会支持OpenTelemetry特性'X'?

fastrace只关注高性能追踪。您可以提出一个关于您想要拥有的缺失追踪特性的问题。

请注意,我们始终优先考虑性能而非功能,因此并非所有追踪功能请求都可能被接受。

这个库的现状是什么?

API 不稳定:API尚未稳定,未来可能会发生变化。

代码库已测试:fastrace已经经过高覆盖率测试。然而,利用fastrace的应用程序尚未广泛部署,因此fastrace目前不被视为经过实战考验

许可证

该项目采用Apache-2.0许可证。

最初,该项目是minitrace的分支。有关更多信息,请参阅此线程

依赖项

~1.2-6.5MB
~38K SLoC