1

Sails で AWS XRAY をインストールするにはどうすればよいのでしょうか?

インストール手順を、Sails が推奨する Express ミドルウェアの使用方法に翻訳しようとしていますが、うまくいきません。

ほとんどの人は、すぐに "config/http.js を使用" してミドルウェアを構成することから始めます。私の API は Sails.io (ソケット) だけで消費されるため、http ミドルウェア構成は使用されません。

したがって、論理的なステップはポリシーを使用することです。XRAY の手順を読んだことがあれば、ルートが設定される前と後に、「開始」と「停止」の関数呼び出しを必要とするアプリへのすべての要求をキャプチャしようとしていることがわかります。したがって、ポリシーは機能しません。

したがって、私の次のステップは、おそらく、Sails が使用している Express インスタンスを簡単に取得できないため、app.js と config/bootstrap.js ファイルで試してみることでした。では、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.encryptedX-Ray に URL を https として報告させるだけです。トレースに正しい URL を反映させたい場合を除き、これは重要ではありません。

  • CloudFlareを使用しているため、リクエスト用のエンドユーザーの IP アドレスを収集するための追加のキャッチがあります。CF を使用しない場合、これは何の影響もなく、変更も必要ありません。しかし、なぜ CF を使用しないのですか?

  • これまでのところ、X-Ray コンソールでリクエストに関する基本的なデータしか確認できませんでした。データベース クエリや、使用中のその他のサービスはまだ表示されません。

結果は異なる場合があります

忘れないで!

  • npm i aws-xray-sdk --save.
  • 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 に答える