Class: RailsPulse::JobRunCollector

Inherits:
Object
  • Object
show all
Defined in:
lib/rails_pulse/job_run_collector.rb

Class Method Summary collapse

Class Method Details

.should_ignore_job?(job) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/rails_pulse/job_run_collector.rb', line 58

def should_ignore_job?(job)
  ignore_job?(job)
end

.track(active_job, adapter: detect_adapter) ⇒ Object



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
# File 'lib/rails_pulse/job_run_collector.rb', line 6

def track(active_job, adapter: detect_adapter)
  return yield unless tracking_enabled?
  return yield if ignore_job?(active_job)

  previous_request_id = RequestStore.store[:rails_pulse_request_id]
  previous_operations = RequestStore.store[:rails_pulse_operations]
  previous_job_run_id = RequestStore.store[:rails_pulse_job_run_id]

  start_time = Process.clock_gettime(Process::CLOCK_MONOTONIC)
  occurred_at = Time.current

  job = nil
  job_run = nil

  with_recording_suppressed do
    job = find_or_create_job(active_job)
    job_run = create_job_run(job, active_job, adapter, occurred_at)
  end

  RequestStore.store[:rails_pulse_request_id] = nil
  RequestStore.store[:rails_pulse_job_run_id] = job_run.id
  RequestStore.store[:rails_pulse_operations] = []

  yield

  duration = elapsed_time_ms(start_time)
  with_recording_suppressed do
    job_run.update!(status: "success", duration: duration)
  end
rescue => error
  duration = elapsed_time_ms(start_time)
  with_recording_suppressed do
    job_run.update!(
      status: failure_status_for(error),
      duration: duration,
      error_class: error.class.name,
      error_message: error.message
    ) if job_run
  end
  raise
ensure
  begin
    save_operations(job_run)
  rescue => e
    RailsPulse.logger.error "Failed to persist job operations: #{e.class} - #{e.message}"
  ensure
    RequestStore.store[:rails_pulse_job_run_id] = previous_job_run_id
    RequestStore.store[:rails_pulse_operations] = previous_operations
    RequestStore.store[:rails_pulse_request_id] = previous_request_id
  end
end