summaryrefslogtreecommitdiff
path: root/lib/gitlab/error_tracking/processor/grpc_error_processor.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/error_tracking/processor/grpc_error_processor.rb')
-rw-r--r--lib/gitlab/error_tracking/processor/grpc_error_processor.rb67
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/gitlab/error_tracking/processor/grpc_error_processor.rb b/lib/gitlab/error_tracking/processor/grpc_error_processor.rb
new file mode 100644
index 00000000000..871e9c4b7c8
--- /dev/null
+++ b/lib/gitlab/error_tracking/processor/grpc_error_processor.rb
@@ -0,0 +1,67 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ErrorTracking
+ module Processor
+ class GrpcErrorProcessor < ::Raven::Processor
+ DEBUG_ERROR_STRING_REGEX = RE2('(.*) debug_error_string:(.*)')
+
+ def process(value)
+ process_first_exception_value(value)
+ process_custom_fingerprint(value)
+
+ value
+ end
+
+ # Sentry can report multiple exceptions in an event. Sanitize
+ # only the first one since that's what is used for grouping.
+ def process_first_exception_value(value)
+ exceptions = value.dig(:exception, :values)
+
+ return unless exceptions.is_a?(Array)
+
+ entry = exceptions.first
+
+ return unless entry.is_a?(Hash)
+
+ exception_type = entry[:type]
+ raw_message = entry[:value]
+
+ return unless exception_type&.start_with?('GRPC::')
+ return unless raw_message.present?
+
+ message, debug_str = split_debug_error_string(raw_message)
+
+ entry[:value] = message if message
+ extra = value[:extra] || {}
+ extra[:grpc_debug_error_string] = debug_str if debug_str
+ end
+
+ def process_custom_fingerprint(value)
+ fingerprint = value[:fingerprint]
+
+ return value unless custom_grpc_fingerprint?(fingerprint)
+
+ message, _ = split_debug_error_string(fingerprint[1])
+ fingerprint[1] = message if message
+ end
+
+ private
+
+ def custom_grpc_fingerprint?(fingerprint)
+ fingerprint.is_a?(Array) && fingerprint.length == 2 && fingerprint[0].start_with?('GRPC::')
+ end
+
+ def split_debug_error_string(message)
+ return unless message
+
+ match = DEBUG_ERROR_STRING_REGEX.match(message)
+
+ return unless match
+
+ [match[1], match[2]]
+ end
+ end
+ end
+ end
+end