From 13377ee064e14ccac2aa72e964fda1871aa35a05 Mon Sep 17 00:00:00 2001 From: Lucas Ricoy Date: Fri, 3 Jul 2026 12:24:31 -0300 Subject: [PATCH] fix: mirror rails request user agent into $raw_user_agent --- .changeset/mirror-raw-user-agent.md | 5 +++++ posthog-rails/lib/posthog/rails/request_metadata.rb | 6 +++++- spec/posthog/rails/request_context_spec.rb | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .changeset/mirror-raw-user-agent.md diff --git a/.changeset/mirror-raw-user-agent.md b/.changeset/mirror-raw-user-agent.md new file mode 100644 index 00000000..bd0fe764 --- /dev/null +++ b/.changeset/mirror-raw-user-agent.md @@ -0,0 +1,5 @@ +--- +"posthog-rails": patch +--- + +fix: also send the request user agent as $raw_user_agent, the standardized property PostHog's server-side classification reads diff --git a/posthog-rails/lib/posthog/rails/request_metadata.rb b/posthog-rails/lib/posthog/rails/request_metadata.rb index 7533a960..b269d303 100644 --- a/posthog-rails/lib/posthog/rails/request_metadata.rb +++ b/posthog-rails/lib/posthog/rails/request_metadata.rb @@ -18,7 +18,11 @@ def extract(request) request_method = request_value(request, :request_method) || request_value(request, :method) add_property(properties, '$request_method', request_method) add_property(properties, '$request_path', request_value(request, :path) || request_value(request, :path_info)) - add_property(properties, '$user_agent', TracingHeaders.extract_header(request, 'User-Agent')) + user_agent = TracingHeaders.extract_header(request, 'User-Agent') + add_property(properties, '$user_agent', user_agent) + # Mirrored into $raw_user_agent, the standardized property PostHog's + # server-side classification (e.g. bot detection) reads + add_property(properties, '$raw_user_agent', user_agent) add_property(properties, '$ip', client_ip(request)) properties end diff --git a/spec/posthog/rails/request_context_spec.rb b/spec/posthog/rails/request_context_spec.rb index 91a7a07c..cc50b0e8 100644 --- a/spec/posthog/rails/request_context_spec.rb +++ b/spec/posthog/rails/request_context_spec.rb @@ -61,6 +61,7 @@ def call_with(headers = nil, path: '/api/test', **header_keywords, &block) expect(message[:properties]['$request_method']).to eq('POST') expect(message[:properties]['$request_path']).to eq('/api/test') expect(message[:properties]['$user_agent']).to eq('RSpec Agent') + expect(message[:properties]['$raw_user_agent']).to eq('RSpec Agent') expect(message[:properties]['$ip']).to eq('203.0.113.10') end @@ -92,6 +93,7 @@ def call_with(headers = nil, path: '/api/test', **header_keywords, &block) expect(message[:properties]['$session_id']).to be_nil expect(message[:properties]['$request_path']).to eq('/api/test') expect(message[:properties]['$user_agent']).to eq('RSpec Agent') + expect(message[:properties]['$raw_user_agent']).to eq('RSpec Agent') expect(message[:properties]['$process_person_profile']).to be false end @@ -339,6 +341,7 @@ def action_name expect(message[:properties]['$session_id']).to eq('exception-session') expect(message[:properties]['$request_path']).to eq('/boom') expect(message[:properties]['$user_agent']).to eq('Exception Agent') + expect(message[:properties]['$raw_user_agent']).to eq('Exception Agent') end it 'disables tracing headers for exceptions while preserving request metadata' do @@ -371,6 +374,7 @@ def action_name expect(message[:properties]['$process_person_profile']).to be false expect(message[:properties]['$request_path']).to eq('/boom') expect(message[:properties]['$user_agent']).to eq('Disabled Context Agent') + expect(message[:properties]['$raw_user_agent']).to eq('Disabled Context Agent') expect(message[:properties]['$ip']).to eq('203.0.113.11') end end