1 个不稳定版本
0.1.0 | 2019年11月20日 |
---|
#1756 在 过程宏
在 4 个crate中(直接使用2个) 中使用
370KB
6.5K SLoC
tracers - Rust性能监控库
摘要
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));
}
}
您已经定义了三个探针,hello
、greeting
和 optional_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
包默认实际上并不追踪任何内容;它编译为无。要实际启用追踪,您需要一个受支持的平台。截至本文撰写之时,这意味着
- Linux 与 SystemTap(具有
force_static_stap
功能) - Linux 与 LTT-ng(具有
force_static_lttng
功能)
正在进行工作以支持
- Windows(使用 Windows 系统事件追踪 API)
- FreeBSD 和 macOS(使用 DTrace)
许可
除非另有说明,否则本项目的许可协议为以下之一
- Apache License,版本 2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选其一。
但是,以下 -sys
包具有与它们所封装的第三方代码相对应的许可证
tracers-libelf-sys
- 封装elfutils
库,因此许可协议为 LGPLv3tracers-libstapsdt-sys
- 封装libstapsdt
,因此许可协议为 MIT
贡献
除非您明确声明,否则您有意提交给 tracers
的任何贡献,根据 Apache-2.0 许可协议定义,应双重许可,如上所述,不附加任何额外的条款或条件。
发布
本节仅适用于维护者。
要发布新版本,必须首先发布依赖的crate。脚本bin/publish.sh
有助于自动化此过程,但仍相当手动。
发布流程
-
更新所有crate及其对其他
tracers
crate的依赖项的version
属性,以指向新目标版本。 -
确保所有依赖项都具有本地开发的路径依赖项和发布时的版本依赖项。这些必须与新发布的版本保持一致。
-
更新
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
依赖项
~6–15MB
~217K SLoC