gpt4 book ai didi

node.js - 与 AWS XRAY 一起扬 sails 起航

转载 作者:太空宇宙 更新时间:2023-11-03 23:03:49 28 4
gpt4 key购买 nike

到底应该如何使用 Sails 安装 AWS XRAY?

我正在尝试翻译 installation instructions Sails 使用 Express 中间件的首选方式,但我却一败涂地。

大多数人会立即从“use config/http.js”开始配置中间件。好吧,这对我来说不起作用,因为我的 API 专门与 Sails.io(套接字)一起使用,因此从未使用 http 中间件配置。

所以现在,合乎逻辑的步骤是使用策略。好吧,如果您阅读过 XRAY 说明,您就会知道它们正在 try catch 对应用程序的所有请求,这需要在配置路由之前和之后调用“启动”和“停止”函数。所以,政策不起作用。

所以,我的下一步是在 app.js 和 config/bootstrap.js 文件中尝试它,但没有成功,可能是因为我无法轻松获取 Sails 正在使用的 Express 实例。那么,Sails 当前的配置选项是否有可能呢?有人知道如何实现这一目标吗?

最佳答案

对于任何可能偶然发现此问题并尝试将 AWS X-Ray 集成到 Sails.js 中的人:

通过为其构建项目 Hook ,我终于让它工作了。如果有人有足够的雄心,我们更欢迎他们将其变成一个可安装的钩子(Hook)。

重要说明

  • 该 Hook 设计为仅在环境变量 AWS_XRAY ===“yes”时运行。这是一个安全陷阱,旨在防止本地和 CI 机器运行 XRAY。

  • Hook 点击路线设置的“之前”部分。这意味着:“在实例化路由之前,使用此中间件”。

  • 此代码设置为忽略路由“/_ping”(对于 X-Ray,它将让请求正常完成),该路由用于用于 ELB 健康检查。这些不需要登录 X-Ray,它们只是浪费钱。我强烈建议您阅读本文代码,并根据需要进行调整。特别是 req.headers.hostreq.connection“修复”。这是我获得 X 光的唯一方法工作,无需更改存储库的代码(仍然找不到 Github repo )。

  • req.connection.encrypted 注入(inject)只是为了让 X-Ray 将 URL 报告为 https。这并不重要,除非你想要你的跟踪以反射(reflect)正确的 URL。

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

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

结果可能会有所不同

别忘了!

  • npm 我 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
}
}
};
};

关于node.js - 与 AWS XRAY 一起扬 sails 起航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41149229/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com