对于任何偶然发现这一点的人,试图将 AWS X-Ray 集成到 Sails.js 中:
通过为它构建一个项目挂钩,我终于让它工作了。如果有人足够雄心勃勃,那么欢迎他们将其作为可安装的钩子。
重要笔记
该钩子设计为仅在环境变量AWS_XRAY
=== 'yes' 时运行。这是一个安全陷阱,以防止本地和 CI 机器运行 XRAY。
钩子进入路线设置的“之前”部分。这意味着:“在路由实例化之前,使用这个中间件”。
此代码设置为忽略用于 ELB 健康检查的路由“/_ping”(对于 X-Ray,它将让请求正常完成)。这些不需要在 X-Ray 上登录,它们只是浪费钱。我强烈建议您通读这段代码,并根据需要进行调整。特别是req.headers.host
和
req.connection
“修复”。这是我可以让 X-Ray 工作的唯一方法,而无需更改存储库的代码(仍然无法找到它的 Github 存储库)。
req.connection.encrypted
注入只是让 X-Ray 将 URL 报告为 https 。这并不重要,除非您希望您的跟踪反映正确的 URL。
因为我们使用CloudFlare,所以有额外的捕获来收集最终用户的请求 IP 地址。如果您不使用 CF,这应该没有影响,并且不需要任何修改。但是,我不得不问,为什么不使用 CF?
这只是到目前为止,我只能在 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
}
}
};
};