sidekiq-amigo 1.2.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/amigo/version.rb +1 -1
  3. data/lib/amigo.rb +29 -5
  4. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 53361c37c9ec31b3886fb7b33ff61bd022802128b458f93e624c4f0d0cbcc963
4
- data.tar.gz: 54a9e75e5b011d6441b8906404a0d856394e19c4d27e66e7580c37d4928e3d41
3
+ metadata.gz: 56470f3e16978212a6e8a23d970c7709c0f24854b80c15d522989389e0cc829e
4
+ data.tar.gz: 2bed22f2a190e056aa715814f460ba009fd2c2d3884e6d34eb866084659af962
5
5
  SHA512:
6
- metadata.gz: b469583cc5c2e339d359834763d3a67c154e9977212b35f039623f937b4b55997b7a523ba8f5c414898295c18c65d401a020b9679c4d695c50d636ef5c7334db
7
- data.tar.gz: ab70f5da69a2bb8868c9ec864c760eb1d6fc124a99d71e2ad332a8dccd7ba8503971dfb0ee3a60d19d122e5ce079b5f9a4dc6a5a3df2a8c05057b19f2963c172
6
+ metadata.gz: 18ac44e7cffa487844980f937193ac4601585e380aa08c85599591181271e3ded429271be3407d120e0bf280c541c0f9c28ca23c2c5e9a528deda26c16ca8735
7
+ data.tar.gz: 243229bf9a1f661eb6ef4b9fe847a979634fa729df34e756016f6f2c403ae1e8f73d444e437e640b86d300e38169a391b72f1676a49e985aeac11d41684c4974
data/lib/amigo/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Amigo
4
- VERSION = "1.2.2"
4
+ VERSION = "1.3.0"
5
5
  end
data/lib/amigo.rb CHANGED
@@ -140,7 +140,18 @@ module Amigo
140
140
  # An Array of callbacks to be run when an event is published.
141
141
  attr_accessor :subscribers
142
142
 
143
- # A single callback to be run when an event publication errors.
143
+ # A single callback to be run when an event publication errors,
144
+ # almost always due to an error in a subscriber.
145
+ #
146
+ # The callback receives the exception, the event being published, and the erroring subscriber.
147
+ #
148
+ # If this is not set, errors from subscribers will be re-raised immediately,
149
+ # since broken subscribers usually indicate a broken application.
150
+ #
151
+ # Note also that when an error occurs, Amigo.log is always called first.
152
+ # You do NOT need a callback that just logs and swallows the error.
153
+ # If all you want to do is log, and not propogate the error,
154
+ # you can use `Amigo.on_publish_error = proc {}`.
144
155
  attr_accessor :on_publish_error
145
156
 
146
157
  # Publish an event with the specified +eventname+ and +payload+
@@ -151,12 +162,18 @@ module Amigo
151
162
  self.subscribers.to_a.each do |hook|
152
163
  hook.call(ev)
153
164
  rescue StandardError => e
154
- self.log(nil, :error, "amigo_subscriber_hook_error", error: e, hook: hook, event: ev)
155
- self.on_publish_error.call(e)
165
+ self.log(nil, :error, "amigo_subscriber_hook_error", error: e, hook: hook, event: ev&.as_json)
166
+ raise e if self.on_publish_error.nil?
167
+ if self.on_publish_error.respond_to?(:arity) && self.on_publish_error.arity == 1
168
+ self.on_publish_error.call(e)
169
+ else
170
+ self.on_publish_error.call(e, ev, hook)
171
+ end
156
172
  end
157
173
  end
158
174
 
159
175
  # Register a hook to be called when an event is sent.
176
+ # If a subscriber errors, on_publish_error is called with the exception, event, and subscriber.
160
177
  def register_subscriber(&block)
161
178
  raise LocalJumpError, "no block given" unless block
162
179
  self.log nil, :info, "amigo_installed_subscriber", block: block
@@ -191,7 +208,15 @@ module Amigo
191
208
 
192
209
  def _subscriber(event)
193
210
  event_json = event.as_json
194
- self.audit_logger_class.perform_async(event_json)
211
+ begin
212
+ self.audit_logger_class.perform_async(event_json)
213
+ rescue StandardError => e
214
+ # If the audit logger cannot perform, let's say because Redis is down,
215
+ # we can run the job manually. This is pretty important for anything used for auditing;
216
+ # it should be as resilient as possible.
217
+ self.log(nil, :error, "amigo_audit_log_subscriber_error", error: e, event: event_json)
218
+ self.audit_logger_class.new.perform(event_json)
219
+ end
195
220
  self.router_class.perform_async(event_json)
196
221
  end
197
222
 
@@ -272,7 +297,6 @@ Amigo.reset_logging
272
297
  Amigo.synchronous_mode = false
273
298
  Amigo.registered_jobs = []
274
299
  Amigo.subscribers = Set.new
275
- Amigo.on_publish_error = proc {}
276
300
 
277
301
  require "amigo/audit_logger"
278
302
  require "amigo/router"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq-amigo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lithic Technology
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-09-05 00:00:00.000000000 Z
11
+ date: 2022-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq