1

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

我正在尝试将安装说明翻译成 Sails 使用 Express 中间件的首选方式,但我的脸却一塌糊涂。

大多数人会立即从“使用 config/http.js”开始配置中间件。好吧,这在我的情况下不起作用,因为我的 API 专门用于 Sails.io(套接字),因此从不使用 http 中间件配置。

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

因此,我的下一步是在 app.js 和 config/bootstrap.js 文件中尝试它,但无济于事,可能是因为我无法轻松获取 Sails 正在使用的 Express 实例。那么,使用 Sails 的当前配置选项甚至可能吗?任何人都知道如何做到这一点?

4

1 回答 1

3

对于任何偶然发现这一点的人,试图将 AWS X-Ray 集成到 Sails.js 中:

通过为它构建一个项目挂钩,我终于让它工作了。如果有人足够雄心勃勃,那么欢迎他们将其作为可安装的钩子。

重要笔记

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

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

  • 此代码设置为忽略用于 ELB 健康检查的路由“/_ping”(对于 X-Ray,它将让请求正常完成)。这些不需要在 X-Ray 上登录,它们只是浪费钱。我强烈建议您通读这段代码,并根据需要进行调整。特别是req.headers.hostreq.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
            }
        }
    };
};
于 2016-12-15T05:36:29.033 回答