From 4d8373e70b6d33b14d508ca8ecb8387a10787822 Mon Sep 17 00:00:00 2001 From: Jack Rothrock Date: Wed, 28 Feb 2024 14:15:40 -0700 Subject: [PATCH 1/3] Don't capture queue time for requests over websocket --- .../layer_converters/request_queue_time_converter.rb | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/scout_apm/layer_converters/request_queue_time_converter.rb b/lib/scout_apm/layer_converters/request_queue_time_converter.rb index e985b5be..af6e286b 100644 --- a/lib/scout_apm/layer_converters/request_queue_time_converter.rb +++ b/lib/scout_apm/layer_converters/request_queue_time_converter.rb @@ -4,6 +4,8 @@ class RequestQueueTimeConverter < ConverterBase HEADERS = %w(X-Queue-Start X-Request-Start X-QUEUE-START X-REQUEST-START x-queue-start x-request-start) + WEBSOCKET_HEADERS = %w(SEC_WEBSOCKET_VERSION Sec-WebSocket-Version SEC_WEBSOCKET_PROTOCOL Sec-WebSocket-Protocol SEC_WEBSOCKET_KEY Sec-WebSocket-Key) + def headers request.headers end @@ -15,6 +17,8 @@ def record! return unless headers + return if request_over_websocket? + raw_start = locate_timestamp return unless raw_start @@ -38,6 +42,10 @@ def record! private + def request_over_websocket? + WEBSOCKET_HEADERS.any? { |header| headers[header] } + end + # Looks through the possible headers with this data, and extracts the raw # value of the header # Returns nil if not found From f1130662161ea8611a99722d5eba984a05936822 Mon Sep 17 00:00:00 2001 From: Jack Rothrock Date: Fri, 1 Mar 2024 14:54:39 -0700 Subject: [PATCH 2/3] Add comment --- lib/scout_apm/layer_converters/request_queue_time_converter.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/scout_apm/layer_converters/request_queue_time_converter.rb b/lib/scout_apm/layer_converters/request_queue_time_converter.rb index af6e286b..c3c27f7f 100644 --- a/lib/scout_apm/layer_converters/request_queue_time_converter.rb +++ b/lib/scout_apm/layer_converters/request_queue_time_converter.rb @@ -17,6 +17,7 @@ def record! return unless headers + # When an application uses TurboStreams, we capture very innaccurate queue times. return if request_over_websocket? raw_start = locate_timestamp From 57809b401530d0db9bb0b59ddeb4ee097ddf451f Mon Sep 17 00:00:00 2001 From: Jack Rothrock Date: Fri, 1 Mar 2024 15:11:29 -0700 Subject: [PATCH 3/3] Check for upgrade header --- .../layer_converters/request_queue_time_converter.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/scout_apm/layer_converters/request_queue_time_converter.rb b/lib/scout_apm/layer_converters/request_queue_time_converter.rb index c3c27f7f..933a6726 100644 --- a/lib/scout_apm/layer_converters/request_queue_time_converter.rb +++ b/lib/scout_apm/layer_converters/request_queue_time_converter.rb @@ -4,8 +4,6 @@ class RequestQueueTimeConverter < ConverterBase HEADERS = %w(X-Queue-Start X-Request-Start X-QUEUE-START X-REQUEST-START x-queue-start x-request-start) - WEBSOCKET_HEADERS = %w(SEC_WEBSOCKET_VERSION Sec-WebSocket-Version SEC_WEBSOCKET_PROTOCOL Sec-WebSocket-Protocol SEC_WEBSOCKET_KEY Sec-WebSocket-Key) - def headers request.headers end @@ -17,7 +15,7 @@ def record! return unless headers - # When an application uses TurboStreams, we capture very innaccurate queue times. + # When an application uses Turbo Streams, we capture very innaccurate queue times. return if request_over_websocket? raw_start = locate_timestamp @@ -44,7 +42,7 @@ def record! private def request_over_websocket? - WEBSOCKET_HEADERS.any? { |header| headers[header] } + headers["Upgrade"] == "websocket" end # Looks through the possible headers with this data, and extracts the raw