新遗迹破坏延续本地存储上下文

New Relic breaking continuation-local-storage context

本文关键字:延续 存储 上下文 遗迹 新遗迹      更新时间:2023-09-26

Node.js中的New Relic出现问题。它似乎干扰了我的延续本地存储实现,我的意思是它似乎扼杀了我的cls上下文。

所以现在,一切都很完美,我目前的设置没有问题。只有当我添加了require("newrelic")这一行时;正如他们所建议的,在app.js的顶部,这个问题发生了。

以下是出现问题的特定函数。

function getProfile( req, res, next ) {
  var logger = new log_handler( { "script": __filename, "function": getProfile.name } );
  var session = cls.getNamespace( 'session' );
  var auth = req.headers.authorization.split( " " );
  var existingProfile = session.get( "profile" );
  if ( typeof existingProfile === "object" && existingProfile.hasOwnProperty( "federatedId" ) ) {
    return next( );
  }
  query_auth0.postTokenInfo( auth[1], function ( err, profile ) {
    if ( err ) {
      logger.warn( "query_auth0 encountered an error", { error: err.message } );
      return next( err );
    }
    session.set( "profile", profile );
    next( err );
  } );
}

在我调用query_auth0之前的session.get("profile")语句是有效的,并且确实会返回会话概要文件(如果堆栈中有一个较早设置的话)。但是,session.set("profile",profile);第行给了我错误。

query_auth0.postTokenInfo()函数调用似乎是中断的地方。这里有几个层次,给你一个关于它的作用的总结可能更简单:

该函数只是将请求构建到auth0,然后通过我们自己的request_handler模块发送。这只是建立在第三方"请求"npm模块之上。request_handler与cls交互以提取request_id,但不设置任何内容。

这个问题似乎发生在请求发出之后(并且成功而没有问题),然而,当我尝试添加返回的配置文件时,我会抛出以下异常:

An Uncaught Exception Occurred!
Error: No context available. ns.run() or ns.bind() must be called first.
    at Namespace.set (E:'sitesroot'0'node_modules'continuation-local-storage'context.js:27:11)
    at E:'sitesroot'0'shared'middleware'get_profile.js:45:35
    at E:'sitesroot'0'shared'query_auth0.js:51:12
    at E:'sitesroot'0'shared'request_handler.js:51:12
    at E:'sitesroot'0'node_modules'async'lib'async.js:52:16
    at Immediate.<anonymous> (E:'sitesroot'0'node_modules'async'lib'async.js:1206:34)
    at Immediate.wrapped [as _onImmediate] (E:'sitesroot'0'node_modules'newrelic'lib'transaction'tracer'index.js:155:28)
    at processImmediate [as _immediateCallback] (timers.js:383:17)

同样,这个错误只发生在我使用new遗迹模块的时候。否则,代码运行良好。此外,当请求完成并回调时,问题似乎也会发生。

在node.js中使用NewRelic时,有人遇到过类似的问题吗?这些问题至少可以为我指明正确的方向?

对于任何遇到并感兴趣的人。

似乎在需要新遗迹之后,由于某种原因,它会以某种方式影响异步和延续本地存储的交互方式。在需要新遗迹之前没有任何问题。

然而,在网上进一步搜索后,我发现了一些与async和cls问题有关的主题,然而这些问题只是在需要newrelic时才出现的。

简言之,我发现的解决方案是在需要app.js中的newresil之前先需要cls。我不知道为什么这样解决了问题,但它确实解决了。如果任何人对原因有任何额外的反馈,我们将不胜感激。