AWS X-Ray を Sails.js に統合しようとして、これに出くわした人へ:
プロジェクトフックを作成することで、ようやく機能するようになりました。誰かが十分に野心的であれば、それをインストール可能なフックにすることは大歓迎です。
重要事項
フックは、環境変数AWS_XRAY
=== 'yes' の場合にのみ実行されるように設計されています。これは、ローカル マシンと CI マシンが XRAY を実行できないようにするための安全策です。
フックは、ルート設定の「前」の部分を利用します。これが意味することは、「ルートがインスタンス化される前に、このミドルウェアを使用する」ということです。
このコードは、ELB ヘルス チェックに使用されるルート「/_ping」を無視するように設定されています (X-Ray の場合、リクエストは通常どおり完了します)。これらは X-Ray に記録する必要はありません。お金の無駄です。このコードを読み、必要に応じて調整することを強くお勧めします。特にreq.headers.host
と
req.connection
「修正」。これが、リポジトリのコードを変更せずに X-Ray を機能させる唯一の方法でした (まだ Github リポジトリが見つかりません)。
インジェクションは、req.connection.encrypted
X-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
}
}
};
};