sensu 0.6.8-x86-mingw32 → 0.6.9-x86-mingw32

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/.gitignore CHANGED
@@ -3,3 +3,4 @@ pkg/*
3
3
  \#*
4
4
  dump.rdb
5
5
  .DS_Store
6
+ *.png
data/README.org CHANGED
@@ -1,61 +1,28 @@
1
1
  * Welcome to Sensu
2
- Sensu is a monitoring system framework, handling the remote execution of checks.
2
+ Sensu is a monitoring system framework.
3
3
 
4
- Checks can utilize user created plugins, returning an exit status code and outputting to STDOUT.
5
-
6
- Check results are handled by user created handlers.
4
+ [[https://github.com/sonian/sensu/raw/master/sensu-logo.png]]
7
5
 
8
- Documentation can be found [[https://github.com/sonian/sensu/wiki][here]].
6
+ Checks can utilize user created plugins, returning an exit status code and outputting to STDOUT.
9
7
 
8
+ Check results are handled by user created handlers, receiving JSON formatted event data from STDIN.
9
+ * Documentation
10
+ Documentation can be found [[https://github.com/sonian/sensu/wiki][HERE]].
10
11
  * License
11
12
  Sensu is released under the [[https://github.com/sonian/sensu/blob/master/MIT-LICENSE.txt][MIT license]].
12
-
13
13
  * Contributing
14
14
  - [[http://help.github.com/fork-a-repo/][Fork]] [[https://github.com/sonian/sensu][Sensu]]
15
15
  - Use a [[https://github.com/dchelimsky/rspec/wiki/Topic-Branches][topic branch]]
16
16
  - Create a [[http://help.github.com/send-pull-requests/][pull request]]
17
17
 
18
18
  Keep it simple.
19
-
20
- ** Readme Driven Development
21
- *** A Client Will
22
- - Have a set of attributes to describe it, including its responsibilities
23
- - Send keep-alives to a server
24
- - Subscribe to a queue bound to a set of fanout exchanges, determined by its responsibilities
25
- - Substitute tokens in check commands with their matching client attribute
26
- - Report when it does not have a client attribute for token substitution
27
- - Receive checks from subscriptions, execute them, and publish the results to a queue with its client name
28
- - Not allow overlapping check executions of the same name
29
- - Report when it is unaware of a check it received from a subscription
30
-
31
- *** A Server Will
32
- - Subscribe to a queue for check results, another for keep-alives
33
- - Pull keep-alives, storing client details
34
- - Publish checks on defined intervals to their associated fanout exchanges
35
- - Pull check results, storing the latest events for clients, a good result will flush a previous event for that client
36
- - Create an event when it stops receiving keep-alives from a client, a new keep-alive for the client will clear the event
37
- - Trigger a event handler, either the default handler or one specified for the check, providing it with a JSON event file
38
-
39
- *** An API Will
40
- - List all current events
41
- - List all clients and their attributes
42
- - Show a client and its attributes
43
- - Remove a client and resolve associated events
44
-
45
- *** A Plugin Will
46
- - Output to STDOUT
47
- - Return a valid exit status code
48
-
49
- *** A Handler Will
50
- - Accept a command line argument "-f", for an event file path
51
- - Parse the JSON event file
52
- - Handle the event as it wishes
53
-
54
19
  ** Testing
55
20
  *** Requirements
56
- - RabbitMQ (default configuration)
57
- - Redis (default configuration)
58
-
59
- *** MiniTest
60
-
21
+ - RabbitMQ
22
+ - Redis
23
+ *** Running
24
+ : bundle install
61
25
  : rake test
26
+ * Contributors
27
+ - Sean Porter ([[https://twitter.com/#!/portertech][@portertech]])
28
+ - Justin Kolberg ([[https://twitter.com/#!/amdprophet][@amdprophet]])
data/lib/sensu.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Sensu
2
- VERSION = "0.6.8"
2
+ VERSION = "0.6.9"
3
3
  end
data/lib/sensu/api.rb CHANGED
File without changes
data/lib/sensu/client.rb CHANGED
@@ -8,7 +8,7 @@ module Sensu
8
8
  client.setup_amqp
9
9
  client.setup_keepalives
10
10
  client.setup_subscriptions
11
- client.monitor_queues
11
+ client.setup_queue_monitor
12
12
 
13
13
  Signal.trap('INT') do
14
14
  EM.stop
@@ -90,7 +90,7 @@ module Sensu
90
90
  end
91
91
  end
92
92
 
93
- def monitor_queues
93
+ def setup_queue_monitor
94
94
  EM.add_periodic_timer(5) do
95
95
  unless @check_queue.subscribed?
96
96
  @check_queue.delete
data/lib/sensu/server.rb CHANGED
@@ -19,7 +19,7 @@ module Sensu
19
19
  server.setup_publisher
20
20
  server.setup_keepalive_monitor
21
21
  end
22
- server.monitor_queues
22
+ server.setup_queue_monitor
23
23
 
24
24
  Signal.trap('INT') do
25
25
  EM.stop
@@ -83,29 +83,68 @@ module Sensu
83
83
  unless client_json.nil?
84
84
  client = JSON.parse(client_json)
85
85
  check = result['check']
86
- check.merge!(@settings['checks'][check['name']]) if @settings['checks'].has_key?(check['name'])
86
+ if @settings['checks'][check['name']]
87
+ check.merge!(@settings['checks'][check['name']])
88
+ end
87
89
  check['handler'] ||= 'default'
88
90
  event = {'client' => client, 'check' => check, 'occurrences' => 1}
89
91
  if check['type'] == 'metric'
90
92
  handle_event(event)
91
93
  else
92
- @redis.hget('events:' + client['name'], check['name']).callback do |event_json|
93
- previous_event = event_json ? JSON.parse(event_json) : nil
94
- if previous_event && check['status'] == 0
95
- @redis.hdel('events:' + client['name'], check['name'])
96
- event['action'] = 'resolve'
97
- handle_event(event)
98
- elsif check['status'] > 0
99
- if previous_event && check['status'] == previous_event['status']
100
- event['occurrences'] = previous_event['occurrences'] += 1
94
+ history_key = 'history:' + client['name'] + ':' + check['name']
95
+ @redis.rpush(history_key, check['status']).callback do
96
+ @redis.lrange(history_key, -21, -1).callback do |history|
97
+ total_state_change = 0
98
+ unless history.count < 21
99
+ state_changes = 0
100
+ change_weight = 0.8
101
+ history.each do |status|
102
+ previous_status ||= status
103
+ unless status == previous_status
104
+ state_changes += change_weight
105
+ end
106
+ change_weight += 0.02
107
+ previous_status = status
108
+ end
109
+ total_state_change = (state_changes.fdiv(20) * 100).to_i
110
+ @redis.lpop(history_key)
101
111
  end
102
- @redis.hset('events:' + client['name'], check['name'], {
103
- 'status' => check['status'],
104
- 'output' => check['output'],
105
- 'occurrences' => event['occurrences']
106
- }.to_json).callback do
107
- event['action'] = 'create'
108
- handle_event(event)
112
+ high_flap_threshold = check['high_flap_threshold'] || 50
113
+ low_flap_threshold = check['low_flap_threshold'] || 40
114
+ @redis.hget('events:' + client['name'], check['name']).callback do |event_json|
115
+ previous_event = event_json ? JSON.parse(event_json) : false
116
+ flapping = previous_event ? previous_event['flapping'] : false
117
+ check['flapping'] = case
118
+ when total_state_change >= high_flap_threshold
119
+ true
120
+ when flapping && total_state_change <= low_flap_threshold
121
+ false
122
+ else
123
+ flapping
124
+ end
125
+ if previous_event && check['status'] == 0
126
+ unless check['flapping']
127
+ @redis.hdel('events:' + client['name'], check['name']).callback do
128
+ event['action'] = 'resolve'
129
+ handle_event(event)
130
+ end
131
+ else
132
+ @redis.hset('events:' + client['name'], check['name'], previous_event.merge({'flapping' => true}).to_json)
133
+ end
134
+ elsif check['status'] != 0
135
+ if previous_event && check['status'] == previous_event['status']
136
+ event['occurrences'] = previous_event['occurrences'] += 1
137
+ end
138
+ @redis.hset('events:' + client['name'], check['name'], {
139
+ 'status' => check['status'],
140
+ 'output' => check['output'],
141
+ 'flapping' => check['flapping'],
142
+ 'occurrences' => event['occurrences']
143
+ }.to_json).callback do
144
+ event['action'] = 'create'
145
+ handle_event(event)
146
+ end
147
+ end
109
148
  end
110
149
  end
111
150
  end
@@ -153,17 +192,17 @@ module Sensu
153
192
  when time_since_last_check >= 180
154
193
  result['check']['status'] = 2
155
194
  result['check']['output'] = 'No keep-alive sent from host in over 180 seconds'
156
- @result_queue.publish(result.to_json)
195
+ process_result(result)
157
196
  when time_since_last_check >= 120
158
197
  result['check']['status'] = 1
159
198
  result['check']['output'] = 'No keep-alive sent from host in over 120 seconds'
160
- @result_queue.publish(result.to_json)
199
+ process_result(result)
161
200
  else
162
201
  @redis.hexists('events:' + client_id, 'keepalive').callback do |exists|
163
202
  if exists == 1
164
203
  result['check']['status'] = 0
165
204
  result['check']['output'] = 'Keep-alive sent from host'
166
- @result_queue.publish(result.to_json)
205
+ process_result(result)
167
206
  end
168
207
  end
169
208
  end
@@ -173,7 +212,7 @@ module Sensu
173
212
  end
174
213
  end
175
214
 
176
- def monitor_queues
215
+ def setup_queue_monitor
177
216
  EM.add_periodic_timer(5) do
178
217
  unless @keepalive_queue.subscribed?
179
218
  setup_keepalives
metadata CHANGED
@@ -1,114 +1,83 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: sensu
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 6
9
- - 8
10
- version: 0.6.8
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.9
5
+ prerelease:
11
6
  platform: x86-mingw32
12
- authors:
7
+ authors:
13
8
  - Sean Porter
14
9
  - Justin Kolberg
15
10
  autorequire:
16
11
  bindir: bin
17
12
  cert_chain: []
18
-
19
- date: 2011-10-07 00:00:00 -07:00
20
- default_executable:
21
- dependencies:
22
- - !ruby/object:Gem::Dependency
13
+ date: 2011-10-13 00:00:00.000000000Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
23
16
  name: eventmachine
24
- prerelease: false
25
- requirement: &id001 !ruby/object:Gem::Requirement
17
+ requirement: &70342584681380 !ruby/object:Gem::Requirement
26
18
  none: false
27
- requirements:
28
- - - "="
29
- - !ruby/object:Gem::Version
30
- hash: 124392917
31
- segments:
32
- - 1
33
- - 0
34
- - 0
35
- - beta
36
- - 4
37
- - 1
19
+ requirements:
20
+ - - =
21
+ - !ruby/object:Gem::Version
38
22
  version: 1.0.0.beta.4.1
39
23
  type: :runtime
40
- version_requirements: *id001
41
- - !ruby/object:Gem::Dependency
42
- name: amqp
43
24
  prerelease: false
44
- requirement: &id002 !ruby/object:Gem::Requirement
25
+ version_requirements: *70342584681380
26
+ - !ruby/object:Gem::Dependency
27
+ name: amqp
28
+ requirement: &70342584679500 !ruby/object:Gem::Requirement
45
29
  none: false
46
- requirements:
47
- - - "="
48
- - !ruby/object:Gem::Version
49
- hash: 11
50
- segments:
51
- - 0
52
- - 7
53
- - 4
30
+ requirements:
31
+ - - =
32
+ - !ruby/object:Gem::Version
54
33
  version: 0.7.4
55
34
  type: :runtime
56
- version_requirements: *id002
57
- - !ruby/object:Gem::Dependency
58
- name: json
59
35
  prerelease: false
60
- requirement: &id003 !ruby/object:Gem::Requirement
36
+ version_requirements: *70342584679500
37
+ - !ruby/object:Gem::Dependency
38
+ name: json
39
+ requirement: &70342584678540 !ruby/object:Gem::Requirement
61
40
  none: false
62
- requirements:
63
- - - ">="
64
- - !ruby/object:Gem::Version
65
- hash: 3
66
- segments:
67
- - 0
68
- version: "0"
41
+ requirements:
42
+ - - ! '>='
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
69
45
  type: :runtime
70
- version_requirements: *id003
71
- - !ruby/object:Gem::Dependency
72
- name: uuidtools
73
46
  prerelease: false
74
- requirement: &id004 !ruby/object:Gem::Requirement
47
+ version_requirements: *70342584678540
48
+ - !ruby/object:Gem::Dependency
49
+ name: uuidtools
50
+ requirement: &70342584677580 !ruby/object:Gem::Requirement
75
51
  none: false
76
- requirements:
77
- - - ">="
78
- - !ruby/object:Gem::Version
79
- hash: 3
80
- segments:
81
- - 0
82
- version: "0"
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
83
56
  type: :runtime
84
- version_requirements: *id004
85
- - !ruby/object:Gem::Dependency
86
- name: em-syslog
87
57
  prerelease: false
88
- requirement: &id005 !ruby/object:Gem::Requirement
58
+ version_requirements: *70342584677580
59
+ - !ruby/object:Gem::Dependency
60
+ name: em-syslog
61
+ requirement: &70342584676480 !ruby/object:Gem::Requirement
89
62
  none: false
90
- requirements:
91
- - - ">="
92
- - !ruby/object:Gem::Version
93
- hash: 3
94
- segments:
95
- - 0
96
- version: "0"
63
+ requirements:
64
+ - - ! '>='
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
97
67
  type: :runtime
98
- version_requirements: *id005
68
+ prerelease: false
69
+ version_requirements: *70342584676480
99
70
  description: A server monitoring framework using the publish-subscribe model
100
- email:
71
+ email:
101
72
  - sean.porter@sonian.net
102
73
  - justin.kolberg@sonian.net
103
- executables:
74
+ executables:
104
75
  - sensu-api
105
76
  - sensu-client
106
77
  - sensu-server
107
78
  extensions: []
108
-
109
79
  extra_rdoc_files: []
110
-
111
- files:
80
+ files:
112
81
  - .gitignore
113
82
  - Gemfile
114
83
  - Gemfile.lock
@@ -124,41 +93,32 @@ files:
124
93
  - lib/sensu/config.rb
125
94
  - lib/sensu/helpers.rb
126
95
  - lib/sensu/server.rb
96
+ - sensu-logo.png
127
97
  - sensu.gemspec
128
98
  - sensu.windows
129
- has_rdoc: true
130
99
  homepage: https://github.com/sonian/sensu
131
- licenses:
100
+ licenses:
132
101
  - MIT
133
102
  post_install_message:
134
103
  rdoc_options: []
135
-
136
- require_paths:
104
+ require_paths:
137
105
  - lib
138
- required_ruby_version: !ruby/object:Gem::Requirement
106
+ required_ruby_version: !ruby/object:Gem::Requirement
139
107
  none: false
140
- requirements:
141
- - - ">="
142
- - !ruby/object:Gem::Version
143
- hash: 3
144
- segments:
145
- - 0
146
- version: "0"
147
- required_rubygems_version: !ruby/object:Gem::Requirement
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ required_rubygems_version: !ruby/object:Gem::Requirement
148
113
  none: false
149
- requirements:
150
- - - ">="
151
- - !ruby/object:Gem::Version
152
- hash: 3
153
- segments:
154
- - 0
155
- version: "0"
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
156
118
  requirements: []
157
-
158
119
  rubyforge_project:
159
- rubygems_version: 1.3.7
120
+ rubygems_version: 1.8.10
160
121
  signing_key:
161
122
  specification_version: 3
162
123
  summary: A server monitoring framework
163
124
  test_files: []
164
-