sensu 0.9.4 → 0.9.5.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.org CHANGED
@@ -6,13 +6,11 @@
6
6
  [[http://portertech.ca/2011/11/01/sensu-a-monitoring-framework][Blog post]]
7
7
 
8
8
  [[http://www.sonian.com/cloud-tools/cloud-monitoring-sensu/][Homepage]]
9
-
10
9
  * Documentation
11
10
  - [[https://github.com/sonian/sensu/wiki][Sensu Wiki]].
12
11
  - [[http://joemiller.me/2012/01/19/getting-started-with-the-sensu-monitoring-framework/][Getting Started]]
13
12
  - [[http://joemiller.me/2012/01/24/re-use-nagios-plugins-in-sensu-for-quick-profit/][How to reuse your existing Nagios plugins]]
14
13
  - [[http://joemiller.me/2012/02/02/sensu-and-graphite/][Sensu and Graphite]]
15
-
16
14
  * Other Projects
17
15
  - [[https://github.com/sonian/sensu-community-plugins][Sensu Community Plugins]]
18
16
  - [[https://github.com/sonian/sensu-dashboard][Sensu Dashboard]]
data/lib/sensu.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sensu
2
- VERSION = "0.9.4"
2
+ VERSION = "0.9.5.beta"
3
3
  end
data/lib/sensu/api.rb CHANGED
@@ -46,6 +46,16 @@ module Sensu
46
46
  content_type 'application/json'
47
47
  end
48
48
 
49
+ aget '/info' do
50
+ $logger.debug('[info] -- ' + request.ip + ' -- GET -- request for sensu info')
51
+ response = {
52
+ :sensu => {
53
+ :version => Sensu::VERSION
54
+ }
55
+ }
56
+ body response.to_json
57
+ end
58
+
49
59
  aget '/clients' do
50
60
  $logger.debug('[clients] -- ' + request.ip + ' -- GET -- request for client list')
51
61
  response = Array.new
@@ -86,9 +96,9 @@ module Sensu
86
96
  $logger.info('[client] -- publishing check result to resolve event -- ' + client + ' -- ' + check_name)
87
97
  check = {
88
98
  :name => check_name,
89
- :issued => Time.now.to_i,
90
- :status => 0,
91
99
  :output => 'Client is being removed on request of the API',
100
+ :status => 0,
101
+ :issued => Time.now.to_i,
92
102
  :force_resolve => true
93
103
  }
94
104
  $amq.queue('results').publish({:client => client, :check => check}.to_json)
@@ -150,16 +160,13 @@ module Sensu
150
160
 
151
161
  aget '/events' do
152
162
  $logger.debug('[events] -- ' + request.ip + ' -- GET -- request for event list')
153
- response = Hash.new
163
+ response = Array.new
154
164
  $redis.smembers('clients').callback do |clients|
155
165
  unless clients.empty?
156
166
  clients.each_with_index do |client, index|
157
167
  $redis.hgetall('events:' + client).callback do |events|
158
- events.each do |key, value|
159
- events[key] = JSON.parse(value)
160
- end
161
- unless events.empty?
162
- response[client] = events
168
+ events.each do |check, details|
169
+ response.push(JSON.parse(details).merge(:client => client, :check => check))
163
170
  end
164
171
  if index == clients.size - 1
165
172
  body response.to_json
@@ -176,10 +183,13 @@ module Sensu
176
183
  $logger.debug('[event] -- ' + request.ip + ' -- GET -- request for event -- ' + client + ' -- ' + check)
177
184
  $redis.hgetall('events:' + client).callback do |events|
178
185
  event_json = events[check]
179
- if event_json.nil?
186
+ unless event_json.nil?
187
+ response = JSON.parse(event_json).merge(:client => client, :check => check)
188
+ body response.to_json
189
+ else
180
190
  status 404
191
+ body ''
181
192
  end
182
- body event_json
183
193
  end
184
194
  end
185
195
 
@@ -197,9 +207,9 @@ module Sensu
197
207
  $logger.info('[event] -- publishing check result to resolve event -- ' + post_body.client + ' -- ' + post_body.check)
198
208
  check = {
199
209
  :name => post_body.check,
200
- :issued => Time.now.to_i,
201
- :status => 0,
202
210
  :output => 'Resolving on request of the API',
211
+ :status => 0,
212
+ :issued => Time.now.to_i,
203
213
  :force_resolve => true
204
214
  }
205
215
  $amq.queue('results').publish({:client => post_body.client, :check => check}.to_json)
@@ -297,8 +307,8 @@ module Sensu
297
307
  $redis.set('client:' + $settings.client.name, $settings.client.to_json).callback do
298
308
  $redis.sadd('clients', $settings.client.name).callback do
299
309
  $redis.hset('events:' + $settings.client.name, 'test', {
300
- :status => 2,
301
310
  :output => "CRITICAL\n",
311
+ :status => 2,
302
312
  :issued => Time.now.utc.iso8601,
303
313
  :flapping => false,
304
314
  :occurrences => 1
data/lib/sensu/client.rb CHANGED
@@ -56,7 +56,7 @@ module Sensu
56
56
  end
57
57
 
58
58
  def publish_result(check)
59
- @logger.info('[result] -- publishing check result -- ' + [check.name, check.status, check.output].join(' -- '))
59
+ @logger.info('[result] -- publishing check result -- ' + [check.name, check.status, check.output.gsub(/\n/, '\n')].join(' -- '))
60
60
  @amq.queue('results').publish({
61
61
  :client => @settings.client.name,
62
62
  :check => check.to_hash
@@ -91,12 +91,14 @@ module Sensu
91
91
  IO.popen(command + ' 2>&1') do |io|
92
92
  check.output = io.read
93
93
  end
94
+ check.status = $?.exitstatus
94
95
  rescue => error
95
- check.output = 'unexpected error: ' + error.to_s
96
+ @logger.warn('[execute] -- unexpected error: ' + error.to_s)
97
+ check.output = 'Unexpected error: ' + error.to_s
98
+ check.status = 2
96
99
  end
97
100
  check.duration = ('%.3f' % (Time.now.to_f - started)).to_f
98
101
  end
99
- check.status = $?.exitstatus
100
102
  end
101
103
  publish = proc do
102
104
  unless check.status.nil?
@@ -109,8 +111,8 @@ module Sensu
109
111
  EM::defer(execute, publish)
110
112
  else
111
113
  @logger.warn('[execute] -- missing client attributes -- ' + unmatched_tokens.join(', ') + ' -- ' + check.name)
112
- check.status = 3
113
114
  check.output = 'Missing client attributes: ' + unmatched_tokens.join(', ')
115
+ check.status = 3
114
116
  check.handle = false
115
117
  publish_result(check)
116
118
  @checks_in_progress.delete(check.name)
@@ -120,8 +122,8 @@ module Sensu
120
122
  end
121
123
  else
122
124
  @logger.warn('[execute] -- unkown check -- ' + check.name)
123
- check.status = 3
124
125
  check.output = 'Unknown check'
126
+ check.status = 3
125
127
  check.handle = false
126
128
  publish_result(check)
127
129
  @checks_in_progress.delete(check.name)
@@ -137,9 +139,17 @@ module Sensu
137
139
  @check_request_queue.bind(@amq.fanout(exchange))
138
140
  end
139
141
  @check_request_queue.subscribe do |check_request_json|
140
- check = Hashie::Mash.new(JSON.parse(check_request_json))
141
- @logger.info('[subscribe] -- received check request -- ' + check.name)
142
- execute_check(check)
142
+ begin
143
+ check = Hashie::Mash.new(JSON.parse(check_request_json))
144
+ if check.name.is_a?(String) && check.issued.is_a?(Integer)
145
+ @logger.info('[subscribe] -- received check request -- ' + check.name)
146
+ execute_check(check)
147
+ else
148
+ @logger.warn('[subscribe] -- invalid check request: ' + check_request_json)
149
+ end
150
+ rescue JSON::ParserError => error
151
+ @logger.warn('[subscribe] -- check request must be valid JSON: ' + error.to_s)
152
+ end
143
153
  end
144
154
  end
145
155
 
@@ -229,7 +239,7 @@ module Sensu
229
239
  check.issued = Time.now.to_i
230
240
  check.status ||= 0
231
241
  if validates && check.status.is_a?(Integer)
232
- @logger.info('[socket] -- publishing check result -- ' + [check.name, check.status, check.output].join(' -- '))
242
+ @logger.info('[socket] -- publishing check result -- ' + [check.name, check.status, check.output.gsub(/\n/, '\n')].join(' -- '))
233
243
  @amq.queue('results').publish({
234
244
  :client => @settings.client.name,
235
245
  :check => check.to_hash
data/lib/sensu/config.rb CHANGED
@@ -12,6 +12,7 @@ require 'amqp'
12
12
  require 'cabin'
13
13
  require 'cabin/outputs/em/stdlib-logger'
14
14
 
15
+ require File.join(File.dirname(__FILE__), '..', 'sensu')
15
16
  require File.join(File.dirname(__FILE__), 'patches', 'ruby')
16
17
  require File.join(File.dirname(__FILE__), 'patches', 'amqp')
17
18
 
@@ -49,7 +50,7 @@ module Sensu
49
50
  end
50
51
  end
51
52
  @logger = Cabin::Channel.new
52
- log_output = File.basename($0) == 'rake' ? '/tmp/sensu_test.log' : STDOUT
53
+ log_output = File.basename($0) == 'rake' ? '/tmp/sensu-test.log' : STDOUT
53
54
  @logger.subscribe(Cabin::Outputs::EM::StdlibLogger.new(Logger.new(log_output)))
54
55
  @logger.level = @options[:verbose] ? :debug : :info
55
56
  if Signal.list.include?('USR1')
@@ -62,7 +63,7 @@ module Sensu
62
63
  def validate_common_settings
63
64
  @settings.checks.each do |name, details|
64
65
  if details.key?('status') || details.key?('output')
65
- invalid_config('reserved key (status or output) defined in check ' + name)
66
+ invalid_config('reserved key (output or status) defined in check ' + name)
66
67
  end
67
68
  unless details.interval.is_a?(Integer) && details.interval > 0
68
69
  invalid_config('missing interval for check ' + name)
@@ -29,6 +29,13 @@ module Redis
29
29
  def self.connect(options={})
30
30
  host = options[:host] || 'localhost'
31
31
  port = options[:port] || 6379
32
- EM::connect(host, port, Redis::Client)
32
+ redis = EM::connect(host, port, Redis::Client)
33
+ redis.info do |info|
34
+ redis_version = info.split(/\n/).first.split(/:/).last
35
+ unless redis_version.to_i >= 2
36
+ raise "redis version must be >= 2.0"
37
+ end
38
+ end
39
+ redis
33
40
  end
34
41
  end
data/lib/sensu/server.rb CHANGED
@@ -178,8 +178,8 @@ module Sensu
178
178
  event.occurrences = previous_occurrence.occurrences += 1
179
179
  end
180
180
  @redis.hset('events:' + client.name, check.name, {
181
- :status => check.status,
182
181
  :output => check.output,
182
+ :status => check.status,
183
183
  :issued => Time.at(check.issued).utc.iso8601,
184
184
  :flapping => is_flapping,
185
185
  :occurrences => event.occurrences
@@ -228,7 +228,7 @@ module Sensu
228
228
  @result_queue = @amq.queue('results')
229
229
  @result_queue.subscribe do |result_json|
230
230
  result = Hashie::Mash.new(JSON.parse(result_json))
231
- @logger.info('[result] -- received result -- ' + [result.client, result.check.name, result.check.status, result.check.output].join(' -- '))
231
+ @logger.info('[result] -- received result -- ' + [result.client, result.check.name, result.check.status, result.check.output.gsub(/\n/, '\n')].join(' -- '))
232
232
  process_result(result)
233
233
  end
234
234
  end
@@ -239,7 +239,7 @@ module Sensu
239
239
  @settings.checks.each_with_index do |(name, details), index|
240
240
  check_request = Hashie::Mash.new(:name => name)
241
241
  unless details.publish == false || details.standalone
242
- @timers << EM::Timer.new(stagger*index) do
242
+ @timers << EM::Timer.new(stagger * index) do
243
243
  details.subscribers.each do |exchange|
244
244
  interval = options[:test] ? 0.5 : details.interval
245
245
  @timers << EM::PeriodicTimer.new(interval) do
@@ -271,18 +271,18 @@ module Sensu
271
271
  )
272
272
  case
273
273
  when time_since_last_keepalive >= 180
274
- result.check.status = 2
275
274
  result.check.output = 'No keep-alive sent from host in over 180 seconds'
275
+ result.check.status = 2
276
276
  @amq.queue('results').publish(result.to_json)
277
277
  when time_since_last_keepalive >= 120
278
- result.check.status = 1
279
278
  result.check.output = 'No keep-alive sent from host in over 120 seconds'
279
+ result.check.status = 1
280
280
  @amq.queue('results').publish(result.to_json)
281
281
  else
282
282
  @redis.hexists('events:' + client_id, 'keepalive').callback do |exists|
283
283
  if exists
284
- result.check.status = 0
285
284
  result.check.output = 'Keep-alive sent from host'
285
+ result.check.status = 0
286
286
  @amq.queue('results').publish(result.to_json)
287
287
  end
288
288
  end
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu
3
3
  version: !ruby/object:Gem::Version
4
- hash: 51
5
- prerelease: false
4
+ hash: 31098141
5
+ prerelease: true
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
- - 4
10
- version: 0.9.4
9
+ - 5
10
+ - beta
11
+ version: 0.9.5.beta
11
12
  platform: ruby
12
13
  authors:
13
14
  - Sean Porter
@@ -16,7 +17,7 @@ autorequire:
16
17
  bindir: bin
17
18
  cert_chain: []
18
19
 
19
- date: 2012-02-24 00:00:00 -08:00
20
+ date: 2012-03-05 00:00:00 -08:00
20
21
  default_executable:
21
22
  dependencies:
22
23
  - !ruby/object:Gem::Dependency
@@ -245,12 +246,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
245
246
  required_rubygems_version: !ruby/object:Gem::Requirement
246
247
  none: false
247
248
  requirements:
248
- - - ">="
249
+ - - ">"
249
250
  - !ruby/object:Gem::Version
250
- hash: 3
251
+ hash: 25
251
252
  segments:
252
- - 0
253
- version: "0"
253
+ - 1
254
+ - 3
255
+ - 1
256
+ version: 1.3.1
254
257
  requirements: []
255
258
 
256
259
  rubyforge_project: