22
33require  "json" 
44require  "fileutils" 
5+ require  "pathname" 
6+ require  "delegate" 
57
68module  Sentry 
79  # DebugTransport is a transport that logs events to a file for debugging purposes. 
810  # 
911  # It can optionally also send events to Sentry via HTTP transport if a real DSN 
1012  # is provided. 
13+   class  DebugTransport  < SimpleDelegator 
14+     DEFAULT_LOG_FILE_PATH  =  File . join ( "log" ,  "sentry_debug_events.log" ) 
1115
12-   DEFAULT_LOG_FILE_PATH   =   File . join ( "log" ,   "sentry_debug_events.log" ) 
16+      attr_reader   :log_file ,   :backend 
1317
14-   class  DebugTransport  < Transport 
15-     attr_reader  :log_file_path ,  :http_transport 
18+     alias_method  :__getobj ,  :backend 
1619
1720    def  initialize ( configuration ) 
18-       super 
21+       @log_file  =  initialize_log_file ( configuration ) 
22+       @backend  =  initialize_backend ( configuration ) 
1923
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 ) 
3325    end 
3426
3527    def  send_event ( event ) 
36-       envelope  =  envelope_from_event ( event ) 
37-       send_envelope ( envelope ) 
38-       event 
28+       log_envelope ( envelope_from_event ( event ) ) 
29+       backend . send_event ( event ) 
3930    end 
4031
41-     def  send_envelope ( envelope ) 
42-       envelope_data  =  { 
32+     def  log_envelope ( envelope ) 
33+       envelope_json  =  { 
4334        timestamp : Time . now . utc . iso8601 , 
4435        envelope_headers : envelope . headers , 
4536        items : envelope . items . map  do  |item |
@@ -50,26 +41,35 @@ def send_envelope(envelope)
5041        end 
5142      } 
5243
53-       File . open ( log_file_path ,  "a" )  do  |file |
54-         file  << JSON . dump ( envelope_data )  << "\n " 
55-       end 
56- 
57-       if  http_transport 
58-         http_transport . send_envelope ( envelope ) 
59-       end 
44+       File . open ( log_file ,  "a" )  {  |file | file  << JSON . dump ( envelope_json )  << "\n "  } 
6045    end 
6146
62-     def  events 
63-       return  [ ]  unless  File . exist? ( log_file_path ) 
47+     def  logged_envelopes 
48+       return  [ ]  unless  File . exist? ( log_file ) 
6449
65-       File . readlines ( log_file_path ) . map  do  |line |
50+       File . readlines ( log_file ) . map  do  |line |
6651        JSON . parse ( line ) 
6752      end 
6853    end 
6954
7055    def  clear 
71-       File . write ( log_file_path ,  "" ) 
72-       log_debug ( "DebugTransport: Cleared events from #{ log_file_path }  ) 
56+       File . write ( log_file ,  "" ) 
57+       log_debug ( "DebugTransport: Cleared events from #{ log_file }  ) 
58+     end 
59+ 
60+     private 
61+ 
62+     def  initialize_backend ( configuration ) 
63+       backend  =  configuration . dsn . local?  ? DummyTransport  : HTTPTransport 
64+       backend . new ( configuration ) 
65+     end 
66+ 
67+     def  initialize_log_file ( configuration ) 
68+       log_file  =  Pathname ( configuration . sdk_debug_transport_log_file  || DEFAULT_LOG_FILE_PATH ) 
69+ 
70+       FileUtils . mkdir_p ( log_file . dirname )  unless  log_file . dirname . exist? 
71+ 
72+       log_file 
7373    end 
7474  end 
7575end 
0 commit comments