#tracers #probe #run-time #platform #dtrace #mechanism #native

tracers-core

包含跟踪的核心运行时组件。您不应直接使用此包;请使用“tracers”包代替

1 个不稳定版本

0.1.0 2019年11月20日

#9#tracers

38 每月下载量
7 包中使用 (5 个直接使用)

MIT/Apache

53KB
1K SLoC

tracers - Rust性能监控库

Crates.io Azure Build Status - Linux/macOS/Windows Cirrus CI - FreeBSD

摘要

tracers旨在成为一个易于使用且跨平台的Rust包,它使您能够轻松地将高性能低开销的探针添加到Rust程序中。在底层,它将使用每个平台的本地探针机制,例如Linux上的System Tap,BSD上的DTrace,以及Windows上的ETW。那些没有支持探针机制的平台将回退到无操作实现。

本包的关键目标是在任何Rust项目中添加它,在任何合适的地方创建和触发探针,并始终保留这些探针。当探针在编译时被禁用时,应该没有运行时影响,当探针被编译但未在运行时启用时,探针影响不应超过一到两条CPU指令。

状态

重要tracers仍然是实验性的。作者正在内部使用它,但这个包尚未得到广泛使用,可能包含微妙且关键的错误。

快速入门

在您的 Cargo.toml 中需要添加

[dependencies]
...
tracers = "0.1.0"
tracers-macros = "0.1.0"

[build-dependencies]
...
tracers-build = "0.1.0"

重要的是不要忘记将 tracers-build 添加到您的 build-dependencies 中,因为您将在构建时需要它,下一步是创建一个 src/build.rs 文件(如果您还没有的话),并确保它包含以下内容

use tracers_build::build;

fn main() {
build();
}

如果您已经有了 build.rs,您需要确保在 main 函数的某个地方调用 tracers_build::build(),最好是在早期。

到此为止,您已经拥有了定义探针所需的一切。这里有一个简单的示例

use tracers_macros::{probe, tracer};

#[tracer]
trait SimpleProbes {
fn hello(who: &str);
fn greeting(greeting: &str, name: &str);
fn optional_greeting(greeting: &str, name: &Option<&str>);
}

fn main() {
loop {
    probe!(SimpleProbes::hello("world"));
    probe!(SimpleProbes::greeting("hello", "world"));
    let name = Some("world");
    probe!(SimpleProbes::optional_greeting("hello", &name));
    let name: Option<&str> = None;
    probe!(SimpleProbes::optional_greeting("hello", &name));
}
}

您已经定义了三个探针,hellogreetingoptional_greeting。默认情况下,跟踪在编译时被禁用,因此当您运行此代码时,所有探针基础设施都将被优化掉,您将不会有任何运行时开销。

要实际启用探针,您需要在 tracers 包中激活相应的功能之一。例如,在您的 Cargo.toml

[dependencies]
...
tracers = { version = "0.1.0", features = [ "force_static_stap"]

将启用SystemTap跟踪。如果您再次重新构建并使用BCC中的 tplist 工具,您应该能够在二进制文件中看到探针。

注意,宏 #[tracers] 会为您的 trait 生成一些有用的文档。尝试执行 cargo doc 并在文档中找到您的 trait,以获取如何使用每个探测器的额外提示。

examples/ 目录中有些简单的示例。

平台

tracers 包和运行时组件应能在任何受支持的 Rust 平台上编译和运行(尽管目前尚不支持 no_std)。将 tracers 作为依赖项添加不应破坏任何平台上的项目;如果确实如此,则表示存在错误,并鼓励您在 GitHub 上提交问题。

尽管如此,tracers 包默认并不实际跟踪任何内容;它编译后什么也不生成。要启用跟踪,您需要一个受支持的平台。截至本文写作时,这意味着

  • 带有 System Tap 的 Linux(具有 force_static_stap 功能)
  • 带有 LTT-ng 的 Linux(具有 force_static_lttng 功能)

正在进行工作以支持

  • Windows(使用 Windows 系统事件跟踪 API)
  • FreeBSD 和 macOS(使用 DTrace)

许可证

除非另有说明,否则本项目根据您的选择,许可为以下之一:

供您选择。

但是,以下 -sys 包的许可证与它们所包装的第三方代码的许可证相对应

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义,您提交给 tracers 的任何有意贡献都应按上述方式双许可,不附加任何额外条款或条件。

发布

本节仅适用于维护者。

要发布新版本,必须首先发布依赖项包。脚本 bin/publish.sh 帮助自动化此过程,但它仍然是相当手动的过程。

发布流程

  1. 更新所有包以及所有对其他 tracers 包的依赖项的 version 属性,以新的目标版本。

  2. 确保所有依赖项都具有本地开发的路径依赖项和发布版本的版本依赖项。这些必须与新发布的版本一致。

  3. 更新 documentation 链接以反映当前版本。

必须按以下顺序发布包

  • tracers-core
  • tracers-libelf-sys
  • tracers-libstapsdt-sys
  • tracers-codegen
  • tracers-macros-hack
  • tracers-macros
  • tracers-dyn-stap
  • tracers-dyn-noop
  • tracers-build
  • tracers

依赖项

~2MB
~45K SLoC