Class: EventTimeline::CallTracker

Inherits:
Object
  • Object
show all
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

Class Method Summary collapse

Class Attribute Details

.call_traceObject (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_traceObject (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.message}" 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

Returns:

  • (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.message,
      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.message}" 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