Module: BrainzLab::Nerve

Defined in:
lib/brainzlab/nerve.rb,
lib/brainzlab/nerve/client.rb,
lib/brainzlab/nerve/provisioner.rb

Defined Under Namespace

Classes: Client, Provisioner

Class Method Summary collapse

Class Method Details

.clientObject



202
203
204
# File 'lib/brainzlab/nerve.rb', line 202

def client
  @client ||= Client.new(BrainzLab.configuration)
end

.delete(job_id) ⇒ Object

Delete a job



133
134
135
136
137
138
139
140
# File 'lib/brainzlab/nerve.rb', line 133

def delete(job_id)
  return false unless enabled?

  ensure_provisioned!
  return false unless BrainzLab.configuration.nerve_valid?

  client.delete_job(job_id)
end

.ensure_provisioned!Object

INTERNAL ===



191
192
193
194
195
196
# File 'lib/brainzlab/nerve.rb', line 191

def ensure_provisioned!
  return if @provisioned

  @provisioned = true
  provisioner.ensure_project!
end

.jobs(queue: nil, status: nil, limit: 100) ⇒ Object

List recent jobs



93
94
95
96
97
98
99
100
# File 'lib/brainzlab/nerve.rb', line 93

def jobs(queue: nil, status: nil, limit: 100)
  return [] unless enabled?

  ensure_provisioned!
  return [] unless BrainzLab.configuration.nerve_valid?

  client.list_jobs(queue: queue, status: status, limit: limit)
end

.provisionerObject



198
199
200
# File 'lib/brainzlab/nerve.rb', line 198

def provisioner
  @provisioner ||= Provisioner.new(BrainzLab.configuration)
end

.queue(name) ⇒ Object

Get queue details



113
114
115
116
117
118
119
120
# File 'lib/brainzlab/nerve.rb', line 113

def queue(name)
  return nil unless enabled?

  ensure_provisioned!
  return nil unless BrainzLab.configuration.nerve_valid?

  client.get_queue(name)
end

.queuesObject

List all queues



103
104
105
106
107
108
109
110
# File 'lib/brainzlab/nerve.rb', line 103

def queues
  return [] unless enabled?

  ensure_provisioned!
  return [] unless BrainzLab.configuration.nerve_valid?

  client.list_queues
end

.report_failure(job_class:, job_id:, queue:, error:, started_at: nil, **attributes) ⇒ Object

Report a failed job



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/brainzlab/nerve.rb', line 43

def report_failure(job_class:, job_id:, queue:, error:, started_at: nil, **attributes)
  return false unless enabled?

  ensure_provisioned!
  return false unless BrainzLab.configuration.nerve_valid?

  client.report_failure(
    job_class: job_class,
    job_id: job_id,
    queue: queue,
    error_class: error.class.name,
    error_message: error.message,
    backtrace: error.backtrace,
    started_at: started_at,
    **attributes
  )
end

.report_metrics(queue:, size:, latency_ms: nil, workers: nil) ⇒ Object

Report queue metrics (for custom job backends)



143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/brainzlab/nerve.rb', line 143

def report_metrics(queue:, size:, latency_ms: nil, workers: nil)
  return false unless enabled?

  ensure_provisioned!
  return false unless BrainzLab.configuration.nerve_valid?

  client.report_metrics(
    queue: queue,
    size: size,
    latency_ms: latency_ms,
    workers: workers
  )
end

.report_started(job_class:, job_id:, queue:, **attributes) ⇒ Object

Report a job that’s currently running



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/brainzlab/nerve.rb', line 62

def report_started(job_class:, job_id:, queue:, **attributes)
  return false unless enabled?

  ensure_provisioned!
  return false unless BrainzLab.configuration.nerve_valid?

  client.report_job(
    job_class: job_class,
    job_id: job_id,
    queue: queue,
    status: 'running',
    started_at: Time.now,
    ended_at: Time.now,
    **attributes
  )
end

.report_success(job_class:, job_id:, queue:, started_at:, ended_at: Time.now, **attributes) ⇒ Object

Report a completed job

Examples:

BrainzLab::Nerve.report_success(
  job_class: "ProcessOrderJob",
  job_id: "abc-123",
  queue: "default",
  started_at: 1.minute.ago
)

Parameters:

  • job_class (String)

    Job class name

  • job_id (String)

    Job ID

  • queue (String)

    Queue name

  • started_at (Time)

    When job started

  • ended_at (Time) (defaults to: Time.now)

    When job ended (defaults to now)

  • attributes (Hash)

    Additional attributes



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/brainzlab/nerve.rb', line 25

def report_success(job_class:, job_id:, queue:, started_at:, ended_at: Time.now, **attributes)
  return false unless enabled?

  ensure_provisioned!
  return false unless BrainzLab.configuration.nerve_valid?

  client.report_job(
    job_class: job_class,
    job_id: job_id,
    queue: queue,
    status: 'completed',
    started_at: started_at,
    ended_at: ended_at,
    **attributes
  )
end

.reset!Object



206
207
208
209
210
# File 'lib/brainzlab/nerve.rb', line 206

def reset!
  @client = nil
  @provisioner = nil
  @provisioned = false
end

.retry(job_id) ⇒ Object

Retry a failed job



123
124
125
126
127
128
129
130
# File 'lib/brainzlab/nerve.rb', line 123

def retry(job_id)
  return false unless enabled?

  ensure_provisioned!
  return false unless BrainzLab.configuration.nerve_valid?

  client.retry_job(job_id)
end

.stats(queue: nil, job_class: nil, period: '1h') ⇒ Object

Get job statistics

Parameters:

  • queue (String) (defaults to: nil)

    Filter by queue (optional)

  • job_class (String) (defaults to: nil)

    Filter by job class (optional)

  • period (String) (defaults to: '1h')

    Time period: “1h”, “24h”, “7d”, “30d”



83
84
85
86
87
88
89
90
# File 'lib/brainzlab/nerve.rb', line 83

def stats(queue: nil, job_class: nil, period: '1h')
  return nil unless enabled?

  ensure_provisioned!
  return nil unless BrainzLab.configuration.nerve_valid?

  client.stats(queue: queue, job_class: job_class, period: period)
end

.track(job_class:, job_id:, queue: 'default', **attributes) ⇒ Object

Track a job execution (block helper)

Examples:

BrainzLab::Nerve.track(job_class: "MyJob", job_id: "123", queue: "default") do
  # job work
end


163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
# File 'lib/brainzlab/nerve.rb', line 163

def track(job_class:, job_id:, queue: 'default', **attributes)
  started_at = Time.now

  begin
    result = yield
    report_success(
      job_class: job_class,
      job_id: job_id,
      queue: queue,
      started_at: started_at,
      **attributes
    )
    result
  rescue StandardError => e
    report_failure(
      job_class: job_class,
      job_id: job_id,
      queue: queue,
      error: e,
      started_at: started_at,
      **attributes
    )
    raise
  end
end