Class: PushyDaemon::Shouter

Inherits:
Endpoint show all
Includes:
NewRelic::Agent::Instrumentation::ControllerInstrumentation
Defined in:
lib/pushyd/shouter.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeShouter



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/pushyd/shouter.rb', line 12

def initialize
  # Init
  super
  @keys = []

  # Check config
  config_shout = Conf[:shout]
  unless config_shout && config_shout.any? && config_shout.is_a?(Enumerable)
    error "prepare: empty [shout] section"
    return
  end

  # Extract information
  @keys = config_shout[:keys] if config_shout[:keys].is_a? Array
  @topic = config_shout[:topic]
  @period = config_shout[:period] || 0

  # Start connexion to RabbitMQ and create channel
  @channel = connect_channel Conf.bus
  info "channel connected"

  # Create exchange
  fail PushyDaemon::EndpointTopicContext unless @topic
  @exchange = @channel.topic(@topic, durable: true, persistent: true)

  # Send shouter info to logs
  shouter_info = { topic: @topic, period: @period, keys: @keys }
  info "shouter initialized"
  info shouter_info

rescue Bunny::TCPConnectionFailedForAllHosts => e
  error "ERROR: cannot connect to RabbitMQ hosts (#{e.inspect})"
end

Instance Attribute Details

#tableObject

Returns the value of attribute table.



10
11
12
# File 'lib/pushyd/shouter.rb', line 10

def table
  @table
end

Instance Method Details

#shoutObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/pushyd/shouter.rb', line 46

def shout
  return unless @exchange

  # Prepare exchange
  loop do
    random_string = SecureRandom.hex
    random_key = @keys.sample || "random"
    channel_shout [:ping, random_key, random_string], {}
    sleep @period
  end
rescue AMQ::Protocol::EmptyResponseError => e
  fail PushyDaemon::ShouterResponseError, "#{e.class} (#{e.inspect})"
rescue Bunny::ChannelAlreadyClosed => e
  fail PushyDaemon::ShouterChannelClosed, "#{e.class} (#{e.inspect})"
rescue Bunny::PreconditionFailed => e
  fail PushyDaemon::ShouterPreconditionFailed, "#{e.class} (#{e.inspect})"
rescue Interrupt => e
  @channel.close
  fail PushyDaemon::ShouterInterrupted, "#{e.class} (#{e.inspect})"
end