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 58 59 60 61 62 63 64 65 66 67 68 69 70
|
# frozen_string_literal: true
require "json"
require "fileutils"
require "pathname"
require "delegate"
module Sentry
# DebugTransport is a transport that logs events to a file for debugging purposes.
#
# It can optionally also send events to Sentry via HTTP transport if a real DSN
# is provided.
class DebugTransport < SimpleDelegator
DEFAULT_LOG_FILE_PATH = File.join("log", "sentry_debug_events.log")
attr_reader :log_file, :backend
def initialize(configuration)
@log_file = initialize_log_file(configuration)
@backend = initialize_backend(configuration)
super(@backend)
end
def send_event(event)
log_envelope(envelope_from_event(event))
backend.send_event(event)
end
def log_envelope(envelope)
envelope_json = {
timestamp: Time.now.utc.iso8601,
envelope_headers: envelope.headers,
items: envelope.items.map do |item|
{ headers: item.headers, payload: item.payload }
end
}
File.open(log_file, "a") { |file| file << JSON.dump(envelope_json) << "\n" }
end
def logged_envelopes
return [] unless File.exist?(log_file)
File.readlines(log_file).map do |line|
JSON.parse(line)
end
end
def clear
File.write(log_file, "")
log_debug("DebugTransport: Cleared events from #{log_file}")
end
private
def initialize_backend(configuration)
backend = configuration.dsn.local? ? DummyTransport : HTTPTransport
backend.new(configuration)
end
def initialize_log_file(configuration)
log_file = Pathname(configuration.sdk_debug_transport_log_file || DEFAULT_LOG_FILE_PATH)
FileUtils.mkdir_p(log_file.dirname) unless log_file.dirname.exist?
log_file
end
end
end
|