Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enhanced Sidekiq and SuckerPunch configuration #73

Merged
merged 9 commits into from
Nov 19, 2013
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -206,21 +206,21 @@ Asynchronous reporting falls back to Threading if girl_friday is not installed.
Add the following in ```config/initializers/rollbar.rb```:

```ruby
config.use_sucker_punch = true
config.use_sucker_punch
```

### Using Sidekiq

Add the following in ```config/initializers/rollbar.rb```:

```ruby
config.use_sidekiq = true
config.use_sidekiq
```

You can also supply custom Sidekiq options:

```ruby
config.use_sidekiq = { 'queue' => 'my_queue' }
config.use_sidekiq { 'queue' => 'my_queue' }
```

Start the redis server:
Expand Down
6 changes: 3 additions & 3 deletions lib/generators/rollbar/templates/initializer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@
# }

# Enable asynchronous reporting (using sucker_punch)
# config.use_sucker_punch = true
# config.use_sucker_punch

# Enable delayed reporting (using Sidekiq)
# config.use_sidekiq = true
# config.use_sidekiq
# You can supply custom Sidekiq options:
# config.use_sidekiq = { 'queue' => 'my_queue' }
# config.use_sidekiq { 'queue' => 'my_queue' }
end
32 changes: 21 additions & 11 deletions lib/rollbar/configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -63,21 +63,31 @@ def initialize
@write_to_file = false
end

def use_sidekiq(options = {})
require 'rollbar/delay/sidekiq' if defined?(Sidekiq)
@use_async = true
@use_sidekiq = true
@async_handler = Rollbar::Delay::Sidekiq.new(options)
end

def use_sidekiq=(value)
if value
require 'rollbar/delay/sidekiq' if defined?(Sidekiq)
@use_async = true
@use_sidekiq = value
@async_handler = Rollbar::Delay::Sidekiq.method(:handle)
end
deprecation_message = "#use_sidekiq=(value) has been deprecated in favor of #use_sidekiq(options = {}). Please update your rollbar configuration."
defined?(ActiveSupport) ? ActiveSupport::Deprecation.warn(deprecation_message) : puts(deprecation_message)

value.is_a?(Hash) ? use_sidekiq(value) : use_sidekiq
end

def use_sucker_punch
require 'rollbar/delay/sucker_punch' if defined?(SuckerPunch)
@use_async = true
@async_handler = Rollbar::Delay::SuckerPunch.new
end

def use_sucker_punch=(value)
if value
require 'rollbar/delay/sucker_punch' if defined?(SuckerPunch)
@use_async = true
@async_handler = Rollbar::Delay::SuckerPunch.method(:handle)
end
deprecation_message = "#use_sucker_punch=(value) has been deprecated in favor of #use_sucker_punch. Please update your rollbar configuration."
defined?(ActiveSupport) ? ActiveSupport::Deprecation.warn(deprecation_message) : puts(deprecation_message)

use_sucker_punch
end

def use_eventmachine=(value)
Expand Down
8 changes: 5 additions & 3 deletions lib/rollbar/delay/sidekiq.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@ module Delay
class Sidekiq
OPTIONS = { 'queue' => 'rollbar', 'class' => self.name }.freeze

def self.handle(payload)
item = Rollbar.configuration.use_sidekiq.is_a?(Hash) ? OPTIONS.merge(Rollbar.configuration.use_sidekiq) : OPTIONS
def initialize(*args)
@options = (opts = args.shift) ? OPTIONS.merge(opts) : OPTIONS
end

::Sidekiq::Client.push item.merge('args' => [payload])
def call(payload)
::Sidekiq::Client.push @options.merge('args' => [payload])
end

include ::Sidekiq::Worker
Expand Down
8 changes: 4 additions & 4 deletions lib/rollbar/delay/sucker_punch.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
module Rollbar
module Delay
class SuckerPunch
def self.handle(payload)
@@sucker_punch_worker ||= self.new
@@sucker_punch_worker.async.perform payload
end

include ::SuckerPunch::Job

def call(payload)
async.perform payload
end

def perform(*args)
Rollbar.process_payload(*args)
end
Expand Down
77 changes: 49 additions & 28 deletions spec/delay/sidekiq_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,60 @@

begin
require 'rollbar/delay/sidekiq'
require 'sidekiq/testing'
rescue LoadError
module Rollbar
module Delay
class Sidekiq
end
end
end
end

if defined?(Sidekiq)
describe Rollbar::Delay::Sidekiq do
before(:each) do
reset_configuration
describe Rollbar::Delay::Sidekiq, :if => RUBY_VERSION != '1.8.7' do
let(:payload) { anything }

describe "#perform" do
it "performs payload" do
Rollbar.should_receive(:process_payload).with(payload)
subject.perform payload
end

describe ".handler" do
let(:payload) { anything }

context "with default options" do
before { Rollbar.configuration.use_sidekiq = true }

it "enqueues to default queue" do
::Sidekiq::Client.should_receive(:push).with(Rollbar::Delay::Sidekiq::OPTIONS.merge('args' => payload))
Rollbar::Delay::Sidekiq.handle(payload)
end
end

describe "#call" do
shared_examples "a Rollbar processor" do

it "processes payload" do
Rollbar.should_receive(:process_payload).with(payload)

subject.call payload
described_class.drain
end

context "with custom options" do
let(:custom_config) { { 'queue' => 'custom_queue' } }

before { Rollbar.configuration.use_sidekiq = custom_config }

it "enqueues to custom queue" do
options = Rollbar::Delay::Sidekiq::OPTIONS.merge(custom_config.merge('args' => payload))
::Sidekiq::Client.should_receive(:push).with options

Rollbar::Delay::Sidekiq.handle(payload)
end
end

context "with default options" do
it "enqueues to default queue" do
options = Rollbar::Delay::Sidekiq::OPTIONS.merge('args' => payload)
::Sidekiq::Client.should_receive(:push).with options

subject.call payload
end

it_behaves_like "a Rollbar processor"
end

context "with custom options" do
let(:custom_config) { { 'queue' => 'custom_queue' } }
subject { Rollbar::Delay::Sidekiq.new custom_config }

it "enqueues to custom queue" do
options = Rollbar::Delay::Sidekiq::OPTIONS.merge(custom_config.merge('args' => payload))
::Sidekiq::Client.should_receive(:push).with options

subject.call payload
end

it_behaves_like "a Rollbar processor"
end
end
end
end
25 changes: 25 additions & 0 deletions spec/delay/sucker_punch_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
require 'spec_helper'

begin
require 'rollbar/delay/sucker_punch'
require 'sucker_punch/testing/inline'
rescue LoadError
module Rollbar
module Delay
class SuckerPunch
end
end
end
end

describe Rollbar::Delay::SuckerPunch, :if => RUBY_VERSION != '1.8.7' do
describe "#call" do
let(:payload) { "anything" }

it "performs asynchronously the task" do
Rollbar.should_receive(:process_payload)

subject.call payload
end
end
end
41 changes: 22 additions & 19 deletions spec/rollbar_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -370,44 +370,47 @@ def backtrace
end
end

if defined?(SuckerPunch)
describe "#use_sucker_punch", :if => defined?(SuckerPunch) do
it "should send the payload to sucker_punch delayer" do
logger_mock.should_receive(:info).with('[Rollbar] Scheduling payload')
logger_mock.should_receive(:info).with('[Rollbar] Sending payload')
logger_mock.should_receive(:info).with('[Rollbar] Success')

Rollbar.configure do |config|
config.use_sucker_punch = true
config.use_sucker_punch
end

Rollbar.report_exception(@exception)

Rollbar.configure do |config|
config.use_async = false
config.async_handler = Rollbar.method(:default_async_handler)
end
end
end

it "should send the payload to sidekiq delayer" do
module Rollbar
module Delay
class Sidekiq
end
end
describe "#use_sidekiq", :if => defined?(Sidekiq) do
it "should instanciate sidekiq delayer with custom values" do
Rollbar::Delay::Sidekiq.should_receive(:new).with('queue' => 'test_queue')
config = Rollbar::Configuration.new
config.use_sidekiq 'queue' => 'test_queue'
end

Rollbar::Delay::Sidekiq.should_receive(:handle).with(anything)
it "should send the payload to sidekiq delayer" do
handler = double('sidekiq_handler_mock')
handler.should_receive(:call)

Rollbar.configure do |config|
config.use_sidekiq = { 'queue' => 'test_queue' }
end
Rollbar.configure do |config|
config.use_sidekiq
config.async_handler = handler
end

Rollbar.report_exception(@exception)
Rollbar.report_exception(@exception)

Rollbar.configure do |config|
config.use_async = false
config.async_handler = Rollbar.method(:default_async_handler)
Rollbar.configure do |config|
config.use_async = false
config.async_handler = Rollbar.method(:default_async_handler)
end
end
end
end
Expand Down