Rust Tracing 入门

news2024/11/13 11:20:14

Tracing 是一个强大的工具,开发人员可以使用它来了解代码的行为、识别性能瓶颈和调试问题。 Rust 是一种以其性能和安全保证而闻名的语言,在它的世界中,跟踪在确保应用程序平稳高效运行方面发挥着至关重要的作用。

在本文中探讨Tracing 的概念、它在 Rust 生态系统中的重要性,以及如何利用它来改进 Rust 应用程序。无论您是希望深入研究性能优化的经验丰富的 Rustace 爱好者,还是有兴趣了解更多调试工具的语言新手,本指南都旨在为您提供在 Rust 中有效使用Tracing 所需的知识。

理解Tracing

在我们深入研究 Rust 中的Tracing细节之前,了解什么是Tracing以及为什么它是开发人员的重要工具非常重要。

在软件开发的背景下,Tracing是一种用于监视程序执行的方法。它涉及记录有关程序执行的信息,例如函数调用、变量值,甚至整个调用堆栈。然后可以分析这些信息(通常称为“Trace data”),以深入了解程序的行为。

Tracing在调试和性能优化中起着关键作用。通过提供程序执行的详细视图,Tracing使开发人员能够识别瓶颈、发现低效率并了解错误的根本原因。这使其成为提高代码性能和可靠性的宝贵工具。


接下来将探讨如何在 Rust 应用程序中使用Tracing。


在 Rust 中,Tracing是通过一个名为 tracing的crate 强大库来实现的。该包提供了一个框架,用于检测 Rust 程序以收集结构化的、基于事件的诊断信息。与传统日志记录不同, Tracing旨在了解系统中一个事件或一系列事件的上下文,使其成为诊断复杂系统的强大工具。


要开始在 Rust 中使用Tracing,您首先需要将 tracing 箱添加到您的项目中。这可以通过将以下行添加到您的 Cargo.toml 文件中来完成:

[dependencies]
tracing = "0.1"


将 tracing 包添加到您的项目后,您可以通过将以下行添加到主 Rust 文件来开始使用它:

use tracing::{info, trace, warn, error};


tracing 包为不同级别的诊断信息提供了多个宏,包括 info! 、 trace! 、 warn! 和 error!


在 Rust 项目中实现Tracing

现在我们已经在项目中添加了 tracing ,让我们深入了解如何在 Rust 项目中实现Tracing。

use tracing::{info, trace, warn, error};

fn main() {
    tracing::subscriber::set_global_default(
        tracing_subscriber::FmtSubscriber::new()
    ).expect("setting default subscriber failed");

    let number = 5;
    info!("The number is {}", number);

    let result = compute(number);
    info!("The result is {}", result);
}

fn compute(n: i32) -> i32 {
    trace!("Computing the value...");
    if n > 10 {
        warn!("The number is greater than 10");
    } else if n < 1 {
        error!("The number is less than 1");
    }
    n * 2
}


在上面的代码中,我们首先为跟踪事件设置一个默认订阅者。然后,我们使用 info! 宏在信息级别记录事件。在 compute 函数中,我们使用 trace! 、 warn! 和 error! 宏根据 n 。


这是一个简单的示例,但它说明了 tracing 包的基本用法。您可以根据需要向代码中添加更复杂的跟踪逻辑。


在下一节中,我们将讨论如何分析程序生成的跟踪数据。

分析Trace数据


在 Rust 应用程序中实现Tracing并生成trace数据后,下一步就是分析这些数据以深入了解应用程序的行为。
分析trace数据涉及检查记录的事件并使用它们来了解程序的执行流程。这可以帮助您识别模式、发现异常并了解应用程序的性能特征。
有多种工具可用于分析 Rust 中的trace数据。最流行的之一是 tracing-subscriber ,它提供了用于实现和配置订阅者的实用程序。


以下是如何使用 tracing-subscriber 分析trace数据的基本示例:

use tracing_subscriber::FmtSubscriber;

fn main() {
    let subscriber = FmtSubscriber::builder()
        .with_max_level(tracing::Level::TRACE)
        .finish();

    tracing::subscriber::set_global_default(subscriber)
        .expect("setting default subscriber failed");

    // Your application code goes here...
}


在此示例中,我们创建一个 FmtSubscriber 并将其设置为全局默认值。 with_max_level 函数用于设置订阅者将记录的事件的最大级别。在本例中,我们将记录所有事件直至 TRACE 级别。


收集跟踪数据后,您可以使用各种工具对其进行可视化和解释。这可以帮助您了解应用程序的性能特征、识别瓶颈并发现潜在问题。


在下一节中,我们将探索 Rust 中的一些高级跟踪技术。


先进的trace技术

随着您对 Rust 中的基本跟踪越来越熟悉,您可能会发现自己需要更高级的技术来诊断复杂问题或优化性能。 Rust 生态系统提供了多种用于高级跟踪的强大工具和库。


其中一个工具是 tracing-futures ,它是 tracing 包的扩展,它为使用诊断信息检测 Future 提供支持。这在异步 Rust 程序中特别有用,其中理解 Future 的行为对于调试和性能优化至关重要。


另一个有用的工具是 tracing-serde ,它提供了 Serializer 实现来序列化 tracing 的 Id 、 Metadata 、 Event 、 Record 和 Span 类型作为 Serde Serializable 类型。当您需要序列化跟踪数据以进行分析或传输时,这非常有用。

以下是如何在 Rust 项目中使用 tracing-futures 和 tracing-serde 的示例:

use tracing::{info, Instrument};
use tracing_futures::WithSubscriber;
use tracing_serde::AsSerde;

#[tokio::main]
async fn main() {
    let subscriber = tracing_subscriber::fmt()
        .json() // Output events as JSON
        .with_env_filter("my_crate=info") // Set log filter
        .finish();

    let _guard = tracing::subscriber::set_default(subscriber);

    let future = async {
        info!("This is an async block");
        // Your async code here...
    };

    future
        .instrument(tracing::info_span!("my_span"))
        .with_subscriber(subscriber)
        .await;

    let span = tracing::info_span!("my_span");
    println!("{}", serde_json::to_string(&span.as_serde()).unwrap());
}


在此示例中,我们首先创建一个以 JSON 形式输出事件的 tracing 订阅者。然后,我们创建一个异步块,并使用 tracing-futures 中的 instrument 函数对其进行测试。 with_subscriber 函数用于将订阅者附加到未来。最后,我们使用 tracing-serde 将跨度序列化为 JSON。


以上只是 Rust 中可用的高级trace用法的几个示例。当您继续探索 Rust 生态系统时,您会发现更多旨在帮助您充分利用跟踪的工具和库。🦀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1617386.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4K Video Downloader v4.30.0.5644 一款专业级的4K视频下载器

4K Video Downloader 中文破姐版 本站所有素材均来自于互联网&#xff0c;版权属原著所有&#xff0c;如有需要请购买正版。如有侵权&#xff0c;请联系我们立即删除。

Multiscale Vision Transformers

1、引言 论文链接&#xff1a;https://arxiv.org/abs/2104.11227 Haoqi Fan[1] 等通过在 ViT[2] 中引入多尺度特征层次结构&#xff0c;提出了一种用于视频和图像识别的 Multiscale Vision Transformers(MViT)[1]。在视频识别任务中&#xff0c;它优于依赖大规模外部预训练的视…

react 基础学习笔记一

1、jsx语法过程 jsx使用react构造组件&#xff0c;通过bable进行编译成js对象&#xff0c;在用ReactDom.render()渲染成DOM元素&#xff0c;最后再插入页面的过程。 2、创建组件 组件的定义&#xff1a;将公用的代码组装成一个独立的文件&#xff0c;保持代码独立性&#xff0…

【QT学习】9.绘图,三种贴图,贴图的转换

一。绘图的解释 Qt 中提供了强大的 2D 绘图系统&#xff0c;可以使用相同的 API 在屏幕和绘图设备上进行绘制&#xff0c;它主要基于QPainter、QPaintDevice 和 QPaintEngine 这三个类。 QPainter 用于执行绘图操作&#xff0c;其提供的 API 在 GUI 或 QImage、QOpenGLPaintDev…

使用VPN后,浏览器访问不了国内地址解决办法

winR输入regedit 打开注册表 找到路径 计算机\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings删除两个proxy代理

【Android】 四大组件详解之广播接收器、内容提供器

目录 前言广播机制简介系统广播动态注册实现监听网络变化静态注册实现开机自启动 自定义广播发送标准广播发送有序广播 本地广播 内容提供器简介运行时权限访问其他程序中的数据ContentResolver的基本用法读取系统联系人 创建自己的内容提供器创建内容提供器的步骤 跨程序数据共…

JavaSE:抽象

一&#xff0c;抽象是什么&#xff0c;抽象和面向对象有什么关系 抽象&#xff0c;个人理解&#xff0c;就是抽象的意思 我们都知道面向对象的四大特征&#xff1a;封装&#xff0c;继承&#xff0c;多态&#xff0c;抽象 为什么抽象是面向对象的特征之一&#xff0c;抽象和面…

Aigtek功率放大器电路的主要作用是什么

功率放大器是电子电路中的一个重要组成部分&#xff0c;它的主要作用是将输入信号的能量放大到更大的幅度&#xff0c;以便驱动负载或传输信号。功率放大器广泛应用于各种领域&#xff0c;如音频放大器、射频放大器、通信设备、无线电设备等。下面我们将详细介绍功率放大器电路…

【NOI】C++算法设计入门之深度优先搜索

文章目录 前言一、深度优先搜索1.引入2.概念3.迷宫问题中的DFS算法步骤4.特点5.时间、空间复杂度5.1 时间复杂度 (Time Complexity)5.2 空间复杂度 (Space Complexity)5.3 小结 二、例题讲解1.问题&#xff1a;1586 - 扫地机器人问题&#xff1a;1430 - 迷宫出口 三、总结四、感…

Rust 使用结构体组织相关联的数据

目录 结构体的定义和实例化 使用字段初始化简写语法使用结构体更新语法从其他实例创建实例使用没有命名字段的元组结构体来创建不同的类型没有任何字段的类单元结构体结构体示例程序 通过派生 trait 增加实用功能方法语法 定义方法带有更多参数的方法关联函数多个 impl 块本文有…

日志

日志服务管理 在现实生活中&#xff0c;记录日志也非常重要&#xff0c;比如银行的转账记录&#xff0c;飞机上的黑盒子&#xff0c;那么将系统和应用发生的事件记录至日志中&#xff0c;以助于排错和分析使用日志记录的内容包括&#xff1a; 历史事件&#xff1a;时间&#…

甘特图:如何制定一个有效的产品运营规划?

做好一个产品的运营规划是一个复杂且系统的过程&#xff0c;涉及多个方面和阶段。以下是一些关键步骤和考虑因素&#xff0c;帮助你制定一个有效的产品运营规划&#xff1a; 1、明确产品定位和目标用户&#xff1a; 确定产品的核心功能、特点和优势&#xff0c;明确产品在市…

向量的点积和叉积的几何意义

1. 点积 点积(dot product)&#xff0c;又称标量积&#xff08;scalar product&#xff09;。结果等于。 可用于 判断的是否垂直求投影长度求向量是抑制作用还是促进作用计算两个向量的夹角 2. 叉积 叉积(cross product)&#xff0c;又称为向量积(vector product)。模长等…

【C++类和对象】日期类的实现

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

【深度学习实战(21)】使用thop.profile计算模型的FLOPs和Params

一、 含义 FLOPs&#xff08;计算量&#xff09;&#xff1a;注意s小写&#xff0c;是floating point operations的缩写&#xff08;这里的小s则表示复数&#xff09;&#xff0c;表示浮点运算数&#xff0c;理解为计算量。可以用来衡量算法/模型的复杂度。 Params&#xff08…

Dubbo应用可观测性升级指南与踩坑记录

应用从dubbo-3.1.*升级到dubbo-*:3.2.*最新稳定版本&#xff0c;提升应用的可观测性和度量数据准确性。 1. dubbo版本发布说明(可不关注) dubbo版本发布 https://github.com/apache/dubbo/releases 【升级兼容性】3.1 升级到 3.2 2. 应用修改点 应用一般只需要升级dubbo-s…

第53篇:算法的硬件实现<四>

Q&#xff1a;本期我们在DE2-115开发板上实现二进制搜索算法电路&#xff0c;查找数据A在数组中的位置。 A&#xff1a;使用SW[9]设定开始查找信号&#xff0c;数据A由SW[7:0]设定&#xff0c;KEY[0]设定为复位信号&#xff0c;板载50MHz时钟作为电路的时钟输入&#xff0c;确…

C语言—深度剖析函数指针,函数指针数组

我们先来看一段代码 #include <stdio.h> void test() {printf("hehe\n"); } int main() {printf("%p\n", test);printf("%p\n", &test);return 0; }输出的是两个地址&#xff0c;这两个地址是 test 函数的地址。 那我们的函数的地址…

【行为型模型】迭代器模式

一、迭代器模式概述 迭代器模式定义&#xff1a;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露其内部的表示。把游走的任务放在送代器上&#xff0c;而不是聚合上。这样简化了聚含的接口和实现,也让责任各得其所。(对象行为型) 迭代器模式的优缺点&…

第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队

关联比赛: 第二届阿里巴巴大数据智能云上编程大赛-智联招聘人岗智能匹配 查看更多内容&#xff0c;欢迎访问天池技术圈官方地址&#xff1a;第二届阿里巴巴大数据智能云上编程大赛亚军比赛攻略_北方的郎队_天池技术圈-阿里云天池