范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Rust语言的全链路追踪库tracing

  在一个应用程序或库的开发过程中,除了其本身的逻辑以外,开发人员还需要做很多额外的工作,以保证编写的代码可以正确的运行,或者在出错时可以快速定位到错误的位置以及原因,这就需要引入一些额外的工具,trace 就是其中特别好用的一种,下文我将会简单介绍 trace,并以 Rust 为例,演示 trace 在 Rust 中的使用方法。 可观测性
  Logs、Metrics 和 Traces 并称为可观测性三大支柱 ,通过分析它们输出的数据,开发人员能够更好的观测到系统的运行状况,更快的定位问题,从而提高系统的可靠性。
  日志(Logs)
  日志作为最常用的可观测性数据源之一,相信多数开发者都比较熟悉。其本质上就是一种带有时间戳的离散事件记录,通常用于记录系统的运行状态,日志的使用十分简单,只需要在代码中需要报告信息的点添加一行代码,就可以将这些信息输出到控制台或文件中,但是日志也有很大的缺点,它的输出是离散的,这意味着在记录的时候,无法将日志信息相互关联,也无法知道日志信息的上下文,尤其是在多线程的环境下,最终输出的信息比较混乱,不便于检索和分析。 指标(Metrics)
  指标是一种定量衡量,例如平均值、比率和百分比等。其值始终为数字而非文本,可以通过数学方法统计和分析,其主要用于描述系统运行状态的数据,比如 CPU 的使用率、内存的使用率、磁盘的使用率等,这些数据可以用来监控系统的运行状态,也可以用来预警。 追踪(Traces)
  追踪是一种用于记录系统中一次请求的完整生命周期的数据,它可以记录下一个请求从开始到结束的所有信息,包括请求的发起者、接收者、请求的路径、请求的状态、请求的耗时、请求的错误信息等,这些信息可以用来分析系统的性能瓶颈,也可以用来分析系统的错误。追踪本质上也是一种日志,他与日志的数据结构十分相似,但是它能够提供比日志更丰富的信息。特别是在分布式系统中,追踪能够跨越多个服务,汇总出一次请求的完整信息,让开发人员能够更方便的找到系统中的问题。
  Rust 中的 Trace
  Rust 社区中比较有名的 trace 实现有三个: tracing  由 tokio 团队维护,目前使用最广泛,生态也比较完善 rustracing  使用人数相对较少 minitrace tikv  团队打造,性能最好
  接下来就以 tracing 为例,介绍一下 trace 的核心概念以及使用方法 : Span
  Span 可以说是 trace 中最关键的概念之一,它表示的是一个过程,也就是一段时间内发生的所有事件的集合,其数据结构中包含着 Span 的开始时间和结束时间,在分析数据是可以借助工具直观的看到某次请求或操作的耗时情况。在同一个 trace 流程中的所有 Span 都共享这相同的 Trace Id ,每个 Span 也有着自己的 Span Id,并且 Span 还支持嵌套,嵌套的 Span 中也会保存着相应的父子关系,最终可以靠这些信息,将请求的完整生命周期串联起来,并且不会与相同时间段内的其他请求产生干扰。 use tracing::{span, Level};  fn main() {     let span = span!(Level::INFO, "span");     let _enter = span.enter();     // enter 后进入该 span 的上下文     // 可以记录信息到 span 中 } // 离开作用域后,_enter 被 drop,对应的 span 在此结束
  以上代码是创建并使用一个 Span 最简单的方式,除此以外还有几种不同的方式 #[instrument] // tracing 会为当前函数自动创建 span ,该 span 名与函数相同,并且整个函数都在该 span 的上下文内 fn do_something() {     // some event     let span = span!(Level::INFO, "external function");     span.in_scope(|| some_external_function()); //对于无法添加 #[instrument] 的外部函数,也可以使用 in_scope 方法让其在 span 的上下文中执行 }  #[instrument] // 此方法同样对异步函数适用 async fn do_something_async() {     let future = async {         // some async code     };     let span = span!(Level::INFO, "future");     future.instrument(span).await; // 也可以在 future .await 之前将 span 附加给 future }  // async 代码中要避免以下情况 async fn some_async_code() {     let span = span!(Level::INFO, "span");     let _enter = span.enter();     // 此处进入 span 的上下文,直到 _enter 被 drop 后才会结束     async_fn().await; // .await 时,task 可能会让出当前线程的执行权,而此时 _enter 还没有 drop,因此可能会错误的记录到其他 task 的 enent. }   Event
  Event 与日志类似,表示的是某一个时间点发生的事件,但与日志不同的是,Event 可以将信息记录到 Span 的上下文中,这样在分析数据时,可以直接查看 Span 中发生的所有事件。 use tracing::{event, info, span, Level};  fn main() {     event!(Level::INFO, "event"); // 在 span 的上下文之外记录一个 Leval 为 INFO 的 event      let span = span!(Level::INFO, "span");     let _enter = span.enter();      event!(Level::INFO, "event"); // 在 span 的上下文内记录 event      info!("something with info level"); // 也可以使用和 log 相同的形式记录 event } Collector
  以上的示例不会有任何可见的输出,因为我们还没有配置 Collector,tracing 中所有的 Span 和 Event 都是通过 Collector 来收集的,Collector 会将 Span 和 Event 以一定的格式输出到指定的地方,比如 stdout、stderr、文件、网络等。tracing-subscriber 的 fmt 模块提供了一个 Collector ,可以方便的输出事件信息。 use tracing::info; use tracing_subscriber;  fn main() {     // 初始化全局 Collector     tracing_subscriber::fmt::init();      info!("Hello, world!"); }
  运行上面这段代码,可以在终端中看到一条 INFO 级别的事件,如果需要将 Trace 信息发送到其他地方,就要用到其他的 Collector 实现,比如 tracing-appender 这个 crate,可以将 Trace 信息输出到文件中。 在 Rust 中使用
  tracing 的完整示例 use std::{thread::sleep, time::Duration};  use tracing::{debug, info, info_span, instrument};  #[instrument] fn expensive_work(secs: u64) {     debug!("doing expensive work");     sleep(Duration::from_secs(secs));     debug!("done with expensive work"); }  fn main() {     tracing_subscriber::fmt()         // enable everything         .with_max_level(tracing::Level::TRACE)         // sets this to be the default, global collector for this application.         .init();     let span = info_span!("root");     let _enter = span.enter();      info!("some info in the root span");      expensive_work(1); }
  运行以上代码将会的到以下输出 2022-12-01T02:50:59.425475Z  INFO root: tracing_example: some info in the root span 2022-12-01T02:50:59.425518Z DEBUG root:expensive_work{secs=1}: tracing_example: doing expensive work 2022-12-01T02:51:00.425722Z DEBUG root:expensive_work{secs=1}: tracing_example: done with expensive work
  每个事件都已相同的格式输出,此输出模式下,与 log 的输出十分相似,
  但 tracing 输出的内容多出了 Span 相关的信息。由 instrument 生成的 Span 还自动添加了函数的参数信息。下面介绍的 OpenTelemetry 和 Jaeger,还可以让我们更加直观的查看 Span 之间的时间关系。 Trace 的标准化
  想要让 Trace 跨越多个服务,集成到多种不同的语言,那就必须要规定大家相互调用的规范,要遵守一套相同的协议,才能让 Trace 的数据在不同的系统中都能够正常传递,Trace 早期诞生了两种规范,分别是 OpenTracing 和 OpenCensus,后来为了规范的统一,OpenTracing 和 OpenCensus 合并成了 OpenTelemetry,现在已经成为了 Trace 的事实标准。OpenTelemetry 提供了不同语言的 SDK,可以方便的集成到不同的系统中,对于 Rust ,它提供了一系列相关的 crate 用于集成。tracing 也提供了 tracing-OpenTelemetry 用来将其收集到的信息发送到兼容 OpenTelemetry 的分布式追踪系统中。 Trace 数据的可视化分析
  Jaeger 是受到 Dapper 和 OpenZipkin 启发的开源分布式跟踪系统,由 Uber 开发,现已捐赠给 CNCF。Jaeger 通过收集 Trace 数据,将其可视化展示,方便开发者分析系统的问题。下图为 Jaeger 部署的示例。
  要将 Trace 数据发送给 Jaeger,需要在我们的应用中添加 jaeger-client 。OpenTelemetry 提供的 crate 中,就包括了响应的 jaeger-clinet 实现: opentelemetry-jaeger。它会将 Span 信息以 UDP 包的形式发送到 jaeger-agent,jaeger-agent 将一段时间内的数据打包分批发送到 jaeger-collector,再由 jaeger-collector 把数据存入数据库内,我们在 jaeger 的 UI 中就可以查询到这些数据。
  OpenTelemetry 的仓库中也提供了以上流程的示例,我们可以直接运行这个示例,然后在 jaeger 的前端我们就可以得到下图的内容:
  有了这些数据,开发人员就能够快速定位到请求的主要耗时部分,也能够通过其中包含的事件获取到请求内的消息记录。
  总结
  对于大多数同步程序,用 Log 就能够满足需求,并且使用起来也足够简单,但是一旦涉及到异步程序或其他的一些复杂情况,Log 就会变得不那么好用了,一段时间内的 Log 信息可能来自于多个不同的处理流程,难以快速方便的获取我们需要的信息,而 Trace 则能够很好的解决这个问题。
  推荐阅读
  DatenLord Rust程序性能分析

76人4换2新方案!放弃马克西哈里斯,费城豪赌三巨头争冠?北京时间8月21日,NBA自由市场依然交易流言不断,这次美媒又给76人列出一笔4换2的交易方案,并没有去追求杜兰特,这次目标变成了爵士队的米切尔。只不过这笔交易,很多球迷都不看好,互联网凉凉,分众考试不及格风险提示本文充满作者个人的偏见和主观判断,不作为投资建议,请读者慎重参考。期中考试结束了,大家的考卷纷纷上交。相比交出耀眼成绩单的通威,分众这次期中考试成绩不太理想,作为从美国转学中国已经有鸿蒙系统了,为什么不统一所有国产手机系统?两年前,国内还是苹果和安卓的天下,而这两个系统也都是美国企业,别说中国,全世界的手机用的都是美国系统。记得当时华为也不敢公开推广自己的鸿蒙系统,虚虚实实的说B计划,主要还是担心美国北极750座冰川在消失,海平面或上升5米,对我国会有什么影响?受到今年北半球的极端高温影响,北极的升温速度也越来越快,根据芬兰气象研究所的数据过去40年时间里,北极的变暖速度,是世界平均水平的4倍,这也意味着,北极冰川正在加速消失。例如在欧洲柳传志一手好牌打得稀烂,联想的结局早已注定柳传志一手好牌打得稀烂,联想的结局早已注定。今天,我们不谈联想的国有资产流失,也不谈柳传志导致国产芯片落后几十年,而是要来聊一聊三件更残酷的事实。这三件事啊,无论是哪个中国人,听完越跌越贵,快逃?月17日,腾讯公布了2022年中报。港股那个报表看得实在令人头大,繁体字自然是一个方面,更恼火的主要在于绕口的专业词汇颇具差异化的会计准则,以及相对自由的披露尺度等等。但没办法,谁知名开发商代建项目多次起争议被指质量下滑,当包工头是好生意吗?本文来源时代周报作者梁争誉忻奇琪胡天祥房地产投拓口招聘寒冬里,许锋捕捉到一丝暖风。许锋在一家地方型房企负责城市更新工作,由于城市更新投入成本大,他所在的房企开始裁撤相关部门。许锋的日企起诉宝钢,索赔金额暴涨到600亿,中企要求对证对方却拒绝据界面新闻报道,日前中国最大的钢铁联合企业宝钢集团发布公告称,已经陆续收到竞争对手日本制铁起诉侵权的三起案件法院传票等相关材料,该案件将在日本东京的一家地方法院进行开庭审理。据悉,个人账户进账多少才会被查呢?个人账户进账多少钱才会被银行盯上如果是小金额的话比如是几百几千的这种情况一般不会,除非你的交易本身就有问题比如说做了什么违法的交易那不管金额大小都会被查至于大额交易个人的银行卡单笔总量4845万吨!俄连续3个月向中国输送廉价石油,西方只能高价买由于俄乌冲突的影响,导致全球能源价格疯涨,特别是俄罗斯还是一个能源出口大国,西方多国对俄罗斯的能源都很依赖而由于这些国家对俄罗斯进行了制裁,这就导致无法从俄罗斯获取足够的能源来维持拆解首份国有大行2022年中期成绩单邮储银行营收净利双增,还有这些重点值得关注中报季重头戏来了,邮储银行率先披露首家国有大行2022年上半年成绩单。8月22日,根据邮储银行发布的2022年半年度报告数据显示,今年上半年,邮储银行营收净利实现双增,AUM(管理最新战报!女乒奥运亚军爆冷出局,2大本土90后决赛会师2022年的乒乓球欧锦赛女单半决赛结束,2016年里约奥运会的女团亚军成员单晓娜意外以14输给了队友米特汉姆,也让24年历史得到了改写,女单决赛成为了1998年以来首次无华裔女将的傅博郑智更多的是给球员鼓励韦世豪一直具备很强的能力直播吧8月21日讯在今天晚上结束的中超联赛第14轮比赛中,广州队41战胜了深足。赛后,广州队助理教练傅博出席了新闻发布会。点评比赛傅博比赛大家看到了,赢球很高兴,还是很感谢队员。年热搜榜国米宣布不卖什克?有拉莫斯在,巴黎并不着急对于财政问题严峻的国际米兰来说,最理想的情况莫过于巴黎圣日耳曼为什克里尼亚尔掏出一笔让人无法拒绝的巨款。如果这桩交易能在6月30日上赛季财年结束前完成,那就更完美。然而双方从6月份定了,延至2023年底想买车的朋友看过来新能源汽车免征车购税政策将延至2023年年底8月18日召开的国务院常务会议决定,将已两次延期实施今年底到期的免征新能源汽车购置税政策,再延期实施至明年底,预计新增印度对中国手机的做法,已让苹果和三星后悔迁移生产线至当地众所周知的是目前印度对中国手机有多种举动,这不仅对中国手机企业造成了影响,还对将生产线迁移至印度的苹果和三星造成了影响,估计此刻的苹果和三星已后悔将生产线迁移至当地了。对于印度来说发力中国市场!三星手机重返中国制造,华为小米如何接招?三星在2019年19月关闭了在中国的最后一家手机工厂惠州工厂,之后的三星手机均在其他国家和地区生产三星曾是中国市场最大的手机厂商,但是随着国产手机品牌的崛起,三星迅速被超越,目前已英特尔中国区总裁一个中国人口口声声蔑视中国本土公司,太扎心了英特尔是美国一家主要以研制CPU处理器的公司,是全球最大的个人计算机零件和CPU制造商,它成立于1968年,具有50年产品创新和市场领导的历史。英特尔中国区董事长并不是吹嘘,中国目单身男生不怕愁,国产女机器人,网友比娶媳妇好多了我们国家是一个男女比例失衡的国家,男性人口要比女性人口的数量多出三千多万,大家不要以为这只是一组数字,其实这代表着背后的三千多万个家庭。(此处已添加小程序,请到今日头条客户端查看)高质量短句,快来看看吧1。有球打了,我们好好打球,没球打了,我们好好生活,生活不只有篮球。2。你做不完的题总有人能做完,你考不过的试总有人能考过,所以你上不了的大学总有人能上,你想要的生活总有人能过上。惊艳一生的文案1。hr我们相爱一生,一生还是太短。2。hr太阳温暖早起的人,月亮陪伴熬夜的人。3。hr每一段时光,只要放在心上,就是地久天长。4。hr生命不长不短刚刚够用来好好看看这个世界5。h为何要沉迷于过去漫漫人生路,经历风吹雨打,荆棘丛生后,内心定会留下一些痛苦的回忆。有的人自暴自弃,止步不前,有的人浴火重生,人生终究灿烂辉煌。所以人要总结昨日的失误,期待明日方舟。万万不可对往日的
什么?象棋和围棋都存在不败策略?象棋和围棋都是中华文明的瑰宝,更是训练和测试思维能力的方式之一,那些在这两种棋类上取得成就的人们,其智商普遍得到公众认可。但是,我们是否想过,在这两种棋类上是否存在必胜或者平局的策郭艾伦3698林书豪空砍17分雅尼斯遭驱逐辽宁力克北京迎来五连胜北京时间1月7日1935,20212022赛季CBA常规赛第19轮一场焦点战展开争夺,辽宁队10395战胜北京队迎来五连胜,报了首回合负于对手的一箭之仇。郭艾伦技术统计辽宁队郭艾伦辽宁下起三分雨郭艾伦6投5中丛明晨4中4北京主帅怒骂裁判被罚出场北京时间2022年1月7日,CBA常规赛,辽宁本钢以10395轻取北京首钢,报了半个月前的一箭之仇,辽宁队夺得5连胜继续保持领跑CBA积分榜。两队得分情况辽宁韩德君5分11板2助李北京冬奥会特许商品文君瓶发布1月7日,北京2022年冬奥会和冬残奥会特许商品文君瓶发布会在北京首钢园举行。北京冬奥组委市场开发部副部长顾灏宁清华大学美术学院院长鲁晓波故宫博物院原副院长陈丽华德化县委副书记黄俊冬奥会雪车雪橇项目运动员选拔办法公布国家体育总局冬季运动管理中心近日公布了北京冬奥会雪橇雪车钢架雪车项目运动员参赛资格选拔办法,对运动员选拔条件与范围选拔标准进行了明确。选拔办法显示,雪橇项目运动员选拔范围为2006北京冬奥会奖牌,有玄机北京冬奥越来越近了!这是一篇关于奖牌火炬图标颁奖仪式的硬核文章记者近日专访了北京冬奥组委文化活动部部长陈宁关于奖牌,关于火炬关于体育图标,关于颁奖她给大家透露了一系列细节精彩纷呈,国足名单公布,最强11人不惧日本国足最终名单公布,预示着备战工作全面展开。1月27日,国足将迎战日本,此战若败,国足将彻底失去卡塔尔世界杯晋级希望。李霄鹏若用这套阵容首发,打日本值得期待!阵型451守门员王大雷王好的游戏懂得细致打磨!将快乐延迟才是高级快乐九阴真经3D在武侠手游中是当之无愧的佼佼者,是众多喜好武侠的玩家最优先的选择,原因非常简单,其一是因为武侠情怀浓厚,其次是因为打斗模式够畅快!你说!我们玩个武侠不就是为了一个爽字吗Epic喜加三重磅福利!古墓丽影三部曲免费领取,原价468元IT之家12月31日消息,从12月17日开始,Epic将连续15天送15款不同的游戏。今天是最后一天,赠送原价468元的古墓丽影新三部曲。古墓丽影新三部曲包含古墓丽影9年度版原价6年终奖发几十个月工资!这些企业去年富得流油中新财经1月7日电(记者谢艺观)近日,一则长荣海运年终奖发40个月月薪的消息,被人直呼太壕。如此壕的背后,得益于长荣海运傲人的业绩。随着2021年国际海运价格坐上火箭,海运企业赚得实锤了?官方定调联想4大罪,这次真翻车了在去年下半年,著名的up主司马南对联想发出了质疑,这场讨论一直延续到了今年,而联想并未对其做出回应。有很多人怀疑司马南为了获取流量碰瓷联想集团,然而近期的一系列事件表明联想集团或许药膳馆古方神仙粥,风寒感冒好膳补神仙粥材料糯米100150克,带须鲜葱头(到葱白部分)78根,生姜5片,陈醋适量。做法(1)将糯米生姜洗净,加适量开水到砂锅中,水开后加入糯米生姜煮2030分钟。(2)加入葱白,煮投篮投的准,篮板抢的稳,大哥我们排队给你道歉来了一当看到广东开局状态的时候,在心里已经隐隐觉得,这场比赛广东有戏。首先,在进攻端看上去没有那么疲惫了,不像前几场比赛,一开场就感觉大家好像刚刚才打完一场比赛一样,所有人无论是表情还全明星首轮票数出炉,詹姆斯恐无缘票王,克莱领先布克3万票全明星首轮票数已经出炉,跟以往一样球迷投票占重50,媒体和球员各占25,然后根据投票1月28日公布首发名单,2月4日公布全明星替补名单。西部后场库里2584623,东契奇78769羽毛球的英文名为什么叫badminton?羽毛球又起源于哪里呢?羽毛球作为一项大众十分喜爱的体育运动,深受咱们国人的喜爱,同时在国际上也是一项非常受欢迎的体育运动。但不知道广大球友们有没有注意过,羽毛球的英文名称叫做badminton,这是一个师胜杰病逝4年,妻子宋艳独守故居,他们之间的感情令人泪目2018年7月在一档节目中,师胜杰十分动情地说我对早日重返舞台充满了信心,我把我的舞台计划,计划到80岁,我只能用我的艺术和实际行动来回报支持相声艺术的观众。但令人遗憾的是,师胜杰屡获大奖,国产手游露脸了!一年就成了最受欧美玩家关注的作品2021年马上就将结束,各种App网站都相继推出了年度总结,来帮助大家回顾在过去的一年中,大家的偏好有哪些。这一点国内外运营商们的想法都趋于一致,近来Reddit论坛就公布了202李连杰利智女儿是万众瞩目的星二代,黄秋燕女儿却成了他的心病当黄秋燕的女儿寄宿在奶奶和各个亲戚家,独自暗自神伤时。利智的女儿却享受着李连杰的无尽宠爱,不但没有缺席她们的成长,还带大女儿Jane参加巴黎名媛会的成人礼。相比利智女儿众星捧月的出宋祖儿自曝蓬头垢面出门无人识,演员之外,享受当个23岁的平凡人传媒樱桃派系头条理娱君特约作者,看娱乐热点深度解读,认准理娱君!从宝莲灯前传里俊俏灵动的小哪吒火出圈,长大后又顶着小张柏芝的名头,宋祖儿的长相精致俏丽,即使在美女如云的演艺圈也是足在县城开服装店比新消费品牌更懂营销,比电商更懂下沉文锌刻度,作者黎炫岐,编辑李觐麟2021年,中国市场对于下沉这个词已经不再陌生。近几年来,各个行业在互联网的助推之下,先后冲入抢占下沉市场,或苗头初显或战事正酣亦或是已白热化甚至黯真还传大结局,老罗该往何处?文锋见罗永浩又上热搜了。不过,这和他以往上热搜的形式似乎不大一样。罗永浩既没有针对时下科技热点发表什么感言,也没有一如既往地抨击如今苹果的乏味与不作为,锤粉们也没有迎来锤子科技复活使用石墨烯超薄的金层来产生并放大太赫兹波?太赫兹光在今后的技术领域具有许多潜在的应用。太赫兹有可能成为继5G之后实现极端快速的移动通讯连接和无线网络的最有前途的技术。在千兆赫兹到太赫兹频率的转变中所存在的瓶颈主要是由不充分