#probe #tracers #time #build-time #dtrace #creation #enabled

sys build tracers-libstapsdt-sys

将libstapsdt暴露给Rust代码,用于程序化创建SystemTap用户模式探针。 请勿直接使用此 crate;使用 `tracers` 并让它确定构建时的正确实现

1个不稳定版本

0.1.0 2019年11月20日

#584构建工具


2 个crate中使用(通过 tracers-dyn-stap

MIT 和可能 LGPL-3.0-or-later

2.5MB
31K SLoC

C 23K SLoC // 0.2% comments Shell 5.5K SLoC // 0.2% comments Rust 1K SLoC // 0.0% comments M4 413 SLoC // 0.3% comments Happy 360 SLoC Automake 318 SLoC // 0.2% comments RPM Specfile 204 SLoC Python 135 SLoC // 0.4% comments GNU Style Assembly 31 SLoC AWK 8 SLoC // 0.3% comments C++ 6 SLoC // 0.4% comments

tracers - Rust仪表库

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

摘要

tracers 旨在成为一个易于使用且跨平台的Rust crate,它使得向Rust程序添加高性能低开销的探针变得容易。在底层,它将使用每个平台的本地探针机制,如Linux上的System Tap、BSD上的DTrace和Windows上的ETW。没有支持探针机制的平台将回退到无操作实现。

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

状态

重要tracers 仍然是实验性的。作者正在内部使用它,但此crate尚未广泛使用,可能存在微妙且关键的缺陷。

快速开始

在您的 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 crate 中对应的某个功能。例如,在您的 Cargo.toml

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

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

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

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

平台

tracers crate 和运行时组件应在任何支持的 Rust 平台上编译和运行(尽管 no_std 还不支持)。将 tracers 作为依赖项添加到项目中不应破坏任何平台的项目;如果确实如此,那是一个错误,您被鼓励在 GitHub 上提交问题。

但是,默认情况下,tracers crate 并不会真正追踪任何内容;它会编译成空。要实际上启用追踪,您需要一个支持的平台。截至撰写本文时,这意味着

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

正在进行工作以支持

  • 带有 Windows(具有 Windows 系统事件追踪 API)的 Windows
  • FreeBSD 和 macOS(具有 DTrace)

许可证

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

任选其一。

然而,以下 -sys crate 的许可证与它们所封装的第三方代码的许可证相对应:

贡献

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

发布

本节仅适用于维护者。

要发布新版本,必须首先发布依赖的crate。脚本 bin/publish.sh 有助于自动化过程,但仍然相当手动。

发布过程

  1. 将所有crate及其对其他 tracers crate的依赖的 version 属性更新为新的目标版本。

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

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

crate必须按以下顺序发布

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

依赖项