Module: Sensu::Daemon

Includes:
Utilities
Included in:
API, Client, Server
Defined in:
lib/sensu/daemon.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Utilities

#deep_merge, #random_uuid, #redact_sensitive, #retry_until_true, #testing?

Instance Attribute Details

#stateObject (readonly)

Returns the value of attribute state.



33
34
35
# File 'lib/sensu/daemon.rb', line 33

def state
  @state
end

Instance Method Details

#initialize(options = {}) ⇒ Object



35
36
37
38
39
40
41
42
43
44
# File 'lib/sensu/daemon.rb', line 35

def initialize(options={})
  @state = :initializing
  @timers = {
    :run => Array.new
  }
  setup_logger(options)
  load_settings(options)
  load_extensions(options)
  setup_process(options)
end

#load_extensions(options = {}) ⇒ Object



70
71
72
73
74
75
76
77
78
# File 'lib/sensu/daemon.rb', line 70

def load_extensions(options={})
  @extensions = Extensions.get(options)
  log_concerns(@extensions.warnings)
  extension_settings = @settings.to_hash.dup
  @extensions.all.each do |extension|
    extension.logger = @logger
    extension.settings = extension_settings
  end
end

#load_settings(options = {}) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
# File 'lib/sensu/daemon.rb', line 58

def load_settings(options={})
  @settings = Settings.get(options)
  log_concerns(@settings.warnings)
  failures = @settings.validate
  unless failures.empty?
    @logger.fatal('invalid settings')
    log_concerns(failures, :fatal)
    @logger.fatal('SENSU NOT RUNNING!')
    exit 2
  end
end

#log_concerns(concerns = [], level = :warn) ⇒ Object



51
52
53
54
55
56
# File 'lib/sensu/daemon.rb', line 51

def log_concerns(concerns=[], level=:warn)
  concerns.each do |concern|
    message = concern.delete(:message)
    @logger.send(level, message, redact_sensitive(concern))
  end
end

#pauseObject



93
94
95
# File 'lib/sensu/daemon.rb', line 93

def pause
  @state = :paused
end

#resumeObject



97
98
99
# File 'lib/sensu/daemon.rb', line 97

def resume
  @state = :running
end

#setup_logger(options = {}) ⇒ Object



46
47
48
49
# File 'lib/sensu/daemon.rb', line 46

def setup_logger(options={})
  @logger = Logger.get(options)
  @logger.setup_signal_traps
end

#setup_process(options) ⇒ Object



80
81
82
83
84
85
86
87
# File 'lib/sensu/daemon.rb', line 80

def setup_process(options)
  if options[:daemonize]
    daemonize
  end
  if options[:pid_file]
    write_pid(options[:pid_file])
  end
end

#setup_redisObject



152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/sensu/daemon.rb', line 152

def setup_redis
  @logger.debug('connecting to redis', {
    :settings => @settings[:redis]
  })
  @redis = Redis.connect(@settings[:redis])
  @redis.on_error do |error|
    @logger.fatal('redis connection error', {
      :error => error.to_s
    })
    stop
  end
  @redis.before_reconnect do
    unless testing?
      @logger.warn('reconnecting to redis')
      pause
    end
  end
  @redis.after_reconnect do
    @logger.info('reconnected to redis')
    resume
  end
end

#setup_signal_trapsObject



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/sensu/daemon.rb', line 107

def setup_signal_traps
  @signals = Array.new
  STOP_SIGNALS.each do |signal|
    Signal.trap(signal) do
      @signals << signal
    end
  end
  EM::PeriodicTimer.new(1) do
    signal = @signals.shift
    if STOP_SIGNALS.include?(signal)
      @logger.warn('received signal', {
        :signal => signal
      })
      stop
    end
  end
end

#setup_transportObject



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/sensu/daemon.rb', line 125

def setup_transport
  transport_name = @settings[:transport][:name] || 'rabbitmq'
  transport_settings = @settings[transport_name]
  @logger.debug('connecting to transport', {
    :name => transport_name,
    :settings => transport_settings
  })
  Transport.logger = @logger
  @transport = Transport.connect(transport_name, transport_settings)
  @transport.on_error do |error|
    @logger.fatal('transport connection error', {
      :error => error.to_s
    })
    stop
  end
  @transport.before_reconnect do
    unless testing?
      @logger.warn('reconnecting to transport')
      pause
    end
  end
  @transport.after_reconnect do
    @logger.info('reconnected to transport')
    resume
  end
end

#startObject



89
90
91
# File 'lib/sensu/daemon.rb', line 89

def start
  @state = :running
end

#stopObject



101
102
103
104
105
# File 'lib/sensu/daemon.rb', line 101

def stop
  @state = :stopped
  @logger.warn('stopping reactor')
  EM::stop_event_loop
end