1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
# frozen_string_literal: true
require "sentry/utils/exception_cause_chain"
module Sentry
class SingleExceptionInterface < Interface
include CustomInspection
SKIP_INSPECTION_ATTRIBUTES = [:@stacktrace]
PROBLEMATIC_LOCAL_VALUE_REPLACEMENT = "[ignored due to error]".freeze
OMISSION_MARK = "...".freeze
MAX_LOCAL_BYTES = 1024
attr_reader :type, :value, :module, :thread_id, :stacktrace
def initialize(exception:, stacktrace: nil)
@type = exception.class.to_s
@value = (exception.message || "").byteslice(0..Event::MAX_MESSAGE_SIZE_IN_BYTES)
@module = exception.class.to_s.split('::')[0...-1].join('::')
@thread_id = Thread.current.object_id
@stacktrace = stacktrace
end
def to_hash
data = super
data[:stacktrace] = data[:stacktrace].to_hash if data[:stacktrace]
data
end
# patch this method if you want to change an exception's stacktrace frames
# also see `StacktraceBuilder.build`.
def self.build_with_stacktrace(exception:, stacktrace_builder:)
stacktrace = stacktrace_builder.build(backtrace: exception.backtrace)
if locals = exception.instance_variable_get(:@sentry_locals)
locals.each do |k, v|
locals[k] =
begin
v = v.inspect unless v.is_a?(String)
if v.length >= MAX_LOCAL_BYTES
v = v.byteslice(0..MAX_LOCAL_BYTES - 1) + OMISSION_MARK
end
v
rescue StandardError
PROBLEMATIC_LOCAL_VALUE_REPLACEMENT
end
end
stacktrace.frames.last.vars = locals
end
new(exception: exception, stacktrace: stacktrace)
end
end
end
|