Heroku выкатил new labs feature for tracking http-request-id со своего маршрутизатора.Как патч обезьяны RequestId middleware или почему Heroku не использует стандартный HTTP_X_REQUEST_ID?
Немного фона, почему это полезно: Rails 3.2 выкатил функцию с TaggedLogger до include a unique request ID into the logs, чтобы вы могли отслеживать, к какому веб-запросу принадлежит данная строка журнала. Это действительно важно при запуске нескольких веб-серверов, которые передают свои журналы в один и тот же магазин журналов, например. как это обычно бывает с несколькими динозаводами на установках Heroku или Unicorn и т. д.
Теперь, используя функцию лаборатории Героку, маршрутизатор Heroku будет генерировать этот идентификатор запроса, чтобы вы могли отслеживать запрос с уровня маршрутизатора, прежде чем он даже войдет в заявление. Это важно, например. если запрос не завершился, из-за таймаута и т. д.
К сожалению, Heroku не выбрал стандартный заголовок запроса для этого, HTTP_X_REQUEST_ID
, который Rails примет и пройдет, но вместо этого составил пользовательский, HTTP_HEROKU_REQUEST_ID
, которые Rails не пройдут без изменений. Heroku, почему это отклонение от конвенции здесь?
Итак, я остался с двумя вариантами: либо заменить Rails по умолчанию RequestId
промежуточное программное обеспечение с пастой задания копирования &, которая использует ключ заголовка Heroku, либо обезьяне патч к промежуточному Rails. Мне не нравится копировать файлы &, потому что они не сухие и легко устаревают, оставляя патч обезьяны лучшим вариантом. Как это сделать?
Я попытался добавить файл 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
Но это не получает казнены. Как я могу это исправить?
Там теперь есть камень, который делает это для вас: [HerokuRequestId] (https://github.com/Octo-Labs/heroku-request-id). –