module Slackiq

Constants

VERSION

Public Class Methods

configure(webhook_urls={}) click to toggle source

Configure all of the webhook URLs you’re going to use @author Jason Lew

# File lib/slackiq.rb, line 17
def configure(webhook_urls={})
  raise 'Argument must be a Hash' unless webhook_urls.class == Hash
  @@webhook_urls = webhook_urls
end
message(text, options) click to toggle source

Send a notification without Sidekiq batch info @author Jason Lew

# File lib/slackiq.rb, line 140
def message(text, options)
  url = @@webhook_urls[options[:webhook_name]]

  body = { 'text' => text }.to_json
  
  HTTParty.post(url, body: body)
end
notify(options={}) click to toggle source

Send a notification to Slack with Sidekiq info about the batch @author Jason Lew

# File lib/slackiq.rb, line 24
def notify(options={})  
  url = @@webhook_urls[options[:webhook_name]]
  title = options[:title]
  #description = options[:description]
  status = options[:status]
  
  if (bid = options[:bid]) && status.nil?
    raise "Sidekiq::Batch::Status is not defined. Are you sure Sidekiq Pro is set up correctly?" unless defined?(Sidekiq::Batch::Status)
    
    status = Sidekiq::Batch::Status.new(bid)
  end
  
  extra_fields = options.except(:webhook_name, :title, :description, :status)

  fields = []
  
  if status
    created_at = status.created_at
  
    if created_at
      time_now = Time.now
      duration = Slackiq::TimeHelper.elapsed_time_humanized(created_at, time_now)
      time_now_title = (status.complete? ? 'Completed' : 'Now')
    end
  
    total_jobs = status.total
    failures = status.failures
    jobs_run = total_jobs - status.pending

    completion_percentage = (jobs_run/total_jobs.to_f)*100
    failure_percentage = (failures/total_jobs.to_f)*100 if total_jobs && failures

    # round to two decimal places
    decimal_places = 2
    completion_percentage = completion_percentage.round(decimal_places)
    failure_percentage = failure_percentage.round(decimal_places)
    
    description = status.description

    fields += [
                {
                  'title' => 'Created',
                  'value' => Slackiq::TimeHelper.format(created_at),
                  'short' => true
                },
                {
                  'title' => time_now_title,
                  'value' => Slackiq::TimeHelper.format(time_now),
                  'short' => true
                },
                {
                  'title' => "Duration",
                  'value' => duration,
                  'short' => true
                },
                {
                  'title' => "Total Jobs",
                  'value' => total_jobs,
                  'short' => true
                },
                {
                  'title' => "Jobs Run",
                  'value' => jobs_run,
                  'short' => true
                },
                {
                  'title' => "Completion %",
                  'value' => "#{completion_percentage}%",
                  'short' => true
                },
                {
                  'title' => "Failures",
                  'value' => status.failures,
                  'short' => true
                },
                {
                  'title' => "Failure %",
                  'value' => "#{failure_percentage}%",
                  'short' => true
                },
              ]
  end
  
  
  
  # add extra fields
  fields += extra_fields.map do |title, value|
    {
      'title' => title,
      'value' => value,
      'short' => false
    }
  end
            
  attachments = 
  [
    {
      'fallback' => title,

      'color' => '#00ff66',

      'title' => title,

      'text' => description,

      'fields' => fields,
    }
]

  body = {attachments: attachments}.to_json
  
  HTTParty.post(url, body: body)
end