gitlab-org--gitlab-foss/lib/gitlab/error_tracking/stack_trace_highlight_decor...

52 lines
1.5 KiB
Ruby

# frozen_string_literal: true
# This should be in the ErrorTracking namespace. For more details, see:
# https://gitlab.com/gitlab-org/gitlab/-/issues/323342
module Gitlab
module ErrorTracking
module StackTraceHighlightDecorator
extend self
def decorate(error_event)
::Gitlab::ErrorTracking::ErrorEvent.new(
issue_id: error_event.issue_id,
date_received: error_event.date_received,
stack_trace_entries: highlight_stack_trace(error_event.stack_trace_entries)
)
end
private
def highlight_stack_trace(stack_trace)
stack_trace.map do |entry|
highlight_stack_trace_entry(entry)
end
end
def highlight_stack_trace_entry(entry)
return entry unless entry['context']
entry.merge('context' => highlight_entry_context(entry['filename'], entry['context']))
end
def highlight_entry_context(filename, context)
language = guess_language_by_filename(filename)
context.map do |line_number, line_of_code|
[
line_number,
# Passing nil for the blob name allows skipping linking dependencies for the line_of_code
Gitlab::Highlight.highlight(nil, line_of_code, language: language)
]
end
end
def guess_language_by_filename(filename)
Rouge::Lexer.guess_by_filename(filename).tag
rescue Rouge::Guesser::Ambiguous => e
e.alternatives.min_by(&:tag)&.tag
end
end
end
end