Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2020-09-12 00:08:44 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2020-09-12 00:08:44 +0300
commita66475b6beb46d77b9ff3fe30453be2d52779048 (patch)
tree39fd943e67dd66b1d734028f5449d8a41c4fe58f /lib/gitlab/error_tracking
parent48e26d30fd251f87a2e136d8997ef2ec35859e71 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'lib/gitlab/error_tracking')
-rw-r--r--lib/gitlab/error_tracking/processor/grpc_error_processor.rb65
1 files changed, 65 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..a91ab17887d
--- /dev/null
+++ b/lib/gitlab/error_tracking/processor/grpc_error_processor.rb
@@ -0,0 +1,65 @@
+# 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)
+
+ raw_message = entry[:value]
+
+ return unless raw_message.start_with?('GRPC::')
+
+ 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