黑客24小时在线接单的网站

黑客24小时在线接单的网站

Sentry 开发者贡献指南 - SDK 开发(性能监控:Sentry SDK API 演进)

本文本文档的总体目标是将 Sentry SDK 中性能监控作用的演化放置前后文中。大家最先归纳了如何把性能监控加上到 Sentry 和 SDK, 随后大家探讨 identified issues(已确认的问题) 汲取的成功经验及其处理这种问题的措施。

详细介绍

早在 2019 今年初,Sentry 就開始试着向 SDK 加上追踪作用。 Python 和 JavaScript SDK 是制定和开发设计第一个定义的测试平台。概念认证于 2019 年 4 月 29 日 公布, 并于 2019 年 5 月 7 日交付给 Sentry。 Python 和 JavaScript 是显然的挑选,由于他们容许大家材料检测 Sentry 自身的后面和前面。

  • https://github.com/getsentry/sentry-python/pull/342
  • https://github.com/getsentry/sentry-javascript/pull/1918
  • https://github.com/getsentry/sentry-python/releases/tag/0.7.13
  • https://github.com/getsentry/sentry/pull/12952

一定要注意,以上工作中与 OpenCensus 和 OpenTracing 合拼产生 OpenTelemetry 是同代的。 Sentry 的 API 和 SDK 完成参考了 OpenTelemetry 1.0 以前新版本的设计灵感,并融合了我们自己的念头。例如,大家的 Span 情况列表与 2019 年末上下在 OpenTelemetry 标准中可以寻找的配对。

  • https://medium.com/opentracing/a-roadmap-to-convergence-b074e5815289
  • https://github.com/getsentry/relay/blob/55127c75d4eeebf787848a05a12150ee5c59acd9/relay-common/src/constants.rs#L179-L181

应用 API 后,性能监控适用接着拓展到别的 SDK。Sentry 的性能监控 解决方法于 2020 年 7 月广泛可以用。 OpenTelemetry 的追踪标准 1.0 版于 2021 年 2 月公布。

  • https://blog.sentry.io/2020/07/14/see-slow-faster-with-performance-monitoring
  • https://medium.com/opentelemetry/opentelemetry-specification-v1-0-0-tracing-edition-72dd08936978

大家最开始的完成重用了大家目前的错误提示体制:

  • Event type 拓展了新字段。这代表我们可以省时省力并快速开始向 Sentry 推送事件,而不是设计方案和完成全新升级的摄入管路,这一次,并不是 error,反而是一种新的 transaction 事件种类。
    • https://develop.sentry.dev/sdk/event-payloads/
  • 因为大家仅仅推送一种新式事件,因而也重用了 SDK 网络层。
  • 因为大家共享摄入管路(ingestion pipeline),这代表大家共享储存及其出现在全部事件上的处置的很多一部分。

大家的完成转变成确立注重 Transaction 和 Span 中间的差别。一部分因素是重用 Event 插口的不良反应。

Transaction 与顾客造成了较好的共鸣点。她们容许突显编码中的关键工作中块,例如电脑浏览器页面加载或 http 网络服务器要求。顾客可以查询和访问 transaction 列表,而在 transaction 中,span 为更粗粒度的工作中模块给予详尽的日程安排。

在下一节中,大家将探讨现阶段实体模型的一些缺陷。

已确认的问题

尽管统一 SDK 构架(hub、client、scope) 和 transaction ingestion 实体模型的重用有其优势,但工作经验表明了一些大家将其分成两大类的问题。

  • https://develop.sentry.dev/sdk/unified-api/

第一组与 scope 散播相关,实质上是明确 现阶段 scope 是什么的能力。客户编码中的人工检验及其 SDK 集成化中的自动识别都必须此实际操作。

第二组是与用以将 transaction 数据信息从 SDK 发送至 Sentry 的 wire 文件格式有关的问题。

Scope 散播

该问题由 getsentry/sentry-javascript#3751 追踪。

  • https://github.com/getsentry/sentry-javascript/issues/3751

Unified SDK 构架 大部分是根据每一个高并发模块存有一个 hub,每一个 hub 有一堆 client 和 scope 对。

  • https://develop.sentry.dev/sdk/unified-api/

Client 储存配备并承担根据 transport 向 Sentry 传送数据,而 scope 储存额外到传来事件(例如 tag 和 breadcrumb)的前后文数据信息。

每一个 hub 都了解当下的 scope 是啥。它自始至终是局部变量顶端的 scope。艰难的部份是 “per unit of concurrency(每企业高并发)” 有一个 hub。

例如,JavaScript 是具备事件循环系统和多线程执行命令的单核。沒有规范的办法来承重跨异步调用工作中的前后文数据信息。因而,针对 JavaScript 电脑浏览器应用软件,只有一个全局性 hub 共享用以同步和异步编码。

相近的状况发生在 Mobile SDK 上。客户期待前后文数据信息(例如 tags、current user 是啥、 breadcrumbs 及其储存在 scope 上的更多信息)可以从一切进程得到和设定。因而,在这种 SDK 中,只有一个全局性 hub。

在这里2种情形下,当 SDK 务必解决 reporting errors 时,一切都相对性不错。伴随着追踪 transaction 和 span 的附加义务,scope 越来越不适宜储存现阶段的 span,因为它限定了高并发 span 的存有。

针对电脑浏览器 JavaScript,一个有可能的解决办法是应用 Zone.js,Angular 架构的一部分。关键挑戰是它提升了包的尺寸,而且有可能会不经意中危害终端用户应用软件,因为它对 JavaScript 运作时模块的核心一部分开展了小猴子修复(monkey-patches)。

  • https://github.com/angular/angular/blob/master/packages/zone.js/README.md

在我们试着为手动式检验建立更简洁的 API 时,scope 散播问题越来越尤其显著。这一看法是公布一个 Sentry.trace 函数公式,该函数将隐式散播 tracing 和 scope 数据信息, 并适用同步和异步编码的深层嵌入。

举例说明,假定有些人想精确测量检索 DOM 树必须多久。Tracing(追踪) 此实际操作将如下所示所显示:

  • awaitSentry.trace(
  • {
  • op:'dom',
  • description:'WalkDOMTree',
  • },
  • async()=>awaitwalkDomTree()
  • );
  • 应用 Sentry.trace 作用,客户在加上记时数据信息时不要担忧保存对恰当 transaction 或 span 的引入。客户可以在 walkDomTree 函数公式中随意建立子 Span,Span 将在合理的结构分析中排列。

    具体 trace 函数公式的建立相对性简易 (参照具备实例完成的 PR)。殊不知,掌握多线程编码和全局性集成化中的现阶段 span 是一个并未解决的挑戰。

    • https://github.com/getsentry/sentry-javascript/pull/3697/files#diff-f5bf6e0cdf7709e5675fcdc3b4ff254dd68f3c9d1a399c8751e0fa1846fa85dbR158

    下列2个实例综合性了 scope 散播问题。

    没法明确现阶段 Span

    考虑到一些必须获得对现阶段 span 的引入的自动识别编码,在这样的情况下,手动式 scope 散播不能用。

  • //SDKcode
  • functionfetchWrapper(/*...*/){
  • /*
  • ...somecodeomittedforsimplicity...
  • */
  • constparent=getCurrentHub().getScope().getSpan();//<1>
  • constspan=parent.startChild({
  • data:{type:'fetch'},
  • description:`${method}${url}`,
  • op:'http.client',
  • });
  • try{
  • //...
  • //returnfetch(...);
  • }finally{
  • span.finish();
  • }
  • }
  • window.fetch=fetchWrapper;
  • //Usercode
  • asyncfunctionf1(){
  • consthub=getCurrentHub();
  • lett=hub.startTransaction({name:'t1'});
  • hub.getScope().setSpan(t);
  • try{
  • awaitfetch('https://example.com/f1');
  • }finally{
  • t.finish();
  • }
  • }
  • asyncfunctionf2(){
  • consthub=getCurrentHub();
  • lett=hub.startTransaction({name:'t2'});
  • hub.getScope().setSpan(t);
  • try{
  • awaitfetch('https://example.com/f2');
  • }finally{
  • t.finish();
  • }
  • }
  • Promise.all([f1(),f2()]);//runf1andf2concurrently
  • 在上面的例子中,好多个并发的 fetch 请求触发了 fetchWrapper helper 的执行。行 <1> 务必可以按照目前的执行步骤观查到不一样的 span,造成如下所示2个 span 树:

  • t1
  • \
  • |-http.clientGEThttps://example.com/f1
  • t2
  • \
  • |-http.clientGEThttps://example.com/f2
  • 这代表着,当 f1 运作时,parent 务必引入 t1,而当 f2 运作时,parent 务必是 t2。遗憾的是,上边的全部编码都是在兴高采烈地升级和载入单独 hub 案例,因而观查到的 span 树并不是可预测性的。例如,結果很有可能不正确地为:

  • t1
  • t2
  • \
  • |-http.clientGEThttps://example.com/f1
  • |-http.clientGEThttps://example.com/f2
  • 做为没法恰当明确现阶段 span 的不良反应, fetch 集成化的表明完成(和别的)在JavaScript 电脑浏览器 SDK 中挑选建立 flat transactions, 在其中全部子 span 全是 transaction 的立即后代(而不是具备适度的多级别树形结构)。

    • https://github.com/getsentry/sentry-javascript/blob/61eda62ed5df5654f93e34a4848fc9ae3fcac0f7/packages/tracing/src/browser/request.ts#L169-L178

    一定要注意,别的追踪库也遭遇一样的挑戰。在 OpenTelemetry for JavaScript 中有几个(在对外开放时)问题与明确父跨距和恰当的前后文散播(包含多线程编码)有关:

    • 假如应用好几个 TracerProvider 案例,则前后文泄露 #1932

    https://github.com/open-telemetry/opentelemetry-js/issues/1932

    • 怎样在不传送 parent 的情形下建立嵌入 span #1963

    https://github.com/open-telemetry/opentelemetry-js/issues/1963

    • 嵌套的子 span 沒有获得准确的父级 #1940

    https://github.com/open-telemetry/opentelemetry-js/issues/1940

    • OpenTracing shim 始终不变前后文 #2016

    https://github.com/open-telemetry/opentelemetry-js/issues/2016

    • Http Span 未连接/未设定父 Span #2333

    https://github.com/open-telemetry/opentelemetry-js/issues/2333

    互相矛盾的数据信息散播预估

    每每大家加上前边探讨过的 trace 函数公式,或是仅仅试着应用 Zones 处理 scope 散播时,便会发生预估矛盾。

    现阶段的 span 与 tags、breadcrumbs 等一起储存在 scope 中的真相使数据信息散播越来越错乱, 由于 scope 的一些一部分致力于仅散播到内部结构调用函数中(例如,tags), 而别人预估会散播回调用者(例如,breadcrumbs),尤其是在发生 error 时。

    这是一个例子:

  • functiona(){
  • trace((span,scope)=>{
  • scope.setTag('func','a');
  • scope.setTag('id','123');
  • scope.addBreadcrumb('wasina');
  • try{
  • b();
  • }catch(e){
  • //HowtoreporttheSpanIDfromthespaninb?
  • }finally{
  • captureMessage('hellofroma');
  • //tags:{func:'a',id:'123'}
  • //breadcrumbs:['wasina','wasinb']
  • }
  • })
  • }
  • functionb(){
  • trace((span,scope)=>{
  • constfail=Math.random()>0.5;
  • scope.setTag('func','b');
  • scope.setTag('fail',fail.toString());
  • scope.addBreadcrumb('wasinb');
  • captureMessage('hellofromb');
  • //tags:{func:'b',id:'123',fail:?}
  • //breadcrumbs:['wasina','wasinb']
  • if(fail){
  • throwError('bfailed');
  • }
  • });
  • }
  • 在上面的实例中,假如 error 在启用局部变量中气泡,大家期望可以汇报 error 产生在哪个 span(根据引入 SpanID)。大家期待有面包屑导航来叙述产生的一切,无论哪个 Zones 已经实行, 大家期待在内部结构 Zone 中设定一个 tag 来遮盖来源于父 Zone 的同名的 tag, 与此同时承继来源于父 Zone 的任何别的 tag。每一个 Zone 都是有自身的 "current span"。

    全部这种不一样的期待促使很无法一种可以了解的方法器重现阶段的 scope 定义、面包屑导航的纪录方法及其这种不一样的定义怎样相互影响。

    最终,特别注意的是,在没有毁坏目前 SDK API 的情形下,重新组合 scope 管理方法的变更很可能不能进行。目前的 SDK 定义 — 如 hubs、scopes、breadcrumbs、user、tags 和 contexts — 都务必再次模型。

    Span 摄入实体模型

    考虑到由下列 span 树叙述的追踪:

  • F*
  • ├─B*
  • │├─B
  • │├─B
  • │├─B
  • ││├─S*
  • ││├─S*
  • │├─B
  • │├─B
  • ││├─S*
  • │├─B
  • │├─B
  • │├─B
  • ││├─S*
  • where
  • F:spancreatedonfrontendservice
  • B:spancreatedonbackendservice
  • S:spancreatedonstorageservice
  • 此跟踪表明了 3 个被检查的服务项目,当消费者点击网页页面上的按键 (F) 时,后面 (B) 实行一些工作中,随后必须对储存服务项目 (S) 开展多次查看。坐落于给出服务项目通道点的 Span 标着 * 以表明两者是 transaction。

    我们可以根据这些事例来较为和了解 Sentry 的 span 摄入实体模型与 OpenTelemetry 和其它相近追踪系统软件采用的实体模型中间的差别。

    在 Sentry 的 span 摄入实体模型中,归属于 transaction 的全部 span 务必在单独要求中一起推送。这代表在全部 B* transaction 期内,全部 B span 都需要储存在存储空间中,包含在中下游服务项目(实例中的储存服务项目)上耗费的時间。

    在 OpenTelemetry 的模式中,span 在过去进行时被一起批处理命令,而且一旦 a) 批号中有一定数目的 span 或 b) 过去了一定的时间段便会推送批号。在人们的实例中,这也许代表着前 3 个 B 跨距将一起批处理命令并推送, 而第一个 S* 事务管理仍在储存服务项目中开展。接着,别的 B span 将一起批处理命令并在过去进行时推送,直到最后 B* transaction span 也被推送。

    尽管 transaction 做为将 span 组成在一起并探寻 Sentry 中有兴趣的实际操作的一种方法尤其有效, 但他们现阶段具有的方式会产生超额的认识压力。 SDK 维护保养工作人员和终端用户在撰写检验编码时都需要掌握并在 transaction 或 span 中间做好挑选。

    在现阶段的摄入实体模型中早已确认了下面几组中的问题,而且都和这类二分法相关。

    事务管理的繁杂 JSON 实例化

    在 OpenTelemetry 的模式中, 全部跨距都遵循同样的逻辑性文件格式。客户和检验库可以根据将 key-value 特性额外到一切 span 来为其给予大量含意。 wire 协议书应用 span 目录将信息从一个系统软件发送至另一个系统软件。

    • https://github.com/open-telemetry/opentelemetry-proto/blob/ebef7c999f4dea62b5b033e92a221411c49c0966/opentelemetry/proto/trace/v1/trace.proto#L56-L235

    与 OpenTelemetry 不一样,Sentry 的实体模型对这两种类别的 span 开展了严苛区别:transaction span(通常称之为 transactions)和 regular span。

    在存储空间中,transaction span 和 regular span 有一个差别:transaction span 有一个附加的特性,即 transaction name。

    可是,当实例化为 JSON 时,差别更高。 Sentry SDK 以立即类似运行内存中的 span 的形式将基本 span 实例化为 JSON。比较之下,transaction span 的实例化必须将其 span 特性投射到 Sentry Event (最开始用以 report errors,拓展为专业用以 transactions 的新字段),并将全部子 span 做为目录置入 Event 中。

    Transaction Span 获得 Event 特性

    当 transaction 从其运行内存表明变换为 Event 时, 它会得到大量没法分派给 regular span 的特性, 例如 breadcrumbs, extra, contexts, event_id, fingerprint, release, environment, user 等。

    生命期勾子

    Sentry SDK 为 error 事情公布了一个 BeforeSend hook,容许客户在将事情发送至 Sentry 以前改动和/或丢掉事情。

    当引进新的 transaction 种类事情时,迅速就决策该类事情不容易根据 BeforeSend hook,关键有两个缘故:

    • 避免客户编码依靠 transaction 的双向形式(有时候看上去像一个 span,有时候像一个 event,如前几组上述);
    • 为了避免目前的 BeforeSend 函数公式在撰写时只充分考虑 error 而影响 transaction,不论是出现意外地更改他们、彻底丢弃他们,或是造成一些别的意想不到的不良反应。

    殊不知,也很显著必须某类形式的 lifecycle hook,以容许用户实行例如升级 transaction 名字之类的实际操作。

    大家最后达到了正中间观点,即根据应用 EventProcessor(一种更常用的 BeforeSend 形式)来容许变更/丢弃 transaction 事件。这根据在数据信息离去 SDK 以前让用户马上浏览它们的统计数据来解决困难,但它还有缺陷,它比 BeforeSend 应用起來更繁杂,而且还泄露了从没准备泄露的 transaction 二元性。

    比较之下,在 OpenTelemetry 中,span 根据 span processor,这也是2个生命期勾子:一个是在 span 逐渐时,一个是在它完毕时。

    嵌套事务管理

    Sentry 的摄入实体模型并不是为服务项目中的嵌套 transaction 而制定的。Transaction 致力于标识服务项目变换。

    在日常生活中,SDK 没法避免 transaction 嵌套。最后效果也许会让用户觉得诧异,由于每单 transaction 都是会逐渐一棵新树。关系这种树的唯一方式 是根据 trace_id。

    Sentry 的收费实体模型是对于每一个事件的,不论是 error 事件或是 transaction 事件。这代表着 transaction 中的 transaction 会转化成2个可收费事件。

    在 SDK 中,在 transaction 中开展 transaction 将造成内部结构 span 被紧紧围绕他们的最里层 transaction “吞食”。在这种状况下,建立 span 的编码只能将他们加入到2个 transaction 之一,进而造成另一个 transaction 中的检验空隙。

    Sentry 的 UI 并不是致力于以有效的方法解决嵌套 transaction。当查询一切一个 transaction 时,就仿佛 transaction 中的任何别的 transaction 也不存有(树主视图上沒有立即表明别的 transaction)。有一个 trace view 作用来数据可视化共享资源一个 trace_id 的全部 transaction, 但 trace view 仅根据表明 transaction 而不是子 span 来给予追踪的简述。如果不先浏览某一 transaction,就没法导航栏到 trace view。

    针对这样的事情(伪代码),用户对 UI 中的期待也具有搞混:

  • #ifdo_a_database_queryreturns10results,istheuser
  • #-seeing11transactionsintheUI?
  • #-billedfor11transactions?
  • #-seespanswithincreate_thumbnailintheinnermosttransactiononly?
  • withtransaction("index-page"):
  • results=do_a_database_query()
  • forresultinresults:
  • ifresult["needs_thumbnail"]:
  • withtransaction("create-thumbnail",{"resource":result["id"]}):
  • create_thumbnail(result)
  • 跨距不可以存有于事务管理以外

    Sentry 的跟踪感受彻底紧紧围绕着存有于 transaction 中的 trace 一部分。这代表着数据信息不可以存有于 transaction 以外,即使它出现于 trace 中。

    假如 SDK 沒有开展 transaction,则由 instrumentation 建立的 regular span 将彻底遗失。换句话说,这对 Web server 而言并不是什么问题,由于自动识别的 transaction 伴随着每一个传到要求开始与结束。

    Transaction 的需求在前面(电脑浏览器、挪动和桌面应用程序流程)上特别是在具备趣味性, 由于在这种状况下,自动识别的 transaction 不太靠谱地捕获全部 span,由于这些在全自动进行以前只不断比较有限的時间。

    在 trace 以仅做为 span 而不是 transaction 开展检验的实际操作逐渐的情形下,会发生另一个问题。在人们的 实例追踪中,造成 trace 的第一个 span 是因为点击按键。假如按键点一下 F* 被检查为基本的 span 而不是 transaction,则很可能不容易捕获来源于前面的数据信息。殊不知,仍会捕获 B 和 S span,造成不完善的足迹。

    在 Sentry 的模式中,假如一个 span 并不是一个 transaction 而且沒有做为 transaction 的先祖 span,那麼该 span 将不易被摄入。相反,这代表在许多情形下,追踪遗失了有利于调节问题的核心信息内容,尤其是在前面,transaction 必须在某一时时刻刻完毕但实行很有可能会再次。

    全自动和手动式检验遭遇着决策是逐渐 span 或是 transaction 的挑戰,充分考虑下列要素,决策特别是在艰难:

    要是没有 transaction,则 span 遗失。

    假如已存有 transaction,则存在嵌套事务管理问题。

    缺乏 Web Vitals 精确测量

    Sentry 的浏览器工具搜集 Web Vitals 精确测量值。可是,由于这种精确测量值是应用自动识别的 transaction 做为媒介发送至 Sentry 的,因此在全自动 transaction 进行后由电脑浏览器给予的精确测量值将遗失。

    这会造成 transaction 遗失一些 Web Vitals 或对 LCP 等标准开展非最后精确测量。

    前面事务管理延迟时间不靠谱

    由于任何的统计数据都务必在一个 transaction 中。Sentry 的电脑浏览器 SDK 为每一个页面加载和每个导航栏建立一个 transaction。这种 transaction 务必在某一時间完毕。

    假如在 transaction 进行以前关闭浏览器菜单栏并将其发送至 Sentry,则全部搜集的数据信息都是会遗失。因而,SDK 必须均衡遗失全部信息的隐患与搜集不完善和很有可能不确切的数据资料的风险性。

    在留意到最后一个主题活动(例如传来的 HTTP 要求)后空余了一段时间后,Transaction 就完成了。这代表着页面加载或导航栏 transaction 的延迟时间是一个非常随便的值,不一定能改善或与别的事务管理对比,因为它不可以精确意味着一切实际和可解释的全过程的延迟时间。

    大家根据将 LCP Web Vital 做为电脑浏览器的默认设置性能参数来解决这一限定。可是,如上所述,LCP 值很有可能会在最后明确以前推送,因而这不是理想化的解决方法。

    运行内存缓存危害网络服务器

    如前所述,现阶段的摄入实体模型必须 Sentry SDK 来观察运行内存中的详细 span 树。以匀速运动的高并发 transaction 流运作的程序将必须很多的服务器资源来搜集和解决追踪数据信息。Web 网络服务器是发生此问题的经典案例。

    这代表着纪录 100% 的 span 和 100% 的 transaction 针对很多服务端应用软件而言不是可以的,由于所形成的花销太高了。

    没法批处理命令事务管理

    Sentry 的摄入实体模型不兼容一次摄入好几个事件。尤其是,SDK 不可以将好几个 transaction 批处理命令为一个要求。

    因而,当分多笔 transaction 几乎与此同时过去进行时,SDK 必须为每一个 transaction 传出独立的要求。这种做法在最合适的情形下是十分低效能的,在最坏的情形下是对資源(如服务器带宽和CPU周期时间)的比较严重且有什么问题的耗费。

    兼容模式

    Transaction Span 的特别解决与 OpenTelemetry 兼容问题。应用 OpenTelemetry SDK 检验目前应用软件的用户没法轻轻松松应用 Sentry 来获得和剖析它们的数据信息。

    Sentry 的确为 OpenTelemetry Collector 给予了一个 Sentry Exporter,可是,因为目前的摄入实体模型,Sentry Exporter 有一个具体的准确性限定。

    https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/sentryexporter#known-limitations

    汇总

    根据在 Sentry 中搭建现阶段的追踪完成,大家学习到了许多。本文本文档尝试捕获很多已经知道的限定,以做为将来优化的基本。

    跟踪是一个繁杂的主题,收服这类多元性并非易事。

    第一组中的问题 - 与 scope propagation(修饰符散播) 有关的问题 - 是 SDK 以及设计方案方法独特的问题。处理这种问题将要对全部 SDK 开展内部结构构架更改,包含再次设计方案面包屑导航等旧作用, 但开展该类更改是完成比较简单实用的 tracing helper(如可在一切前后文中工作中并捕获精确靠谱的性能数据信息的 trace 函数公式)的前提条件。一定要注意,该类更改几乎毫无疑问代表着公布新的关键 SDK 版本,这会毁坏与目前版本的兼容模式。

    第二组中的问题 - 与 span ingestion model(跨距摄入实体模型) 有关的问题要繁杂得多,由于为处理这种问题所做的一切更改都是会影响到设备的大量一部分,而且必须好几个团体的配合勤奋。

    即便如此,对 ingestion model 开展更改将对商品造成无法估量的主动危害,由于那样做会提高工作效率,使大家可以采集大量数据信息,并降低 instrumentation 的压力。

    • 评论列表:
    •  拥嬉抹忆
       发布于 2022-06-12 06:01:20  回复该评论
    • ntelemetry-js/issues/2333互相矛盾的数据信息散播预估每每大家加上前边探讨过的 trace 函数公式,或是仅仅试着应用 Zones 处理 scope 散播时,便会发生预估矛盾。现阶段的 span 与 tags、breadcrumbs 等一起储存在 s
    •  离鸢莣萳
       发布于 2022-06-12 02:01:39  回复该评论
    • extra, contexts, event_id, fingerprint, release, environment, user 等。生命期勾子Sentry SDK 为 error 事情公布了一个 BeforeSend hook,容许客户在将事情
    •  俗野清淮
       发布于 2022-06-12 07:39:08  回复该评论
    • 2()]);//runf1andf2concurrently在上面的例子中,好多个并发的 fetch 请求触发了 fetchWrapper helper 的执行。行 &l

    发表评论:

    Powered By

    Copyright Your WebSite.Some Rights Reserved.