Rust Tracing 入门

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://xiahunao.cn/news/2978761.html

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

相关文章

什么?双核A7双网口核心板只要49?

“性价比之王” 触觉智能IDO-SOM2D0X系列基于SigmaStar SSD201/202 SoC的超小SOM模组&#xff0c;双核A7 1.2GHz主频&#xff0c;1080P视频解码&#xff0c;支持MIPI/RGB显示接口&#xff0c;支持双以太网&#xff0c;支持SDIO/USB/SPI/I2C/UART/DMIC/I2S&#xff0c;集成音频C…

2016年新华三杯复赛实验试题

2016年新华三杯复赛实验试题 拓扑图 配置需求 考生根据以下配置需求在 HCL 中的设备上进行相关配置。 以太网接口配置 将 S1、S2 的以太网接口 G1/0/1 至 G1/0/16 的模式用命令 combo enable copper 激活为电口。 虚拟局域网 为了减少广播&#xff0c;需要规划并配置 VLA…

数据结构(Wrong Question)

一、绪论 1.1 数据结构的基本概念 D 因为抽象数据类型&#xff08;ADT&#xff09;描述了数据的逻辑结构和抽象运算&#xff0c;通常用&#xff08;数据对象&#xff0c;数据对象&#xff0c;基本操作集&#xff09;这样的三元组来表示&#xff0c;从而可构成一个完整的数据结…

【圆桌论坛】个人作为嘉宾参与问答环节的总结,Create 2024百度AI开发者大会之AI智能体开发与应用论坛

目录 ⭐前言⭐讨论话题✨本质和价值✨端侧部署✨应用商业模式✨商业模式 ⭐主题总结⭐有趣分享 ⭐前言 首先&#xff0c;非常荣幸和开心作为开发者和创业者代表参加百度Create AI大会分论坛圆桌论坛的问答环节。 在分论坛活动开始前&#xff0c;参加了文心智能体平台&#xff…

Tomcat启动闪退疑难排解全攻略:资深技术视角详解(详细)

Tomcat 启动闪退问题是在尝试启动Apache Tomcat服务器时&#xff0c;遇到的一种情况&#xff0c;其中服务器进程无法正常运行并立即退出。这个问题可能是由于多种原因造成的&#xff0c;包括配置错误、端口冲突、类加载问题等。作为一个资深技术人员&#xff0c;解决这类问题需…

sdwan最低需要多少带宽?SD-WAN带宽配置及应用分析

SD-WAN企业网络连接技术(软件定义广域网)带来更高效、更可靠的网络性能。合理配置带宽对于企业申请SD-WAN线路至关重要。 一、SD-WAN最低带宽要求 SD-WAN的带宽需求与企业的具体情况有关&#xff0c;但一般推荐的最低带宽需求为2Mbps。然而&#xff0c;这只是一个起点&#x…

软考 系统架构设计师系列知识点之大数据设计理论与实践(13)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之大数据设计理论与实践&#xff08;12&#xff09; 所属章节&#xff1a; 第19章. 大数据架构设计理论与实践 第4节 Kappa架构 19.4.2 Kappa架构介绍 Kappa架构由Jay Kreps提出&#xff08;Lambda由Storm之父Nayhan M…

STM32F407,429参考手册(中文)

发布一个适用STM32F405XX、STM32F407XX、STM32F415XX、STM32F417XX、STM32F427XX、STM32F437XX的中文数据手册&#xff0c;具体内容见下图&#xff1a; 点击下载&#xff08;提取码&#xff1a;spnn&#xff09; 链接: https://pan.baidu.com/s/1zqjKFdSV8PnHAHWLYPGyUA 提取码…

Linux进程概念(四):进程优先级 环境变量

目录 进程优先级 学前补充 命令行参数 环境变量 环境变量$PATH 整体理解环境变量 environ指针 获取环境变量的三种方式 内建指令 证明内建指令的存在 进程优先级 基本概念&#xff1a;指定进程获取某种资源的先后顺序 linux的优先级是进程控制块task_struct中的…

数据库管理-第173期 OceanBase一体化Plus多模融合(20240422)

数据库管理173期 2024-04-22 数据库管理-第173期 OceanBase一体化Plus多模融合&#xff08;20240422&#xff09;1 架构简化2 不止融合2.1 行列混存2.2 多维使用2.3 多模JOIN 3 展望 数据库管理-第173期 OceanBase一体化Plus多模融合&#xff08;20240422&#xff09; 作者&…

[部分WP]DASCTF X GFCTF 2024 WEB

Web EasySignin 考点&#xff1a; 越权SSRF gopher协议去攻击mysql 通过注册任意用户修改admin密码 登入然后点击康好看图片 抓包 ?url 典型SSRF漏洞 尝试file读取/etc/passwd无果 尝试gopher协议去攻击mysql 利用工具gopherus 盲猜数据库用户为root 然后再次次url编码得到…

Day13.一刷数据结构算法(C语言版) 102二叉树的层序遍历;226翻转二叉树;101对称二叉树

一.102二叉树的层序遍历 二叉树的层序遍历力扣题目 1.思路分析 这道题我没有什么好的思路&#xff0c;而且力扣给的函数形式看得有点懵&#xff0c;所以我找到一个相对好理解的题解&#xff0c;具体可以参考下方链接。 力扣题解 说明&#xff1a; 返回值&#xff1a;可…

全国832个贫困县名单及精准扶贫脱贫(摘帽名单)数据(2016-2020.11)

01、数据简介 自党的十八大以来&#xff0c;我国脱贫攻坚战取得了举世瞩目的伟大胜利。经过全党全国各族人民的共同努力&#xff0c;现行标准下9899万农村贫困人口全部脱贫&#xff0c;832个贫困县全部摘帽&#xff0c;12.8万个贫困村全部出列&#xff0c;区域性整体贫困得到解…

BFS解决八数码问题-java

本文主要通过BFS广度优先搜索来解决八数码问题。 文章目录 前言 一、八数码 二、算法思路 1.思路模拟 2.实现思路 三、代码 1.代码如下&#xff1a; 2.读入数据 3.代码运行结果 总结 前言 本文主要通过BFS广度优先搜索来解决八数码问题。 提示&#xff1a;以下是本篇文章正文内…

7.2K star!一个完全免费,可以本地部署的 AI 搜索聚合器。新手可尝试

原文链接&#xff1a;7.2K star&#xff01;一个完全免费&#xff0c;可以本地部署的 AI 搜索聚合器。新手可尝试 ChatGPT 刚上线的时候我用的很少&#xff0c;还是习惯用 Google。主要还是因为不信任&#xff0c;怕它对我胡说八道。 慢慢的&#xff0c;也没有一个明确的时间…

工业4.0!智能工厂的智能物流系统应用

agv 智能物流系统通常指连接生产设备之间、车间之间以及车间与仓库之间的物流搬运系统。 为实现智能物流系统搭建&#xff0c;应该在尊重原有印刷生产工艺与合理生产布局基础上&#xff0c;通过应用新的生产智能化装备来实现协调车间的整体调度。 agv智能工厂 在现代化的物料搬…

java后端项目:视积分抽奖平台

一、项目背景: 本次抽奖系统实现是在视频中内置一个线上活动抽奖系统,奖品是在一个时间段区间内均匀发布,用户可以在这个时间段内参与抽奖。 二、项目架构 活动抽奖平台采用微服务架构来完成,在功能上实现拆分为用户、网关、以及抽奖微服务,其中用户、网关是后台项目通…

智能家居—ESP32开发环境搭建

相关文章 毕业设计——基于ESP32的智能家居系统(语音识别、APP控制) 智能家居—ESP32开发环境搭建 一、下载安装二、验证三、资料获取 一、下载安装 下载安装 vscode 安装插件 创建工程 二、验证 写一个简单的函数来验证一下功能 void setup() {// put your setup c…

常见UI组件(二)

一、文本输入 1.1 概述 TextInput为文本输入组件&#xff0c;用于接收用户输入的文本内容 1.2 参数 Entry Component struct Index {build() {Column({space : 50}) {TextInput({placeholder:请输入用户名}).width(70%)TextInput({text:当前内容}).width(70%)}.width(100%).…

光学雨量计:高精度测量降水量的理想解决方案

光学雨量计&#xff1a;高精度测量降水量的理想解决方案 河北稳控科技光学雨量计是一种高精度测量降水量的理想解决方案。它利用光学原理&#xff0c;通过光束的衰减来测量降雨强度和累积降水量。相比传统的雨量计&#xff0c;光学雨量计具有更高的精度和可靠性&#xff0c;成…