Class: EventTimeline::CallTracker
- Inherits:
-
Object
- Object
- EventTimeline::CallTracker
- Defined in:
- lib/event_timeline/call_tracker.rb
Constant Summary collapse
- THREAD_KEY_METHOD_STACK =
:event_timeline_method_stack- THREAD_KEY_EVENT_BUFFER =
:event_timeline_event_buffer
Class Attribute Summary collapse
-
.call_trace ⇒ Object
readonly
Returns the value of attribute call_trace.
-
.return_trace ⇒ Object
readonly
Returns the value of attribute return_trace.
Class Method Summary collapse
- .cleanup_thread_state(correlation_id) ⇒ Object
- .flush_events(correlation_id) ⇒ Object
- .install! ⇒ Object
- .installed? ⇒ Boolean
- .record_exception(exception, correlation_id) ⇒ Object
- .uninstall! ⇒ Object
Class Attribute Details
.call_trace ⇒ Object (readonly)
Returns the value of attribute call_trace.
9 10 11 |
# File 'lib/event_timeline/call_tracker.rb', line 9 def call_trace @call_trace end |
.return_trace ⇒ Object (readonly)
Returns the value of attribute return_trace.
9 10 11 |
# File 'lib/event_timeline/call_tracker.rb', line 9 def return_trace @return_trace end |
Class Method Details
.cleanup_thread_state(correlation_id) ⇒ Object
44 45 46 47 |
# File 'lib/event_timeline/call_tracker.rb', line 44 def cleanup_thread_state(correlation_id) thread_method_stack.delete(correlation_id) Thread.current[THREAD_KEY_EVENT_BUFFER] = [] end |
.flush_events(correlation_id) ⇒ Object
32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/event_timeline/call_tracker.rb', line 32 def flush_events(correlation_id) buffer = thread_event_buffer return if buffer.empty? Session.insert_all(buffer) RotationService.enforce_correlation_limit(correlation_id) RotationService.cleanup_if_needed rescue StandardError => e Rails.logger.error "EventTimeline flush failed: #{e.}" if defined?(Rails.logger) end |
.install! ⇒ Object
11 12 13 14 15 16 17 18 19 |
# File 'lib/event_timeline/call_tracker.rb', line 11 def install! return if installed? @call_trace = TracePoint.new(:call) { |tp| handle_call(tp) } @return_trace = TracePoint.new(:return) { |tp| handle_return(tp) } @call_trace.enable @return_trace.enable end |
.installed? ⇒ Boolean
28 29 30 |
# File 'lib/event_timeline/call_tracker.rb', line 28 def installed? @call_trace&.enabled? || @return_trace&.enabled? end |
.record_exception(exception, correlation_id) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/event_timeline/call_tracker.rb', line 49 def record_exception(exception, correlation_id) backtrace = clean_backtrace(exception.backtrace || []) source_location = extract_source_location(backtrace) buffer_event( name: "EXCEPTION: #{exception.class.name}", severity: 'error', category: 'exception', payload: { exception_class: exception.class.name, message: exception., backtrace: backtrace.first(10), source_file: source_location[:file], source_line: source_location[:line], source_method: source_location[:method] }, correlation_id: correlation_id, occurred_at: Time.current ) rescue StandardError => e Rails.logger.error "EventTimeline exception recording failed: #{e.}" if defined?(Rails.logger) end |
.uninstall! ⇒ Object
21 22 23 24 25 26 |
# File 'lib/event_timeline/call_tracker.rb', line 21 def uninstall! @call_trace&.disable @return_trace&.disable @call_trace = nil @return_trace = nil end |