gpt4 book ai didi

ruby - 如何修补 RequestId 中间件或为什么 Heroku 不使用标准的 HTTP_X_REQUEST_ID?

转载 作者:数据小太阳 更新时间:2023-10-29 07:32:24 25 4
gpt4 key购买 nike

Heroku 推出了一个 new labs feature for tracking http-request-id从它的路由器。

一些有用的背景知识:Rails 3.2 推出了一个带有 TaggedLogger 的功能到 include a unique request ID into the logs , 这样您就可以跟踪给定日志行属于哪个 Web 请求。这在运行多个将日志流式传输到同一个日志存储的 Web 服务器时非常重要,例如这与 Heroku 或 Unicorn 设置等上的多个测功机很常见。

现在,借助 Heroku 的实验室功能,Heroku 路由器将生成此请求 ID,以便您可以在请求进入应用程序之前从路由器级别跟踪该请求。这很重要,例如如果由于超时等原因导致请求未能完成

不幸的是,Heroku 没有为此选择标准的请求 header key ,HTTP_X_REQUEST_ID,Rails 会接受并通过它,而是创建了一个自定义的,HTTP_HEROKU_REQUEST_ID,未经修改,Rails 将不会通过。 Heroku,为什么会偏离这里的惯例?

因此,我有两个选择:用使用 Heroku header 键的复制和粘贴作业替换 Rails 默认的 RequestId 中间件,或者对 Rails 中间件进行猴子修补。我不喜欢复制和粘贴工作,因为它们不是 DRY 并且很容易变得陈旧,让 monkey patch 成为更好的选择。但是,如何解决这个问题?

我尝试添加一个文件 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

但这并没有被执行。我该如何修补它?

最佳答案

有一个解决方案!我刚刚将它添加到我的 production.rb 中并且它有效!

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

归功于 https://stackoverflow.com/a/10712252/2422778和 Railscasts

编辑
只是想指出,截至 2014 年 1 月 17 日,Heroku 已修复请求 ID header 名称,现在是

env['HTTP_X_REQUEST_ID']

参见:https://devcenter.heroku.com/articles/http-request-id

关于ruby - 如何修补 RequestId 中间件或为什么 Heroku 不使用标准的 HTTP_X_REQUEST_ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15796685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com