如何在世界上安装带有Sails的AWS XRAY?
我正在尝试将installation instructions转换为Sails'使用Express中间件的首选方式,但我的脸色已经不动了。
大多数人会立即从“使用config / http.js”开始配置中间件。嗯,这在我的情况下不起作用,因为我的API仅与Sails.io(套接字)一起使用,因此从不使用http中间件配置。
现在,合乎逻辑的步骤是使用策略。好吧,如果你已经阅读了XRAY指令,你知道他们正在尝试捕获对应用程序的所有请求,这需要在开始配置之前和之后进行“开始”和“停止”函数调用。因此,政策不起作用。
所以,我的下一步是在app.js和config / bootstrap.js文件中尝试它,但无济于事,可能是因为我无法轻易获得Express实例Sails正在使用。那么,甚至可以使用Sails的当前配置选项吗?任何人都有任何线索如何实现这一目标?
答案 0 :(得分:3)
对于任何应该偶然发现这一点的人,尝试将AWS X-Ray集成到Sails.js中:
我终于通过构建一个项目钩子来实现它。如果某人有足够的雄心壮志,那么欢迎他们将它变成可安装的钩子。
重要提示
钩子设计为仅在环境变量AWS_XRAY
==='是'时运行。这是一个安全陷阱,用于防止本地和CI机器运行XRAY。
钩子进入路线设置的“之前”部分。这意味着:“在实例化路由之前,请使用此中间件”。
此代码设置为忽略路径“/ _ping”(对于X-Ray,它会让请求正常完成),这是使用的
用于ELB健康检查。它们不需要记录在X射线上
只是浪费钱。我强烈建议你仔细阅读
代码,并根据需要进行调整。特别是req.headers.host
和
req.connection
“修复”。这是我获得X射线的唯一方法
工作,没有改变repo的代码(仍然找不到Github
回购它。)
req.connection.encrypted
注入只是让X-Ray将URL报告为https。这并不重要,除非你想要你的
跟踪以反映正确的网址。
因为我们使用CloudFlare,所以还有额外的捕获来收集最终用户的请求IP地址。如果您不使用CF,这应该没有任何影响,不应该要求任何修改。但是,我不得不问,为什么不使用CF?
这只是让我到目前为止,我只能看到有关的基本数据 X射线控制台中的请求。我还不能看到数据库查询,或 其他正在使用的服务。
结果可能不一致
别忘了!
npm i aws-xray-sdk --save
。 这是我放在一起的代码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
}
}
};
};