Skip to content

Commit ebea73a

Browse files
committed
Fix request id tracking and show it only logs that are emitted during a Rails request
1 parent 78d91c9 commit ebea73a

File tree

20 files changed

+152
-38
lines changed

20 files changed

+152
-38
lines changed

lib/log_struct/enums/log_field.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class LogField < T::Enum
3232
SourceIp = new(:source_ip)
3333
UserAgent = new(:user_agent)
3434
Referer = new(:referer)
35-
RequestId = new(:request_id)
35+
RequestId = new(:req_id)
3636
Host = new(:host)
3737
ContentType = new(:content_type)
3838
Accept = new(:accept)

lib/log_struct/integrations.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# frozen_string_literal: true
33

44
require_relative "integrations/integration_interface"
5+
require_relative "integrations/request_context"
56
require_relative "integrations/active_job"
67
require_relative "integrations/active_record"
78
require_relative "integrations/rack_error_handler"
@@ -77,6 +78,7 @@ def self.setup_non_middleware_integrations(config)
7778

7879
sig { params(config: LogStruct::Configuration).void }
7980
def self.setup_middleware_integrations(config)
81+
Integrations::RequestContext.setup(config)
8082
Integrations::HostAuthorization.setup(config) if config.integrations.enable_host_authorization
8183
Integrations::RackErrorHandler.setup(config) if config.integrations.enable_rack_error_handler
8284
end

lib/log_struct/integrations/action_mailer/metadata_collection.rb

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,6 @@ def self.add_current_tags_to_log_data(log_data)
5454
end
5555
log_data[:tags] = tags if tags.present?
5656

57-
# Get request_id from ActionDispatch if available
58-
if ::ActionDispatch::Request.respond_to?(:current_request_id) &&
59-
T.unsafe(::ActionDispatch::Request).current_request_id.present?
60-
log_data[:request_id] = T.unsafe(::ActionDispatch::Request).current_request_id
61-
end
62-
6357
# Get job_id from ActiveJob if available
6458
if defined?(::ActiveJob::Logging) && ::ActiveJob::Logging.respond_to?(:job_id) &&
6559
T.unsafe(::ActiveJob::Logging).job_id.present?

lib/log_struct/integrations/host_authorization.rb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ def self.setup(config)
6363
source_ip: request.ip,
6464
user_agent: request.user_agent,
6565
referer: request.referer,
66-
request_id: request.request_id,
6766
x_forwarded_for: request.x_forwarded_for,
6867
allowed_hosts: allowed_hosts_array&.empty? ? nil : allowed_hosts_array,
6968
allow_ip_hosts: allow_ip_hosts_value

lib/log_struct/integrations/lograge.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ def process_headers(event, options)
101101
headers = event.payload[:headers]
102102
return if headers.blank?
103103

104+
# Rails' ActionDispatch::RequestId middleware stores request_id in headers
105+
# Only set if not already present in payload (payload takes precedence)
106+
if options[:request_id].blank? && headers["action_dispatch.request_id"].present?
107+
options[:request_id] = headers["action_dispatch.request_id"]
108+
end
109+
104110
options[:user_agent] = headers["HTTP_USER_AGENT"]
105111
options[:referer] = headers["HTTP_REFERER"]
106112
options[:content_type] = headers["CONTENT_TYPE"]
@@ -144,7 +150,6 @@ def build_request_log(data)
144150
view: view,
145151
database: db,
146152
params: params,
147-
request_id: normalized_data[:request_id]&.to_s,
148153
source_ip: normalized_data[:source_ip]&.to_s,
149154
user_agent: normalized_data[:user_agent]&.to_s,
150155
referer: normalized_data[:referer]&.to_s,

lib/log_struct/integrations/rack_error_handler/middleware.rb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ def call(env)
7171
http_method: env["REQUEST_METHOD"],
7272
user_agent: env["HTTP_USER_AGENT"],
7373
referer: env["HTTP_REFERER"],
74-
request_id: request.request_id,
7574
message: ip_spoof_error.message,
7675
client_ip: env["HTTP_CLIENT_IP"],
7776
x_forwarded_for: env["HTTP_X_FORWARDED_FOR"],
@@ -90,7 +89,6 @@ def call(env)
9089
source_ip: request.remote_ip,
9190
user_agent: request.user_agent,
9291
referer: request.referer,
93-
request_id: request.request_id,
9492
message: error.message,
9593
timestamp: Time.now
9694
)
@@ -137,7 +135,6 @@ def perform_remote_ip_check!(request)
137135
def extract_request_context(env, request = nil)
138136
request ||= ::ActionDispatch::Request.new(env)
139137
{
140-
request_id: request.request_id,
141138
path: request.path,
142139
method: request.method,
143140
user_agent: request.user_agent,
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# typed: strict
2+
# frozen_string_literal: true
3+
4+
require_relative "request_context/middleware"
5+
6+
module LogStruct
7+
module Integrations
8+
# Request context integration that captures request_id for all logs
9+
module RequestContext
10+
extend T::Sig
11+
extend IntegrationInterface
12+
13+
sig { override.params(config: LogStruct::Configuration).returns(T.nilable(T::Boolean)) }
14+
def self.setup(config)
15+
return nil unless config.enabled
16+
17+
# Insert after RequestId middleware so request_id is available
18+
::Rails.application.middleware.insert_after(
19+
::ActionDispatch::RequestId,
20+
Integrations::RequestContext::Middleware
21+
)
22+
23+
true
24+
end
25+
end
26+
end
27+
end
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# typed: strict
2+
# frozen_string_literal: true
3+
4+
module LogStruct
5+
module Integrations
6+
module RequestContext
7+
# Middleware that captures request_id and stores it in SemanticLogger's
8+
# named_tags so all logs during the request include the request_id.
9+
class Middleware
10+
extend T::Sig
11+
12+
sig { params(app: T.untyped).void }
13+
def initialize(app)
14+
@app = app
15+
end
16+
17+
sig { params(env: T.untyped).returns(T.untyped) }
18+
def call(env)
19+
request = ::ActionDispatch::Request.new(env)
20+
::SemanticLogger.push_named_tags(request_id: request.request_id)
21+
@app.call(env)
22+
ensure
23+
::SemanticLogger.pop_named_tags
24+
end
25+
end
26+
end
27+
end
28+
end

lib/log_struct/log/request.rb

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ class Request < T::Struct
3333
const :source_ip, T.nilable(String), default: nil
3434
const :user_agent, T.nilable(String), default: nil
3535
const :referer, T.nilable(String), default: nil
36-
const :request_id, T.nilable(String), default: nil
3736

3837
# Event-specific fields
3938
const :format, T.nilable(Symbol), default: nil
@@ -69,7 +68,6 @@ def to_h
6968
h[LogField::SourceIp] = source_ip unless source_ip.nil?
7069
h[LogField::UserAgent] = user_agent unless user_agent.nil?
7170
h[LogField::Referer] = referer unless referer.nil?
72-
h[LogField::RequestId] = request_id unless request_id.nil?
7371
h[LogField::Format] = format unless format.nil?
7472
h[LogField::Controller] = controller unless controller.nil?
7573
h[LogField::Action] = action unless action.nil?

lib/log_struct/log/security.rb

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,14 @@ class BaseFields < T::Struct
2020
const :source_ip, T.nilable(String), default: nil
2121
const :user_agent, T.nilable(String), default: nil
2222
const :referer, T.nilable(String), default: nil
23-
const :request_id, T.nilable(String), default: nil
2423

2524
Kwargs = T.type_alias do
2625
{
2726
path: T.nilable(String),
2827
http_method: T.nilable(String),
2928
source_ip: T.nilable(String),
3029
user_agent: T.nilable(String),
31-
referer: T.nilable(String),
32-
request_id: T.nilable(String)
30+
referer: T.nilable(String)
3331
}
3432
end
3533

@@ -40,8 +38,7 @@ def to_kwargs
4038
http_method: http_method,
4139
source_ip: source_ip,
4240
user_agent: user_agent,
43-
referer: referer,
44-
request_id: request_id
41+
referer: referer
4542
}
4643
end
4744
end

0 commit comments

Comments
 (0)