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://www.mzph.cn/news/826928.shtml

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

相关文章

C++ 初识模板

目录 0.前言 1.泛型编程 2.函数模板 2.1概念 2.2格式 2.3原理 2.4函数模板的实例化 2.4.1隐式实例化 2.4.2显式实例化 2.5模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 4.结语 &#xff08;图像由AI生成&#xff09; 0.前言 在 C 中&a…

Unity3D 爆火的休闲益智游戏工程源码/3D资源 大合集

Unity3D休闲益智游戏工程源码大合集 一、关卡类游戏工程源码二、跑酷类游戏工程源码三、消除合成类游戏工程源码四、棋牌类游戏工程源码五、RPG(角色扮演)类游戏工程源码六、FPS&#xff08;射击&#xff09;类游戏工程源码十、Unity3D工艺仿真六、Unity游戏资源1、Unity3D 吃鸡…

Redis数据类型——String

Redis官网指令文档&#xff1a;Commands | Docs 前言 此处的String类型是针对Redis的Value的&#xff0c;因为Key的形式都是String&#xff0c;而Value则有哈性、列表、集合等形式。 众所周知&#xff0c;由于不同编码&#xff0c;经常会出现乱码的问题&#xff0c;但在Redi…

打造稳定安全的亚马逊测评环境:关键步骤与要点一览

亚马逊测评环境的搭建是一项既复杂又需要深入细致考虑的工作&#xff0c;它涉及多方面的技术配置和资源准备。以下是一些关键步骤和要点&#xff0c;帮助您更高效地构建测评环境。 一、资源筹备 1. 养号系统&#xff1a;选择稳定、高效的养号系统&#xff0c;确保能够模拟真实…

Linux系统-进程和计划任务管理

一.程序和进程 1.程序 保持在硬盘、光盘等介质中的可执行代码和数据文件中静态保存的代码 2.进程 在CPU及内存中运行的程序代码动态执行的代码父、子进程每个程序可以创建一个或多个进程 3.进程特征 动态性&#xff1a;进程是程序的一次执行过程&#xff0c;是临时的&…

决策树分类任务实战(python 代码详解)

目录 一、导入库、数据集、并划分训练集和测试集 二、参数调优 (一)第一种调参方法&#xff1a;for循环 (1)单参数优化 ①单参数优化(无K折交叉验证) ②单参数K折交叉验证 优化 (2)多参数优化 ①多参数优化(无K折交叉验证) 参数介绍&#xff1a; ②多参数K折交叉验证…

vulfocus靶场名称: apache-cve_2021_41773/apache-cve_2021_42013

Apache HTTP Server 2.4.49、2.4.50版本对路径规范化所做的更改中存在一个路径穿越漏洞&#xff0c;攻击者可利用该漏洞读取到Web目录外的其他文件&#xff0c;如系统配置文件、网站源码等&#xff0c;甚至在特定情况下&#xff0c;攻击者可构造恶意请求执行命令&#xff0c;控…

记录一下hive启动metestore服务时报错

【背景说明】 之前hadoop有问题&#xff0c;把hadoop和MySQL删了重装&#xff0c;hive没有动&#xff0c;然后启hive的metastore服务的时候&#xff0c;显示找不到metastore数据库 【报错】 Caused by: java.lang.reflect.InvocationTargetExceptionat sun.reflect.Generated…

【Java框架】SpringMVC(一)——基本的环境搭建及基本结构体系

目录 MVC模式视图(View)控制器(Controller)模型(Model)JSP Model1JSP Model2MVC的优点MVC的缺点 Spring MVC架构介绍特点 SpringMVC环境搭建(在前面Spring整合Mybatis的基础上)1.创建控制器Controller2.创建springmvc配置文件&#xff0c;并添加Controller的Bean3.web.xml中配置…

# 从浅入深 学习 SpringCloud 微服务架构(二)模拟微服务环境(1)

从浅入深 学习 SpringCloud 微服务架构&#xff08;二&#xff09;模拟微服务环境&#xff08;1&#xff09; 段子手168 1、打开 idea 创建父工程 创建 artifactId 名为 spring_cloud_demo 的 maven 工程。 --> idea --> File --> New --> Project --> Ma…

2024 CKA 最新 | 基础操作教程(十七)

题目内容 设置配置环境&#xff1a; [candidatenode-1] $ kubectl config use-context ek8s Task 将名为 node02 的 node 设置为不可用&#xff0c;并重新调度该 node 上所有运行的 pods。 考点相关内容分析 node 在 Kubernetes&#xff08;K8s&#xff09;中&#xff0c…

VASA-1:一键生成高质量视频,颠覆你的想象!

VASA-1&#xff1a;语音生成AI视频 前言 最近&#xff0c;微软公司公布了一项图生视频的 VASA-1 框架&#xff0c;该 AI 框架只需使用一张真人肖像照片和一段个人语音音频&#xff0c;就能够生成精确逼真的相对应文本的视频&#xff0c;而且可以使表情和面部动作表现的十分自然…

【数据结构】栈和队列(链表模拟队列)

学习本章节必须具备 单链表的前置知识&#xff0c; 建议提前学习&#xff1a;点击链接学习&#xff1a;单链表各种功能函数 细节 详解 本章节是学习用 单链表模拟队列 1. 单链表实现队列 思路如下 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数…

线程互斥及基于线程锁的抢票程序

我们实现一个简单的多线程抢票程序。 #include<iostream> #include<thread> #include<unistd.h> #include<functional> #include<vector> using namespace std; template<class T> using func_tfunction<void(T)>;//返回值为void,…

XUbuntu18.04 源码编译Qt4.5.3的过程

由于新公司很多旧的软件都是基于这个版本做的嵌入式开发。 所以想要自己搭一套基于Linux的非嵌入式开发环境&#xff0c;方便用来调试和编译代码。 这样就可以完成在linux下开发&#xff0c;然后直接嵌入式打包&#xff0c;涉及到界面的部分就不需要上机调试看问题了。 所以…

Axure引用ECharts图表 解决火狐浏览器出错

Axure原型添加Echarts图表&#xff0c;没耐心看文章的可以直接下载示例 Axure中使用ECharts图表示例 1. 打开Axure新建页面 2. 页面添加元件 元件类型随意&#xff0c;矩形、动态面板、热区、图片 甚至段落都可以3. 命名元件 随意命名&#xff0c;单个页面用到多个图表时名…

机器学习-11-基于多模态特征融合的图像文本检索

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中图像文本检索技术。此技术把自然语言处理和图像处理进行了融合。 参考 2024年&#xff08;第12届&#xff09;“泰迪杯”数据挖掘挑战赛 图像特征提取&#xff08;VGG和Resnet特征提取卷积过程详解&…

Facebook账号运营要用什么IP?

众所周知&#xff0c;Facebook封号大多数情况都是因为IP的原因。Facebook对于用户账号有严格的IP要求和限制&#xff0c;以维护平台的稳定性和安全性。在这种背景下&#xff0c;海外IP代理成为了一种有效的解决方案&#xff0c;帮助用户避免检测&#xff0c;更加快捷安全地进行…

学习笔记:Vue2中级篇

Vue2 学习笔记&#xff1a;Vue2基础篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2中级篇_ljtxy.love的博客-CSDN博客学习笔记&#xff1a;Vue2高级篇_ljtxy.love的博客-CSDN博客 Vue3 学习笔记&#xff1a;Vue3_ljtxy.love的博客&#xff09;-CSDN博客 文章目录 5.…

SpringCloud系列(5)--SpringCloud微服务工程公共部分提取

前言&#xff1a;在上一章节中我们创建了两个个SpringCloud工程&#xff0c;但在两个工程中分别存在着一些重复的部分&#xff0c;例如重复的实体类&#xff08;如图所示&#xff09;&#xff0c;这样会造成系统的冗余&#xff0c;所以我们需要把公共的类提取到一个工程里&…