使用 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.hostreq.connection"fixes"。这是我让 X 射线进入的唯一方法 工作,无需更改回购代码(仍然找不到 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
            }
        }
    };
};