2 个不稳定版本
0.2.0 | 2021 年 12 月 17 日 |
---|---|
0.1.0 | 2020 年 7 月 12 日 |
在 性能分析 中排名 #86
每月下载量 122,191
用于 18 个包 (14 个直接使用)
1MB
15K SLoC
tracing-flame
用于生成折叠堆栈跟踪以生成火焰图和火焰图的 [跟踪] Layer
概述
tracing
是一个用于对 Rust 程序进行打点的框架,用于收集范围、结构化和异步感知的诊断。 tracing-flame
提供了用于消耗 tracing
打点的辅助工具,这些打点可以后来可视化为火焰图/火焰图。火焰图/火焰图对于识别应用程序中的性能瓶颈很有用。有关更多详细信息,请参阅 Brendan Gregg 的关于火焰图的 文章。
编译器支持:需要 rustc
1.42+
使用方法
此包旨在分两步使用
- 使用
FlameLayer
捕获进入和退出跨度的文本表示形式。 - 将文本表示形式输入到
inferno-flamegraph
以生成火焰图或火焰图。
注意:当使用带缓冲的写入器作为 FlameLayer
的写入器时,在将数据传递到 inferno-flamegraph
之前,必须确保缓冲区已被刷新。有关如何刷新 FlameLayer
的内部写入器的详细信息,请参阅 FlushGuard
的文档。
层设置
use std::{fs::File, io::BufWriter};
use tracing_flame::FlameLayer;
use tracing_subscriber::{registry::Registry, prelude::*, fmt};
fn setup_global_subscriber() -> impl Drop {
let fmt_layer = fmt::Layer::default();
let (flame_layer, _guard) = FlameLayer::with_file("./tracing.folded").unwrap();
tracing_subscriber::registry()
.with(fmt_layer)
.with(flame_layer)
.init().
_guard
}
// your code here ..
作为替代方案,您可以提供任何实现了 std::io::Write
的类型,并将其提供给 FlameLayer::new
。
生成图像
要将火焰图的文本表示转换为视觉表示,首先安装 inferno
cargo install inferno
然后,将 FlameLayer
创建的文件传递给 inferno-flamegraph
# flamegraph
cat tracing.folded | inferno-flamegraph > tracing-flamegraph.svg
# flamechart
cat tracing.folded | inferno-flamegraph --flamechart > tracing-flamechart.svg
flamegraph
和 flamechart
之间的区别
默认情况下,inferno-flamegraph
创建火焰图。火焰图通过合并相同的堆栈帧并根据帧名称进行排序来操作。
这种行为对于多线程程序和长时间运行的程序很好,因为这些程序中相同的帧会频繁发生,持续时间短,因为它减少了图中的噪音,并使读者更好地了解应用程序每个部分的总体时间。
但是,有时希望保留由 tracing-flame
发射的事件的 确切 排序,以便清楚地了解每个跨度相对于其他跨度何时进入,并获取程序执行的准确视觉跟踪。这种表示最好使用 火焰图 创建,它 不 对相同的堆栈帧进行排序或合并。
支持的 Rust 版本
Tracing 是针对最新的稳定版本来构建的。最低支持版本是 1.42。当前 Tracing 版本不保证在低于最低支持版本的 Rust 版本上构建。
Tracing 遵循 Tokio 项目中其余部分的编译器支持策略。当前稳定 Rust 编译器和之前的三个小版本将始终得到支持。例如,如果当前稳定编译器版本是 1.45,则最低支持版本不会超过 1.42,即三个小版本之前。只要这样做符合此策略,增加最低支持编译器版本不被视为 semver 破坏性更改。
许可证
此项目根据 MIT 许可证 许可。
贡献
除非您明确声明,否则您提交给 Tracing 的任何贡献,都应按 MIT 许可,不附加任何额外条款或条件。
依赖关系
~555KB