class Librato::Sidekiq::Middleware

Public Class Methods

configure() { |self| ... } click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 29
def self.configure
  yield(self) if block_given?
  reconfigure
  new
end
new(options = {}) click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 14
def initialize(options = {})
  # hard dependency on one or the other being present
  rails = !!defined?(Librato::Rails)
  rack = !!defined?(Librato::Rack)
  fail 'librato-sidekiq depends on having one of librato-rails or librato-rack installed' unless rails || rack

  # librato-rails >= 0.10 changes behavior of reporting agent
  if File.basename($PROGRAM_NAME) == 'sidekiq' && rails && Librato::Rails::VERSION.split('.')[1].to_i >= 10 && ENV['LIBRATO_AUTORUN'].nil?
    puts 'NOTICE: --------------------------------------------------------------------'
    puts 'NOTICE: THE REPORTING AGENT HAS NOT STARTED, AND NO METRICS WILL BE SENT'
    puts 'NOTICE: librato-rails >= 0.10 requires LIBRATO_AUTORUN=1 in your environment'
    puts 'NOTICE: --------------------------------------------------------------------'
  end
end
options() click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 49
def self.options
  {
    enabled: enabled,
    whitelist_queues: whitelist_queues,
    blacklist_queues: blacklist_queues,
    whitelist_classes: whitelist_classes,
    blacklist_classes: blacklist_classes
  }
end
reconfigure() click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 35
def self.reconfigure
  # puts "Reconfiguring with: #{options}"
  ::Sidekiq.configure_server do |config|
    config.client_middleware do |chain|
      chain.remove ClientMiddleware
      chain.add ClientMiddleware, options
    end
    config.server_middleware do |chain|
      chain.remove self
      chain.add self, options
    end
  end
end

Public Instance Methods

call(worker_instance, msg, queue, redis_pool = nil) { || ... } click to toggle source

redis_pool is needed for the sidekiq 3 upgrade github.com/mperham/sidekiq/blob/master/3.0-Upgrade.md

# File lib/librato-sidekiq/middleware.rb, line 61
def call(worker_instance, msg, queue, redis_pool = nil)
  start_time = Time.now
  result = yield
  elapsed = (Time.now - start_time).to_f

  return result unless enabled
  # puts "#{worker_instance} #{queue}"

  stats = ::Sidekiq::Stats.new

  Librato.group 'sidekiq' do |sidekiq|
    track sidekiq, stats, worker_instance, msg, queue, elapsed
  end

  result
end

Private Instance Methods

allowed_to_submit(queue, worker_instance) click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 125
def allowed_to_submit(queue, worker_instance)
  class_in_whitelist(worker_instance) && !class_in_blacklist(worker_instance) && queue_in_whitelist(queue) && !queue_in_blacklist(queue)
end
class_in_blacklist(worker_instance) click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 121
def class_in_blacklist(worker_instance)
  blacklist_classes.include?(worker_instance.class.to_s)
end
class_in_whitelist(worker_instance) click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 117
def class_in_whitelist(worker_instance)
  whitelist_classes.nil? || whitelist_classes.empty? || whitelist_classes.include?(worker_instance.class.to_s)
end
queue_in_blacklist(queue) click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 113
def queue_in_blacklist(queue)
  blacklist_queues.include?(queue.to_s)
end
queue_in_whitelist(queue) click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 109
def queue_in_whitelist(queue)
  whitelist_queues.nil? || whitelist_queues.empty? || whitelist_queues.include?(queue.to_s)
end
submit_general_stats(group, stats) click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 98
def submit_general_stats(group, stats)
  group.increment 'processed'
  {
    enqueued: nil,
    failed: nil,
    scheduled_size: 'scheduled'
  }.each do |method, name|
    group.measure((name || method).to_s, stats.send(method).to_i)
  end
end
track(tracking_group, stats, worker_instance, msg, queue, elapsed) click to toggle source
# File lib/librato-sidekiq/middleware.rb, line 80
def track(tracking_group, stats, worker_instance, msg, queue, elapsed)
  submit_general_stats tracking_group, stats
  return unless allowed_to_submit queue, worker_instance
  # puts "doing Librato insert"
  tracking_group.group queue.to_s do |q|
    q.increment 'processed'
    q.timing 'time', elapsed
    q.measure 'enqueued', stats.queues[queue].to_i

    # using something like User.delay.send_email invokes
    # a class name with slashes. remove them in favor of underscores
    q.group msg['class'].underscore.gsub('/', '_') do |w|
      w.increment 'processed'
      w.timing 'time', elapsed
    end
  end
end