Class: GitlabQuality::TestTooling::Report::GroupIssues::ErrorMessageNormalizer

Inherits:
Object
  • Object
show all
Defined in:
lib/gitlab_quality/test_tooling/report/group_issues/error_message_normalizer.rb

Constant Summary collapse

NORMALIZATION_PATTERNS =
[
  { pattern: /\d{4}-\d{2}-\d{2}T?[ ]?\d{2}:\d{2}:\d{2}(\.\d+)?Z?/, replacement: "<TIMESTAMP>" },
  { pattern: /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/i, replacement: "<UUID>" },
  { pattern: /Correlation Id: [\w]+/, replacement: "Correlation Id: <UUID>" },
  { pattern: /Fabrication of QA::Resource::[A-Za-z:]+/, replacement: "Fabrication of QA::Resource::<RESOURCE>" },
  { pattern: /\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(:\d+)?\b/, replacement: "<IP>" },
  { pattern: /user\d+/, replacement: "<USER>" },
  { pattern: /group\d+/, replacement: "<GROUP>" },
  { pattern: /project\d+/, replacement: "<PROJECT>" },
  { pattern: %r{https?://[^/\s]+/[^\s]*}, replacement: "<URL>" },
  { pattern: %r{/tmp/[^\s]+}, replacement: "<TMPFILE>" },
  { pattern: %r{/var/[^\s]+}, replacement: "<VARFILE>" },
  { pattern: /token=[^\s&]+/, replacement: "token=<TOKEN>" },
  { pattern: /after \d+ seconds/, replacement: "after <N> seconds" },
  { pattern: /waited \d+ seconds/, replacement: "waited <N> seconds" },
  { pattern: /\d+ attempts?/, replacement: "<N> attempts" },
  { pattern: /\s+/, replacement: " " }
].freeze

Instance Method Summary collapse

Instance Method Details

#create_fingerprint(normalized_message) ⇒ Object



42
43
44
# File 'lib/gitlab_quality/test_tooling/report/group_issues/error_message_normalizer.rb', line 42

def create_fingerprint(normalized_message)
  OpenSSL::Digest::SHA256.hexdigest(normalized_message.downcase)[0..15]
end

#normalize(message) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/gitlab_quality/test_tooling/report/group_issues/error_message_normalizer.rb', line 30

def normalize(message)
  return "" if message.nil? || message.empty?

  result = message.dup.strip

  NORMALIZATION_PATTERNS.each do |pattern_rule|
    result.gsub!(pattern_rule[:pattern], pattern_rule[:replacement])
  end

  result.strip
end