2
2
3
3
require "json"
4
4
require "fileutils"
5
+ require "pathname"
6
+ require "delegate"
5
7
6
8
module Sentry
7
9
# DebugTransport is a transport that logs events to a file for debugging purposes.
8
10
#
9
11
# It can optionally also send events to Sentry via HTTP transport if a real DSN
10
12
# is provided.
13
+ class DebugTransport < SimpleDelegator
14
+ DEFAULT_LOG_FILE_PATH = File . join ( "log" , "sentry_debug_events.log" )
11
15
12
- DEFAULT_LOG_FILE_PATH = File . join ( "log" , "sentry_debug_events.log" )
16
+ attr_reader :log_file , :backend
13
17
14
- class DebugTransport < Transport
15
- attr_reader :log_file_path , :http_transport
18
+ alias_method :__getobj , :backend
16
19
17
20
def initialize ( configuration )
18
- super
21
+ @log_file = initialize_log_file ( configuration )
22
+ @backend = initialize_backend ( configuration )
19
23
20
- @log_file_path = configuration . sdk_debug_transport_log_file || DEFAULT_LOG_FILE_PATH
21
-
22
- FileUtils . mkdir_p ( File . dirname ( @log_file_path ) )
23
-
24
- log_debug ( "DebugTransport: Initialized with log file: #{ @log_file_path } " )
25
-
26
- if configuration . dsn && !configuration . dsn . to_s . include? ( "localhost" )
27
- @http_transport = Sentry ::HTTPTransport . new ( configuration )
28
- log_debug ( "DebugTransport: Initialized with HTTP transport for DSN: #{ configuration . dsn } " )
29
- else
30
- @http_transport = nil
31
- log_debug ( "DebugTransport: Using local-only mode for DSN: #{ configuration . dsn } " )
32
- end
24
+ super ( @backend )
33
25
end
34
26
35
27
def send_event ( event )
36
- envelope = envelope_from_event ( event )
37
- send_envelope ( envelope )
38
- event
28
+ backend . send_event ( event )
29
+
30
+ send_envelope ( envelope_from_event ( event ) )
39
31
end
40
32
41
33
def send_envelope ( envelope )
42
- envelope_data = {
34
+ envelope_json = {
43
35
timestamp : Time . now . utc . iso8601 ,
44
36
envelope_headers : envelope . headers ,
45
37
items : envelope . items . map do |item |
@@ -50,26 +42,37 @@ def send_envelope(envelope)
50
42
end
51
43
}
52
44
53
- File . open ( log_file_path , "a" ) do |file |
54
- file << JSON . dump ( envelope_data ) << "\n "
55
- end
45
+ File . open ( log_file , "a" ) { |file | file << JSON . dump ( envelope_json ) << "\n " }
56
46
57
- if http_transport
58
- http_transport . send_envelope ( envelope )
59
- end
47
+ backend . send_envelope ( envelope )
60
48
end
61
49
62
- def events
63
- return [ ] unless File . exist? ( log_file_path )
50
+ def logged_envelopes
51
+ return [ ] unless File . exist? ( log_file )
64
52
65
- File . readlines ( log_file_path ) . map do |line |
53
+ File . readlines ( log_file ) . map do |line |
66
54
JSON . parse ( line )
67
55
end
68
56
end
69
57
70
58
def clear
71
- File . write ( log_file_path , "" )
72
- log_debug ( "DebugTransport: Cleared events from #{ log_file_path } " )
59
+ File . write ( log_file , "" )
60
+ log_debug ( "DebugTransport: Cleared events from #{ log_file } " )
61
+ end
62
+
63
+ private
64
+
65
+ def initialize_backend ( configuration )
66
+ backend = configuration . dsn . local? ? DummyTransport : HTTPTransport
67
+ backend . new ( configuration )
68
+ end
69
+
70
+ def initialize_log_file ( configuration )
71
+ log_file = Pathname ( configuration . sdk_debug_transport_log_file || DEFAULT_LOG_FILE_PATH ) . realpath
72
+
73
+ FileUtils . mkdir_p ( log_file . dirname ) unless log_file . dirname . exist?
74
+
75
+ log_file
73
76
end
74
77
end
75
78
end
0 commit comments