4

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

しかし、それは実行されません。どうすればこれにパッチを当てることができますか?

4

1 に答える 1