Notifications - rselk/sidekiq GitHub Wiki
Sidekiq can optionally send notifications when a Batch is complete. A batch is complete when all of its jobs have executed once. If a batch has five jobs and four finish successfully and one raises an error, that batch is considered complete, even though that one job might be retried for the next few days.
batch = Sidekiq::Batch.new
batch.on(:complete, Sidekiq::Notifications::Campfire)
batch.on(:complete, Sidekiq::Notifications::Email, :to => '[email protected]')
batch.on(:complete, Sidekiq::Notifications::Webhook, url: 'https://acmecorp.com/batch/done')
batch.jobs do
# you can mix and match workers as necessary
10.times do |idx|
IndexWorker.perform_async(idx)
end
SomeClass.delay.some_method
end
This will ping Campfire, send an email to [email protected] and POST a JSON payload to a URL when a batch is complete.
Configuration
Global notification configuration can be done in an initializer:
Sidekiq.configure_server do |config|
config.options[:web] = 'https://example.org/sidekiq' # optional location of Sidekiq-Web for linking to batch status
config.options[:notifications][:campfire] = {
:subdomain => 'acmecorp',
:roomid => 111111,
:token => '417',
}
config.options[:notifications][:hipchat] = {
:roomid => 111111,
:token => '0a01238109238102380123',
}
config.options[:notifications][:webhook] = {
:url => 'https://default/url',
:username => 'mike', # optional, for Basic Auth support
:password => 'xyzzy',
}
config.options[:notifications][:email] = {
:to => '[email protected]',
:via => :smtp,
:via_options => {
:address => 'smtp.yourserver.com',
:port => '25',
:user_name => 'user',
:password => 'password',
:authentication => :plain, # :plain, :login, :cram_md5, no auth by default
:domain => "localhost.localdomain" # the HELO domain provided by the client to the server
}
}
end
Sidekiq uses Pony to send emails. The options hash above is passed directly to the Pony.mail
method so any configuration options for Pony can easily be changed. See the Pony documentation for further details. You must add Pony to your Gemfile manually for email notification to work.
Job-Specific Configuration
batch.on(:complete, Sidekiq::Notifications::Campfire)
batch.on(:complete, Sidekiq::Notifications::Email, :to => '[email protected]')
If you want to override the global configuration, just pass the same options into the Batch#on
method. Sidekiq will merge the options so they override any global defaults.
Pub/Sub
The result of every batch and batch job is sent to the batch-#{bid}
channel in Redis. If you want to follow the progress of a batch in real-time, your code can subscribe to that channel and update the user. Sidekiq sends the following tokens:
+
- a job succeeded-
- a job failed (and might be retried)!
- the batch is considered complete now, all jobs have executed$
- the batch has succeeded, all jobs executed successfully
# NB: this is a blocking, infinite loop.
Sidekiq.redis do |conn|
conn.psubscribe("batch-*") do |on|
on.pmessage do |pattern, channel, msg|
# channel = 'batch-123456789'
# msg = '-', '+', '$' or '!'
if msg == "$"
conn.punsubscribe
# a batch has succeeded, do something with it.
bid = channel.match(/batch-(.+)/)[1]
finalize_batch(bid)
end
end
end
end
Example Webhook Payload
Here's an example POST body for a complete message. The batch had 50 jobs; 2 failed and are still pending retry.
{"is_complete"=>true,
"bid"=>"887f4eea1c92",
"total"=>50,
"pending"=>2,
"description"=>nil,
"failures"=>2,
"created_at"=>1238624459.0,
"fail_info"=>
[{"jid"=>"abcdef",
"error_class"=>"RuntimeError",
"error_message"=>"Something failed",
"backtrace"=>nil},
{"jid"=>"187635",
"error_class"=>"ArgumentError",
"error_message"=>"Oops, failed",
"backtrace"=>nil}]}