Herokuは、ルーターからhttp-request-id を追跡するための新しいラボ機能を展開しました。
これが便利な理由の背景: Rails 3.2 では TaggedLogger を使用してログに一意のリクエスト ID を含める機能がロールアウトされたため、特定のログ行がどの Web リクエストに属しているかを追跡できます。これは、ログを同じログ ストアにストリーミングする複数の Web サーバーを実行する場合に非常に重要です。たとえば、Heroku や Unicorn のセットアップで複数の dyno を使用する場合などによくあることです。
Heroku のラボ機能により、Heroku ルーターがこのリクエスト ID を生成するため、リクエストがアプリケーションに入る前に、ルーター レベルからリクエストを追跡できます。これは、タイムアウトなどによりリクエストが完了しなかった場合などに重要です。
HTTP_X_REQUEST_ID
残念ながら、Heroku は、 Rails が受け入れてパススルーする標準のリクエスト ヘッダー キーを選択しませんでしたが、代わりにHTTP_HEROKU_REQUEST_ID
、Rails が変更なしではパススルーしないカスタム キーを作成しました。Heroku、なぜここで慣例から逸脱しているのでしょうか?
RequestId
したがって、Rails のデフォルトミドルウェアを Heroku のヘッダー キーを使用するコピー アンド ペースト ジョブに置き換えるか、Rails ミドルウェアにモンキー パッチを適用するかの 2 つの選択肢が残されています。コピー アンド ペーストのジョブは DRY ではなく、すぐに古くなってしまうので好きではありません。しかし、これについてどうすればいいですか?
次のファイルconfig/initializers/middleware.rb
を追加しようとしました:
module ActionDispatch
class RequestId
private
def external_request_id(env)
if request_id = env["HTTP_X_REQUEST_ID"].presence || env['HTTP_HEROKU_REQUEST_ID'].presence
request_id.gsub(/[^\w\-]/, "").first(255)
end
end
end
end
しかし、それは実行されません。どうすればこれにパッチを当てることができますか?