Class: SidekiqVigil::Notifier::Slack

Inherits:
Base
  • Object
show all
Defined in:
lib/sidekiq_vigil/notifier/slack.rb

Constant Summary collapse

SPARKS =
"▁▂▃▄▅▆▇█"

Instance Attribute Summary

Attributes inherited from Base

#logger, #options

Instance Method Summary collapse

Methods inherited from Base

#inspect

Constructor Details

#initialize(options: {}, logger: SidekiqVigil.logger, transport: HttpTransport.new, sleeper: ->(seconds) { sleep(seconds) }, fallback: Log.new(logger:)) ⇒ Slack

Returns a new instance of Slack.



11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/sidekiq_vigil/notifier/slack.rb', line 11

def initialize(
  options: {},
  logger: SidekiqVigil.logger,
  transport: HttpTransport.new,
  sleeper: ->(seconds) { sleep(seconds) },
  fallback: Log.new(logger:)
)
  super(options:, logger:)
  @transport = transport
  @sleeper = sleeper
  @fallback = fallback
end

Instance Method Details

#notify(event) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/sidekiq_vigil/notifier/slack.rb', line 24

def notify(event)
  attempts = options.fetch(:retries, 3) + 1
  attempts.times do |attempt|
    response = transport.post(webhook_url(event), JSON.generate(payload(event)))
    return true if response.success?

    raise Error, "Slack returned HTTP #{response.code}"
  rescue StandardError => e
    if attempt == attempts - 1
      logger.error("[sidekiq-vigil] Slack notification failed after #{attempts} attempts: #{safe_error(e)}")
      fallback.notify(event)
      return false
    end
    sleeper.call(2**attempt)
  end
end

#payload(event) ⇒ Object



41
42
43
44
45
46
# File 'lib/sidekiq_vigil/notifier/slack.rb', line 41

def payload(event)
  {
    text: header(event),
    blocks: event.transition == :digest ? digest_blocks(event) : alert_blocks(event)
  }
end