class Sentry::Envelope::Item
def initialize(headers, payload)
def initialize(headers, payload) @headers = headers @payload = payload end
def reduce_stacktrace!
def reduce_stacktrace! if exceptions = payload.dig(:exception, :values) || payload.dig("exception", "values") exceptions.each do |exception| # in most cases there is only one exception (2 or 3 when have multiple causes), so we won't loop through this double condition much traces = exception.dig(:stacktrace, :frames) || exception.dig("stacktrace", "frames") if traces && traces.size > STACKTRACE_FRAME_LIMIT_ON_OVERSIZED_PAYLOAD size_on_both_ends = STACKTRACE_FRAME_LIMIT_ON_OVERSIZED_PAYLOAD / 2 traces.replace( traces[0..(size_on_both_ends - 1)] + traces[-size_on_both_ends..-1], ) end end end end
def remove_breadcrumbs!
def remove_breadcrumbs! if payload.key?(:breadcrumbs) payload.delete(:breadcrumbs) elsif payload.key?("breadcrumbs") payload.delete("breadcrumbs") end end
def serialize
def serialize result = to_s if result.bytesize > MAX_SERIALIZED_PAYLOAD_SIZE remove_breadcrumbs! result = to_s end if result.bytesize > MAX_SERIALIZED_PAYLOAD_SIZE reduce_stacktrace! result = to_s end [result, result.bytesize > MAX_SERIALIZED_PAYLOAD_SIZE] end
def size_breakdown
def size_breakdown payload.map do |key, value| "#{key}: #{JSON.generate(value).bytesize}" end.join(", ") end
def to_s
def to_s [JSON.generate(@headers), JSON.generate(@payload)].join("\n") end
def type
def type @headers[:type] || 'event' end