2013-04-03 5 views
4

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 

Но это не получает казнены. Как я могу это исправить?

+1

Там теперь есть камень, который делает это для вас: [HerokuRequestId] (https://github.com/Octo-Labs/heroku-request-id). –

ответ

4

Есть решение для этого! Я только что добавил это к моему production.rb, и он работает!

config.log_tags = [lambda {|req| req.env['HTTP_HEROKU_REQUEST_ID']}] 

Кредиты https://stackoverflow.com/a/10712252/2422778 и Railscasts

EDIT
Просто хотелось бы отметить, что по состоянию на 17 Jan 2014 Heroku фиксированного запроса имя заголовка идентификатор и теперь

env['HTTP_X_REQUEST_ID'] 

см: https://devcenter.heroku.com/articles/http-request-id

+0

Это работает для журналов. Я хотел бы передать идентификатор запроса в фоновые задания также для отслеживания. Невозможно использовать запрос Rails.uuid - главный недостаток. –

+0

Так почему вы не можете взять его с requexrt.env и пройти дальше? –

 Смежные вопросы

  • Нет связанных вопросов^_^