怎么在节点中绑定全局TraceID

  介绍

本篇文章给大家分享的是有关怎么在节点中绑定全局TraceID,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

<李>

方案1:在调用,retrieveOneSub函数的父函数,即,retrieveOne内,对,paramData进行,解构,输出学生相关信息,但该方案,无法细化日志输出粒度。

<李>

方案2:修改,retrieveOneSub函数签名,接收,paramData为其参数,该方案,能确保日志输出粒度,但,在调用链很深的情况下,需要给各函数修改函数签的名,使其接收,paramData,颇具工作量,并不太可行。

/* *   ,*返回获取一份提交的函数   ,* @param  {ParamData}, ParamData   ,* @param {上下文},,ctx   ,* @param {字符串},,id   ,*/export  async  function  retrieveOne (paramData, ctx, id), {   {,const  subModel },=, paramData.ce;   ,const  sub_asgn_id =,数量(id);      ,//通过,paramData.user 获取,user 相关信息,如,user_id ,   ,//但无法细化日志输出粒度,除非修改,retrieveOneSub 的签的名,   ,//添加,paramData 为其参数。   {,const  user_id },=, paramData.user;   ,console.log (“$ {user_id}, is  trying 用retreive  one  submission.”);   ,//调用了,retrieveOneSub 函数。   ,const  sub =, await  retrieveOneSub (sub_asgn_id,子模型);=,const  submission 接头;   ,分配(子,,{,sub_asgn_id });   ,分配(paramData,{提交的不同之处是,sub });   ,return 接头;   }/* *   *大敌;从数据库获取一份提交   ,* @param {号码},,sub_asgn_id   ,* @param {子模型},,模型   ,*/async  function  retrieveOneSub (sub_asgn_id,模型),{   ,const (子),=,await  model.findById (sub_asgn_id);   ,if (!子),{   throw 才能;new  ME.SoftError (ME.NOT_FOUND, & # 39;找不到该提交& # 39;);   ,}   ,return 接头;   }

<强>异步钩子

其实,针对以上的问题,我们还可以从节点的异步钩子实验性API方面入手。在节点。js v8。x后,官方提供了可用于,监听异步行为的异步钩子(异步钩子)API的支持。

<强>异步范围

异步钩子对每一个(同步或异步)函数提供了一个异步的范围,我们可调用,executionAsyncId方法获取当前函数的异步ID、调用,triggerAsyncId获取当前函数调用者的异步ID。

const  asyncHooks =,要求(“async_hooks");   const  {executionAsyncId的不同之处是,triggerAsyncId },=, asyncHooks;      console.log (“top 水平:$ {executionAsyncId ()}, $ {triggerAsyncId ()}”);      const  f =,(),=祝辞,{   ,console.log (' f: $ {executionAsyncId ()}, $ {triggerAsyncId ()}”);   };      f ();      const  g =,(),=祝辞,{   ,console.log (“setTimeout: $ {executionAsyncId ()}, $ {triggerAsyncId ()}”);   ,setTimeout((),=祝辞,{   console.log才能(“inner  setTimeout: $ {executionAsyncId ()}, $ {triggerAsyncId ()}”);   ,},0);   };      setTimeout (g, 0);   setTimeout (g, 0),

在上述代码中,我们使用,setTimeout模拟一个异步调用过程,且在该异步过程中我们调用了处理程序同步函数,我们在每个函数内都输出其对应的异步ID和触发异步ID。执行上述代码后,其运行结果如下。

top 水平:1,0   f: 1, 0   setTimeout:, 7, 1,,,,   setTimeout:, 9, 1,,,,   inner  setTimeout: 11, 7   inner  setTimeout: 13, 9

通过上述日志输出,我们得出以下信息:

<李>

调用同步函数,不会改变其异步ID,如函数f内的异步ID和其调用者的异步ID相同。

<李>

同一个函数,被不同时刻进行异步调用,会分配至不同的异步ID,如上述代码中函的克数。

<强>追踪异步资源

正如我们前面所说的,异步钩子可用于追踪异步资源。为了实现此目的,我们需要了解异步钩子的相关API,具体说明参照以下代码中的注释。

const  asyncHooks =,要求(“async_hooks");//,创建一个,AsyncHooks 实例。   const  hooks =, asyncHooks.createHook ({   ,//对象构造时会触发,init 事件。   ,初始化:函数(asyncId、,类型,triggerId,,资源),{},   ,//在执行回调前会触发,before 事件。   ,:函数(asyncId), {},   ,//在执行回调后会触发,after 事件。   ,后:函数(asyncId), {},   ,//在销毁对象后会触发,destroy 事件。   ,破坏:函数(asyncId), {}   });//,允许该实例中对异步函数启用,hooks 。   hooks.enable ();//,关闭对异步资源的追踪。   hooks.disable ();

怎么在节点中绑定全局TraceID