sensu 0.9.7.beta.1 → 0.9.7.beta.2

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/CHANGELOG.md CHANGED
@@ -5,6 +5,10 @@
5
5
  Event data mutators, manipulate event data and its format prior to
6
6
  sending to a handler.
7
7
 
8
+ TCP and UDP handler types, for writing event data to sockets.
9
+
10
+ API resources now support singular & plural, Rails friendly.
11
+
8
12
  ### Non-backwards compatible changes
9
13
 
10
14
  AMQP handlers can no longer use `"send_only_check_output": true`, but
@@ -13,6 +17,8 @@ instead have access to the built-in mutators `"mutator": "only_check_output"` an
13
17
 
14
18
  ### Other
15
19
 
20
+ Redis client connection heartbeat.
21
+
16
22
  Improved graceful process termination.
17
23
 
18
24
  Improved client socket ping/pong.
data/lib/sensu/api.rb CHANGED
@@ -63,25 +63,6 @@ module Sensu
63
63
  end
64
64
  end
65
65
 
66
- def healthy?
67
- unless $redis.connected?
68
- unless env['REQUEST_PATH'] == '/info'
69
- halt 500
70
- end
71
- end
72
- end
73
-
74
- def request_log
75
- $logger.info([env['REQUEST_METHOD'], env['REQUEST_PATH']].join(' '), {
76
- :remote_address => env['REMOTE_ADDR'],
77
- :user_agent => env['HTTP_USER_AGENT'],
78
- :request_method => env['REQUEST_METHOD'],
79
- :request_uri => env['REQUEST_URI'],
80
- :request_body => env['rack.input'].read
81
- })
82
- env['rack.input'].rewind
83
- end
84
-
85
66
  configure do
86
67
  disable :protection
87
68
  disable :show_exceptions
@@ -95,10 +76,55 @@ module Sensu
95
76
  ''
96
77
  end
97
78
 
79
+ helpers do
80
+ def request_log_line
81
+ $logger.info([env['REQUEST_METHOD'], env['REQUEST_PATH']].join(' '), {
82
+ :remote_address => env['REMOTE_ADDR'],
83
+ :user_agent => env['HTTP_USER_AGENT'],
84
+ :request_method => env['REQUEST_METHOD'],
85
+ :request_uri => env['REQUEST_URI'],
86
+ :request_body => env['rack.input'].read
87
+ })
88
+ env['rack.input'].rewind
89
+ end
90
+
91
+ def health_filter
92
+ unless $redis.connected?
93
+ unless env['REQUEST_PATH'] == '/info'
94
+ halt 500
95
+ end
96
+ end
97
+ end
98
+
99
+ def event_hash(event_json, client_name, check_name)
100
+ JSON.parse(event_json, :symbolize_names => true).merge(
101
+ :client => client_name,
102
+ :check => check_name
103
+ )
104
+ end
105
+
106
+ def resolve_event(client_name, check_name)
107
+ payload = {
108
+ :client => client_name,
109
+ :check => {
110
+ :name => check_name,
111
+ :output => 'Resolving on request of the API',
112
+ :status => 0,
113
+ :issued => Time.now.to_i,
114
+ :force_resolve => true
115
+ }
116
+ }
117
+ $logger.info('publishing check result', {
118
+ :payload => payload
119
+ })
120
+ $amq.queue('results').publish(payload.to_json)
121
+ end
122
+ end
123
+
98
124
  before do
99
125
  content_type 'application/json'
100
- request_log
101
- healthy?
126
+ request_log_line
127
+ health_filter
102
128
  end
103
129
 
104
130
  aget '/info' do
@@ -132,7 +158,7 @@ module Sensu
132
158
  end
133
159
  end
134
160
 
135
- aget '/client/:name' do |client_name|
161
+ aget %r{/clients?/([\w\.-]+)$} do |client_name|
136
162
  $redis.get('client:' + client_name).callback do |client_json|
137
163
  unless client_json.nil?
138
164
  body client_json
@@ -143,31 +169,18 @@ module Sensu
143
169
  end
144
170
  end
145
171
 
146
- adelete '/client/:name' do |client_name|
172
+ adelete %r{/clients?/([\w\.-]+)$} do |client_name|
147
173
  $redis.get('client:' + client_name).callback do |client_json|
148
174
  unless client_json.nil?
149
- client = JSON.parse(client_json, :symbolize_names => true)
150
- $logger.info('deleting client', {
151
- :client => client
152
- })
153
175
  $redis.hgetall('events:' + client_name).callback do |events|
154
176
  events.each_key do |check_name|
155
- payload = {
156
- :client => client_name,
157
- :check => {
158
- :name => check_name,
159
- :output => 'Client is being removed on request of the API',
160
- :status => 0,
161
- :issued => Time.now.to_i,
162
- :force_resolve => true
163
- }
164
- }
165
- $logger.info('publishing check result', {
166
- :payload => payload
167
- })
168
- $amq.queue('results').publish(payload.to_json)
177
+ resolve_event(client_name, check_name)
169
178
  end
170
179
  EM::Timer.new(5) do
180
+ client = JSON.parse(client_json, :symbolize_names => true)
181
+ $logger.info('deleting client', {
182
+ :client => client
183
+ })
171
184
  $redis.srem('clients', client_name)
172
185
  $redis.del('events:' + client_name)
173
186
  $redis.del('client:' + client_name)
@@ -178,7 +191,7 @@ module Sensu
178
191
  $redis.del('history:' + client_name)
179
192
  end
180
193
  end
181
- status 204
194
+ status 202
182
195
  body ''
183
196
  end
184
197
  else
@@ -192,7 +205,7 @@ module Sensu
192
205
  body $settings.checks.to_json
193
206
  end
194
207
 
195
- aget '/check/:name' do |check_name|
208
+ aget %r{/checks?/([\w\.-]+)$} do |check_name|
196
209
  if $settings.check_exists?(check_name)
197
210
  response = $settings[:checks][check_name].merge(:name => check_name)
198
211
  body response.to_json
@@ -202,23 +215,25 @@ module Sensu
202
215
  end
203
216
  end
204
217
 
205
- apost '/check/request' do
218
+ apost %r{/(?:check/)?request$} do
206
219
  begin
207
220
  post_body = JSON.parse(request.body.read, :symbolize_names => true)
208
- rescue JSON::ParserError
221
+ check_name = post_body[:check]
222
+ subscribers = post_body[:subscribers]
223
+ rescue JSON::ParserError, TypeError
209
224
  status 400
210
225
  body ''
211
226
  end
212
- if post_body.is_a?(Hash) && post_body[:check].is_a?(String) && post_body[:subscribers].is_a?(Array)
227
+ if check_name.is_a?(String) && subscribers.is_a?(Array)
213
228
  payload = {
214
- :name => post_body[:check],
229
+ :name => check_name,
215
230
  :issued => Time.now.to_i
216
231
  }
217
232
  $logger.info('publishing check request', {
218
233
  :payload => payload,
219
- :subscribers => post_body[:subscribers]
234
+ :subscribers => subscribers
220
235
  })
221
- post_body[:subscribers].uniq.each do |exchange_name|
236
+ subscribers.uniq.each do |exchange_name|
222
237
  $amq.fanout(exchange_name).publish(payload.to_json)
223
238
  end
224
239
  status 201
@@ -235,7 +250,7 @@ module Sensu
235
250
  clients.each_with_index do |client_name, index|
236
251
  $redis.hgetall('events:' + client_name).callback do |events|
237
252
  events.each do |check_name, event_json|
238
- response.push(JSON.parse(event_json).merge(:client => client_name, :check => check_name))
253
+ response.push(event_hash(event_json, client_name, check_name))
239
254
  end
240
255
  if index == clients.size - 1
241
256
  body response.to_json
@@ -248,12 +263,21 @@ module Sensu
248
263
  end
249
264
  end
250
265
 
251
- aget '/event/:client/:check' do |client_name, check_name|
266
+ aget %r{/events/([\w\.-]+)$} do |client_name|
267
+ response = Array.new
268
+ $redis.hgetall('events:' + client_name).callback do |events|
269
+ events.each do |check_name, event_json|
270
+ response.push(event_hash(event_json, client_name, check_name))
271
+ end
272
+ body response.to_json
273
+ end
274
+ end
275
+
276
+ aget %r{/events?/([\w\.-]+)/([\w\.-]+)$} do |client_name, check_name|
252
277
  $redis.hgetall('events:' + client_name).callback do |events|
253
278
  event_json = events[check_name]
254
279
  unless event_json.nil?
255
- response = JSON.parse(event_json).merge(:client => client_name, :check => check_name)
256
- body response.to_json
280
+ body event_hash(event_json, client_name, check_name).to_json
257
281
  else
258
282
  status 404
259
283
  body ''
@@ -261,31 +285,32 @@ module Sensu
261
285
  end
262
286
  end
263
287
 
264
- apost '/event/resolve' do
288
+ adelete %r{/events?/([\w\.-]+)/([\w\.-]+)$} do |client_name, check_name|
289
+ $redis.hgetall('events:' + client_name).callback do |events|
290
+ if events.include?(check_name)
291
+ resolve_event(client_name, check_name)
292
+ status 202
293
+ else
294
+ status 404
295
+ end
296
+ body ''
297
+ end
298
+ end
299
+
300
+ apost %r{/(?:event/)?resolve$} do
265
301
  begin
266
302
  post_body = JSON.parse(request.body.read, :symbolize_names => true)
267
- rescue JSON::ParserError
303
+ client_name = post_body[:client]
304
+ check_name = post_body[:check]
305
+ rescue JSON::ParserError, TypeError
268
306
  status 400
269
307
  body ''
270
308
  end
271
- if post_body.is_a?(Hash) && post_body[:client].is_a?(String) && post_body[:check].is_a?(String)
272
- $redis.hgetall('events:' + post_body[:client]).callback do |events|
273
- if events.include?(post_body[:check])
274
- payload = {
275
- :client => post_body[:client],
276
- :check => {
277
- :name => post_body[:check],
278
- :output => 'Resolving on request of the API',
279
- :status => 0,
280
- :issued => Time.now.to_i,
281
- :force_resolve => true
282
- }
283
- }
284
- $logger.info('publishing check result', {
285
- :payload => payload
286
- })
287
- $amq.queue('results').publish(payload.to_json)
288
- status 201
309
+ if client_name.is_a?(String) && check_name.is_a?(String)
310
+ $redis.hgetall('events:' + client_name).callback do |events|
311
+ if events.include?(check_name)
312
+ resolve_event(client_name, check_name)
313
+ status 202
289
314
  else
290
315
  status 404
291
316
  end
@@ -297,7 +322,7 @@ module Sensu
297
322
  end
298
323
  end
299
324
 
300
- apost '/stash/*' do |path|
325
+ apost %r{/stash(?:es)?/(.*)} do |path|
301
326
  begin
302
327
  post_body = JSON.parse(request.body.read)
303
328
  rescue JSON::ParserError
@@ -312,7 +337,7 @@ module Sensu
312
337
  end
313
338
  end
314
339
 
315
- aget '/stash/*' do |path|
340
+ aget %r{/stash(?:es)?/(.*)} do |path|
316
341
  $redis.get('stash:' + path).callback do |stash_json|
317
342
  if stash_json.nil?
318
343
  status 404
@@ -323,7 +348,7 @@ module Sensu
323
348
  end
324
349
  end
325
350
 
326
- adelete '/stash/*' do |path|
351
+ adelete %r{/stash(?:es)?/(.*)} do |path|
327
352
  $redis.exists('stash:' + path).callback do |stash_exists|
328
353
  if stash_exists
329
354
  $redis.srem('stashes', path).callback do
@@ -376,17 +401,17 @@ module Sensu
376
401
  $redis.set('client:' + $settings[:client][:name], $settings[:client].to_json).callback do
377
402
  $redis.sadd('clients', $settings[:client][:name]).callback do
378
403
  $redis.hset('events:' + $settings[:client][:name], 'test', {
379
- :output => "CRITICAL\n",
404
+ :output => 'CRITICAL',
380
405
  :status => 2,
381
406
  :issued => Time.now.to_i,
382
407
  :flapping => false,
383
408
  :occurrences => 1
384
409
  }.to_json).callback do
385
- $redis.set('stash:test/test', '{"key": "value"}').callback do
410
+ $redis.set('stash:test/test', {:key => 'value'}.to_json).callback do
386
411
  $redis.sadd('stashes', 'test/test').callback do
387
412
  Thin::Logging.silent = true
388
413
  Thin::Server.start(self, $settings[:api][:port])
389
- EM::add_timer(0.5) do
414
+ EM::Timer.new(0.5) do
390
415
  block.call
391
416
  end
392
417
  end
data/lib/sensu/client.rb CHANGED
@@ -284,7 +284,7 @@ module Sensu
284
284
  end
285
285
 
286
286
  def retry_until_true(wait=0.5, &block)
287
- EM::add_timer(wait) do
287
+ EM::Timer.new(wait) do
288
288
  unless block.call
289
289
  retry_until_true(wait, &block)
290
290
  end
@@ -1,6 +1,6 @@
1
1
  module Sensu
2
2
  unless defined?(Sensu::VERSION)
3
- VERSION = '0.9.7.beta.1'
3
+ VERSION = '0.9.7.beta.2'
4
4
  end
5
5
 
6
6
  unless defined?(Sensu::DEFAULT_OPTIONS)
data/lib/sensu/redis.rb CHANGED
@@ -12,6 +12,14 @@ module Sensu
12
12
  @closing_connection = false
13
13
  end
14
14
 
15
+ def setup_heartbeat
16
+ @heartbeat ||= EM::PeriodicTimer.new(10) do
17
+ if connected?
18
+ ping
19
+ end
20
+ end
21
+ end
22
+
15
23
  def connection_completed
16
24
  @connection_established = true
17
25
  @connected = true
@@ -30,6 +38,7 @@ module Sensu
30
38
  close_connection
31
39
  end
32
40
  end
41
+ setup_heartbeat
33
42
  end
34
43
 
35
44
  def reconnect!
data/lib/sensu/server.rb CHANGED
@@ -647,7 +647,7 @@ module Sensu
647
647
  end
648
648
 
649
649
  def retry_until_true(wait=0.5, &block)
650
- EM::add_timer(wait) do
650
+ EM::Timer.new(wait) do
651
651
  unless block.call
652
652
  retry_until_true(wait, &block)
653
653
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu
3
3
  version: !ruby/object:Gem::Version
4
- hash: 62196233
4
+ hash: 62196239
5
5
  prerelease: true
6
6
  segments:
7
7
  - 0
8
8
  - 9
9
9
  - 7
10
10
  - beta
11
- - 1
12
- version: 0.9.7.beta.1
11
+ - 2
12
+ version: 0.9.7.beta.2
13
13
  platform: ruby
14
14
  authors:
15
15
  - Sean Porter
@@ -18,7 +18,7 @@ autorequire:
18
18
  bindir: bin
19
19
  cert_chain: []
20
20
 
21
- date: 2012-08-06 00:00:00 -07:00
21
+ date: 2012-08-10 00:00:00 -07:00
22
22
  default_executable:
23
23
  dependencies:
24
24
  - !ruby/object:Gem::Dependency