使用 AWS XRAY 扬帆起航
Sails with AWS XRAY
到底应该如何安装带有 Sails 的 AWS XRAY?
我正在尝试将 installation instructions 转换为 Sails 首选的使用 Express 中间件的方式,但我完全失败了。
大多数人会立即从 "use config/http.js" 开始配置中间件。好吧,这在我的情况下不起作用,因为我的 API 专门用于 Sails.io(套接字),因此从未使用过 http 中间件配置。
所以现在,合乎逻辑的步骤是使用策略。好吧,如果您阅读了 XRAY 说明,您就会知道它们正在尝试捕获对应用程序的所有请求,这需要在配置路由之前和之后调用 "start" 和 "stop" 函数。所以,政策不起作用。
所以,我的下一步是在 app.js 和 config/bootstrap.js 文件中尝试它,但无济于事,可能是因为我无法轻易获得 Express 实例 Sails使用。那么,Sails 的当前配置选项甚至可能吗?有人知道如何完成此操作吗?
致任何偶然发现此问题并试图将 AWS X-Ray 集成到 Sails.js 中的人:
我终于让它工作了,为它建立了一个项目挂钩。如果有人有足够的野心,那么欢迎他们把它做成一个可安装的钩子。
重要说明
这个钩子被设计成只有在环境变量AWS_XRAY
==='yes'时运行。这是一个安全陷阱,用于防止本地和 CI 机器 运行ning XRAY。
挂钩进入路线设置的 "before" 部分。这意味着:"before routes are instantiated, use this middleware".
此代码设置为忽略路由“/_ping”(对于 X-Ray,它会让请求正常完成),它用于
用于 ELB 健康检查。这些不需要记录在 X-Ray 上,它们
只是浪费钱。我强烈建议您通读这篇文章
代码,并根据需要进行调整。特别是 req.headers.host
和
req.connection
"fixes"。这是我让 X 射线进入的唯一方法
工作,无需更改回购代码(仍然找不到 Github
为它回购)。
req.connection.encrypted
注入只是让 X-Ray 将 URL 报告为 https。这不重要,除非你想要你的
反映正确 URL.
的痕迹
因为我们使用 CloudFlare,所以有额外的捕获来收集请求的最终用户的 IP 地址。如果您不使用 CF,这应该没有影响,并且不需要任何修改。但是,我不得不问,为什么不使用 CF?
到这里为止,我只能看到关于
X-Ray 控制台中的请求。我还看不到数据库查询,或者
正在使用的其他服务。
结果可能会有所不同
别忘了!
npm i aws-xray-sdk --save
。
- 安装 运行 X-Ray Daemon
这是我整理的代码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
}
}
};
};
到底应该如何安装带有 Sails 的 AWS XRAY?
我正在尝试将 installation instructions 转换为 Sails 首选的使用 Express 中间件的方式,但我完全失败了。
大多数人会立即从 "use config/http.js" 开始配置中间件。好吧,这在我的情况下不起作用,因为我的 API 专门用于 Sails.io(套接字),因此从未使用过 http 中间件配置。
所以现在,合乎逻辑的步骤是使用策略。好吧,如果您阅读了 XRAY 说明,您就会知道它们正在尝试捕获对应用程序的所有请求,这需要在配置路由之前和之后调用 "start" 和 "stop" 函数。所以,政策不起作用。
所以,我的下一步是在 app.js 和 config/bootstrap.js 文件中尝试它,但无济于事,可能是因为我无法轻易获得 Express 实例 Sails使用。那么,Sails 的当前配置选项甚至可能吗?有人知道如何完成此操作吗?
致任何偶然发现此问题并试图将 AWS X-Ray 集成到 Sails.js 中的人:
我终于让它工作了,为它建立了一个项目挂钩。如果有人有足够的野心,那么欢迎他们把它做成一个可安装的钩子。
重要说明
这个钩子被设计成只有在环境变量
AWS_XRAY
==='yes'时运行。这是一个安全陷阱,用于防止本地和 CI 机器 运行ning XRAY。挂钩进入路线设置的 "before" 部分。这意味着:"before routes are instantiated, use this middleware".
此代码设置为忽略路由“/_ping”(对于 X-Ray,它会让请求正常完成),它用于 用于 ELB 健康检查。这些不需要记录在 X-Ray 上,它们 只是浪费钱。我强烈建议您通读这篇文章 代码,并根据需要进行调整。特别是
req.headers.host
和req.connection
"fixes"。这是我让 X 射线进入的唯一方法 工作,无需更改回购代码(仍然找不到 Github 为它回购)。req.connection.encrypted
注入只是让 X-Ray 将 URL 报告为 https。这不重要,除非你想要你的 反映正确 URL. 的痕迹
因为我们使用 CloudFlare,所以有额外的捕获来收集请求的最终用户的 IP 地址。如果您不使用 CF,这应该没有影响,并且不需要任何修改。但是,我不得不问,为什么不使用 CF?
到这里为止,我只能看到关于 X-Ray 控制台中的请求。我还看不到数据库查询,或者 正在使用的其他服务。
结果可能会有所不同
别忘了!
npm i aws-xray-sdk --save
。- 安装 运行 X-Ray Daemon
这是我整理的代码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
}
}
};
};