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:
Diffstat (limited to 'lib/gitlab/error_tracking/context_payload_generator.rb')
-rw-r--r--lib/gitlab/error_tracking/context_payload_generator.rb66
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/gitlab/error_tracking/context_payload_generator.rb b/lib/gitlab/error_tracking/context_payload_generator.rb
new file mode 100644
index 00000000000..c99283b3d20
--- /dev/null
+++ b/lib/gitlab/error_tracking/context_payload_generator.rb
@@ -0,0 +1,66 @@
+# frozen_string_literal: true
+
+module Gitlab
+ module ErrorTracking
+ class ContextPayloadGenerator
+ def self.generate(exception, extra = {})
+ new.generate(exception, extra)
+ end
+
+ def generate(exception, extra = {})
+ {
+ extra: extra_payload(exception, extra),
+ tags: tags_payload,
+ user: user_payload
+ }
+ end
+
+ private
+
+ def extra_payload(exception, extra)
+ inline_extra = exception.try(:sentry_extra_data)
+ if inline_extra.present? && inline_extra.is_a?(Hash)
+ extra = extra.merge(inline_extra)
+ end
+
+ sanitize_request_parameters(extra)
+ end
+
+ def sanitize_request_parameters(parameters)
+ filter = ActiveSupport::ParameterFilter.new(::Rails.application.config.filter_parameters)
+ filter.filter(parameters)
+ end
+
+ def tags_payload
+ extra_tags_from_env.merge!(
+ program: Gitlab.process_name,
+ locale: I18n.locale,
+ feature_category: current_context['meta.feature_category'],
+ Labkit::Correlation::CorrelationId::LOG_KEY.to_sym => Labkit::Correlation::CorrelationId.current_id
+ )
+ end
+
+ def user_payload
+ {
+ username: current_context['meta.user']
+ }
+ end
+
+ # Static tags that are set on application start
+ def extra_tags_from_env
+ Gitlab::Json.parse(ENV.fetch('GITLAB_SENTRY_EXTRA_TAGS', '{}')).to_hash
+ rescue => e
+ Gitlab::AppLogger.debug("GITLAB_SENTRY_EXTRA_TAGS could not be parsed as JSON: #{e.class.name}: #{e.message}")
+
+ {}
+ end
+
+ def current_context
+ # In case Gitlab::ErrorTracking is used when the app starts
+ return {} unless defined?(::Gitlab::ApplicationContext)
+
+ ::Gitlab::ApplicationContext.current.to_h
+ end
+ end
+ end
+end