New Relic打破了continuation-local-storage环境

时间:2016-03-24 14:55:55

标签: javascript node.js asynchronous newrelic

在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); line给了我错误。

query_auth0.postTokenInfo()函数调用似乎在中断。那里有几层,可能更简单地总结一下它的作用:

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

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

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)

同样,只有在我使用newrelic模块时才会出现此错误。否则代码工作正常。 此外,当请求完成并回调时,问题似乎也会发生。

在node.js中使用New Relic时,有没有人遇到过类似的问题,这可能至少能够指向正确的方向?

1 个答案:

答案 0 :(得分:0)

对于遇到这种情况且感兴趣的任何人。

似乎在要求newrelic后,它会以某种方式影响async和continuation-local-storage因某种原因而互动的方式。在要求newrelic之前没有问题。

然而,在进一步在线搜索后,我发现了一些与async和cls问题相关的话题,但是当需要newrelic时,这些问题才出现。

简而言之,我发现的解决方案是在app.js中要求newrelic之前要求cls。我不确定为什么这会解决问题,但确实如此。 如果有人对原因有任何其他反馈,我们将不胜感激。