This is a gem with a collection of middleware for easily cascading Heroku request id's Throughout the system. It includes:
- Rack middleware, which adds the request_id to
Thread.current[:request_id]
. - Sidekiq Client middleware, which adds the request_id to the message payload.
- Sidekiq Server middleware, which adds the request_id to
Thread.current[:request_id]
from the request_id in the message payload. - Faraday middleware, which adds the request_id as a response header
X-Request-Id
.
Add this line to your application's Gemfile:
gem 'request_id'
Add the rack middleware:
use Rack::RequestId
Add the client middleware.
Sidekiq.configure_client do |config|
config.client_middleware do |chain|
chain.add Sidekiq::Middleware::Client::RequestId
end
end
Add the server middleware.
Sidekiq.configure_server do |config|
config.client_middleware do |chain|
chain.add Sidekiq::Middleware::Client::RequestId
end
config.server_middleware do |chain|
chain.add Sidekiq::Middleware::Server::RequestId
end
end
If you're using other Sidekiq middleware that wraps job execution, consider
using Sidekiq's
chain.prepend
in place of chain.add
to push the request_id
middleware to the top of the
stack so it runs before other possibly dependent middleware. For example:
Sidekiq.configure_client do |config|
config.client_middleware do |chain|
chain.prepend Sidekiq::Middleware::Client::RequestId
end
end
Add the middleware.
builder.use Faraday::RequestId
You can customize each middleware to store the value of any headers you like in the same fashion. For instance,
if you wanted to track a X-Request-Id
header as well as a X-Session-Id
header, you could do so like this:
# Rack
use Rack::RequestId
use Rack::RequestId, headers: [ { key: :request_id, value: -> (env) { env['HTTP_X_SESSION_ID'], response_header: 'X-Session-Id' } } ]
# Sidekiq
Sidekiq.configure_client do |config|
config.client_middleware do |chain|
chain.add Sidekiq::Middleware::Client::RequestId
chain.add Sidekiq::Middleware::Client::RequestId, headers: [ { key: :session_id, value: -> { ::RequestId.get(:session_id) } } ]
end
end
Sidekiq.configure_server do |config|
config.client_middleware do |chain|
chain.add Sidekiq::Middleware::Client::RequestId
chain.add Sidekiq::Middleware::Client::RequestId, headers: [ { key: :session_id, value: -> { ::RequestId.get(:session_id) } } ]
end
config.server_middleware do |chain|
chain.add Sidekiq::Middleware::Server::RequestId, headers: [ { key: :session_id, value: lambda { |item| item['session_id'] } } ]
end
end
# Faraday
builder.use Faraday::RequestId, headers: [ { key: :session_id, header: 'X-Session-Id' } ]
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request