67 lines
1.8 KiB
Ruby
67 lines
1.8 KiB
Ruby
# 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 StandardError => 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
|