用AWS XRAY航行

应该如何在Sails上安装AWS XRAY?

我正试图将安装说明翻译成Sails使用Express中间件的首选方式,但是我正在平躺在我的脸上。

大多数人会立即开始使用“使用config / http.js”来configuration中间件。 那么,在我的情况下,这是行不通的,因为我的API是专门用于Sails.io(套接字),所以http中间件configuration从不使用。

所以现在,合乎逻辑的一步是使用策略。 那么,如果你已经阅读了XRAY指令,你就知道他们正试图捕获所有的请求到应用程序,这需要在启动和停止函数调用之前和之后configuration路由。 所以,政策不起作用。

所以,我的下一步是尝试在app.js和config / bootstrap.js文件中无效,可能是因为我无法轻易获取Sails正在使用的Express实例。 那么,Sails目前的configuration选项有可能吗? 任何人有任何线索如何做到这一点?

对于任何人都应该绊倒这一点,试图将AWS X-Ray集成到Sails.js中:

我终于搞定了,为它build立了一个项目钩子。 如果有人有足够的野心,他们更受欢迎,使其成为一个可安装的钩子。

重要笔记

  • 该钩子被devise为只在环境variablesAWS_XRAY ==='yes'时运行。 这是一个安全陷阱,以防止本地和CI机器运行XRAY。

  • 钩子进入路由设置的“之前”部分。 这意味着什么:“在路由被实例化之前,使用这个中间件”。

  • 这段代码被设置为忽略path“/ _ping”(对于X-Ray,它会让请求像平常一样完成),用于ELB运行状况检查。 这些不需要loginX光,它们只是浪费钱。 我强烈build议你通读这段代码,并根据需要进行调整。 特别是req.headers.hostreq.connection “修复”。 这是我可以让X射线工作的唯一方法,而不用改变回购代码(仍然找不到Github回购)。

  • req.connection.encrypted注入只是为了让X射线报告URL为https。 这并不重要,除非您希望跟踪反映正确的url。

  • 因为我们使用CloudFlare ,所以还有额外的捕获来收集请求的最终用户的IP地址。 如果你不使用CF,这应该没有任何影响,并且不需要任何修改。 但是,我不得不问,为什么不使用CF?

  • 目前为止我只能看到有关X-Ray控制台中的请求的基本数据。 我还看不到数据库查询或其他正在使用的服务。

结果可能会有所不同

别忘了!

  • npm i aws-xray-sdk --save
  • 安装并运行X-Ray守护程序

这是我把api/hooks/setup-aws-xray.js放在一起的代码:

 var AWSXRay = require('aws-xray-sdk'); module.exports = function setupAwsXray(sails){ var setupXray = false; function injectXrayIfRequested(req, res, next){ if ( setupXray && !req.segment && req.path !== '/_ping' ) { req.headers.host = (sails.config.environment === 'production') ? 'myapp.com' : 'dev.myapp.com'; req.connection = { remoteAddress: req.headers['http_cf_connecting_ip'] || req.headers['HTTP_CF_CONNECTING_IP'] || req.headers['X-Real-IP'] || req.ip, encrypted: true }; AWSXRay.express.openSegment()(req, res, next); // not a mistake } else { next(); } } // This just allows us to get a handle on req.segment. // This is important if you want to add annotations / metadata. // Despite AWS's documentation, you DO NOT need to close segments // when using manual mode and express.openSegment, it will // do this for you automatically. AWSXRay.enableManualMode(); return { configure: function(){ if (process.env.AWS_XRAY && process.env.AWS_XRAY === 'yes') { setupXray = true; AWSXRay.setDefaultName('myapp_' + sails.config.environment); } }, routes: { before: { '/*': injectXrayIfRequested } } }; };