使用AWS XRAY航行

时间:2016-12-14 18:05:39

标签: node.js amazon-web-services sails.js aws-sdk aws-xray

如何在世界上安装带有Sails的AWS XRAY?

我正在尝试将installation instructions转换为Sails'使用Express中间件的首选方式,但我的脸色已经不动了。

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

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

所以,我的下一步是在app.js和config / bootstrap.js文件中尝试它,但无济于事,可能是因为我无法轻易获得Express实例Sails正在使用。那么,甚至可以使用Sails的当前配置选项吗?任何人都有任何线索如何实现这一目标?

1 个答案:

答案 0 :(得分:3)

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

我终于通过构建一个项目钩子来实现它。如果某人有足够的雄心壮志,那么欢迎他们将它变成可安装的钩子。

重要提示

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

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

  • 此代码设置为忽略路径“/ _ping”(对于X-Ray,它会让请求正常完成),这是使用的 用于ELB健康检查。它们不需要记录在X射线上 只是浪费钱。我强烈建议你仔细阅读 代码,并根据需要进行调整。特别是req.headers.hostreq.connection“修复”。这是我获得X射线的唯一方法 工作,没有改变repo的代码(仍然找不到Github 回购它。)

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

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

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

结果可能不一致

别忘了!

这是我放在一起的代码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
            }
        }
    };
};