sensu 0.25.7 → 0.26.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +47 -0
- data/exe/sensu-install +41 -12
- data/lib/sensu/api/http_handler.rb +2 -2
- data/lib/sensu/api/routes.rb +9 -2
- data/lib/sensu/api/routes/checks.rb +2 -2
- data/lib/sensu/api/routes/results.rb +3 -1
- data/lib/sensu/api/routes/silenced.rb +153 -0
- data/lib/sensu/client/process.rb +14 -8
- data/lib/sensu/constants.rb +1 -1
- data/lib/sensu/daemon.rb +12 -9
- data/lib/sensu/server/filter.rb +68 -117
- data/lib/sensu/server/process.rb +102 -24
- data/lib/sensu/utilities.rb +64 -0
- data/sensu.gemspec +3 -3
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43dd37a6c04af17e71c851c56ca704a7a074748b
|
4
|
+
data.tar.gz: f5bc129d97ce20cc38aa2011263b5c06378ddd9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba486e8272baf979179579d9c4c9f8a66ec88bad4c3c0fd298ed9210aa45e37941429d7cf57a3b4b7a362604ff8d0abb6dbf05c246fa77b51a38070f3b9fba56
|
7
|
+
data.tar.gz: 24cd248e6322595ee191aee1a16bd5903b9d8eff1d0ad9479d337c085470c628752f77260659823d9a602bd0d377914ebcc67ecace581b52c2f6502959dee068
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,50 @@
|
|
1
|
+
## 0.26.0 - TBD
|
2
|
+
|
3
|
+
### Fixes
|
4
|
+
|
5
|
+
Increased the maximum number of EventMachine timers from 100k to 200k, to
|
6
|
+
accommodate very large Sensu installations that execute over 100k checks.
|
7
|
+
|
8
|
+
Only attempt to schedule standalone checks that have an interval.
|
9
|
+
|
10
|
+
Standalone checks are now long provided by the Sensu API /checks endpoint.
|
11
|
+
|
12
|
+
Check TTL events are no longer created if the associated Sensu client has
|
13
|
+
a current keepalive event.
|
14
|
+
|
15
|
+
Fixed a Sensu API /results endpoint race condition that caused incomplete
|
16
|
+
response content.
|
17
|
+
|
18
|
+
### Features
|
19
|
+
|
20
|
+
Event silencing is now built into Sensu Core! The Sensu API now provides a
|
21
|
+
set of /silencing endpoints, for silencing one or more subscriptions
|
22
|
+
and/or checks. Silencing applies to all event handlers by default, the new
|
23
|
+
handler definition attribute `handle_silenced` can be used to disable it
|
24
|
+
for a handler. Metric check events (OK) bypass event silencing.
|
25
|
+
|
26
|
+
Subdue now ONLY applies to check scheduling via check definitions, it has
|
27
|
+
been removed from handlers (no more `"at": "handler"`). The Sensu client
|
28
|
+
standalone check execution scheduler now supports subdue. The subdue
|
29
|
+
configuration syntax has changed, please refer to the 0.26 documentation.
|
30
|
+
|
31
|
+
Event filters now support time windows, via the filter definition
|
32
|
+
attribute `"when": {}`. The configuration syntax is the same as check
|
33
|
+
subdue.
|
34
|
+
|
35
|
+
Sensu Extensions are now loaded from Rubygems! The Sensu installer,
|
36
|
+
`sensu-install`, can now be used to install Sensu Extensions, e.g.
|
37
|
+
`sensu-install -e system-profile`. Extensions gems must be enabled via
|
38
|
+
Sensu configuration, please refer to the 0.26 documentation.
|
39
|
+
|
40
|
+
A check can now be a member of more than one aggregate, via the check
|
41
|
+
definition attribute `"aggregates": []`.
|
42
|
+
|
43
|
+
Every Sensu client now creates/subscribes to its own unique client
|
44
|
+
subscription named after it, e.g. `client:i-424242`. This unique client
|
45
|
+
subscription allows Sensu checks to target a single client (host) and
|
46
|
+
enables silencing events for a single client.
|
47
|
+
|
1
48
|
## 0.25.7 - 2016-08-09
|
2
49
|
|
3
50
|
### Fixes
|
data/exe/sensu-install
CHANGED
@@ -8,7 +8,8 @@ module Sensu
|
|
8
8
|
def cli_options(arguments=ARGV)
|
9
9
|
options = {
|
10
10
|
:verbose => false,
|
11
|
-
:plugins => []
|
11
|
+
:plugins => [],
|
12
|
+
:extensions => []
|
12
13
|
}
|
13
14
|
optparse = OptionParser.new do |opts|
|
14
15
|
opts.on("-h", "--help", "Display this message") do
|
@@ -24,6 +25,12 @@ module Sensu
|
|
24
25
|
opts.on("-P", "--plugins PLUGIN[,PLUGIN]", "PLUGIN or comma-delimited list of Sensu plugins to install") do |plugins|
|
25
26
|
options[:plugins].concat(plugins.split(","))
|
26
27
|
end
|
28
|
+
opts.on("-e", "--extension EXTENSION", "Install a Sensu EXTENSION") do |extension|
|
29
|
+
options[:extensions] << extension
|
30
|
+
end
|
31
|
+
opts.on("-E", "--extensions EXTENSION[,EXT]", "EXTENSION or comma-delimited list of Sensu extensions to install") do |extensions|
|
32
|
+
options[:extensions].concat(extensions.split(","))
|
33
|
+
end
|
27
34
|
opts.on("-s", "--source SOURCE", "Install Sensu plugins from a custom SOURCE") do |source|
|
28
35
|
options[:source] = source
|
29
36
|
end
|
@@ -36,23 +43,23 @@ module Sensu
|
|
36
43
|
puts "[SENSU-INSTALL] #{message}"
|
37
44
|
end
|
38
45
|
|
39
|
-
def
|
40
|
-
log "determining if Sensu
|
46
|
+
def gem_installed?(raw_gem, options={})
|
47
|
+
log "determining if Sensu gem '#{raw_gem}' is already installed ..."
|
41
48
|
gem_name, gem_version = raw_gem.split(":")
|
42
49
|
gem_command = "gem list -i #{gem_name}"
|
43
50
|
gem_command << " --version '#{gem_version}'" if gem_version
|
44
51
|
log gem_command if options[:verbose]
|
45
52
|
if system(gem_command)
|
46
|
-
log "Sensu
|
53
|
+
log "Sensu gem '#{gem_name}' has already been installed"
|
47
54
|
true
|
48
55
|
else
|
49
|
-
log "Sensu
|
56
|
+
log "Sensu gem '#{gem_name}' has not been installed" if options[:verbose]
|
50
57
|
false
|
51
58
|
end
|
52
59
|
end
|
53
60
|
|
54
|
-
def
|
55
|
-
log "installing Sensu
|
61
|
+
def install_gem(raw_gem, options={})
|
62
|
+
log "installing Sensu gem '#{raw_gem}'"
|
56
63
|
gem_name, gem_version = raw_gem.split(":")
|
57
64
|
gem_command = "gem install #{gem_name}"
|
58
65
|
gem_command << " --version '#{gem_version}'" if gem_version
|
@@ -61,7 +68,7 @@ module Sensu
|
|
61
68
|
gem_command << " --source #{options[:source]}" if options[:source]
|
62
69
|
log gem_command if options[:verbose]
|
63
70
|
unless system(gem_command)
|
64
|
-
log "failed to install Sensu
|
71
|
+
log "failed to install Sensu gem '#{gem_name}'"
|
65
72
|
log "you can run the sensu-install command again with --verbose for more info" unless options[:verbose]
|
66
73
|
log "please take note of any failure messages above"
|
67
74
|
log "make sure you have build tools installed (e.g. gcc)"
|
@@ -83,21 +90,43 @@ module Sensu
|
|
83
90
|
end
|
84
91
|
log "compiled Sensu plugin gems: #{plugin_gems}" if options[:verbose]
|
85
92
|
plugin_gems.reject! do |raw_gem|
|
86
|
-
|
93
|
+
gem_installed?(raw_gem, options)
|
87
94
|
end
|
88
95
|
log "Sensu plugin gems to be installed: #{plugin_gems}"
|
89
96
|
plugin_gems.each do |raw_gem|
|
90
|
-
|
97
|
+
install_gem(raw_gem, options)
|
91
98
|
end
|
92
99
|
log "successfully installed Sensu plugins: #{plugins}"
|
93
100
|
end
|
94
101
|
|
102
|
+
def install_extensions(extensions, options={})
|
103
|
+
log "installing Sensu extensions ..."
|
104
|
+
log "provided Sensu extensions: #{extensions}" if options[:verbose]
|
105
|
+
extension_gems = extensions.map do |extension|
|
106
|
+
if extension.start_with?("sensu-extensions-")
|
107
|
+
extension
|
108
|
+
else
|
109
|
+
"sensu-extensions-#{extension}"
|
110
|
+
end
|
111
|
+
end
|
112
|
+
log "compiled Sensu extension gems: #{extension_gems}" if options[:verbose]
|
113
|
+
extension_gems.reject! do |raw_gem|
|
114
|
+
gem_installed?(raw_gem, options)
|
115
|
+
end
|
116
|
+
log "Sensu extension gems to be installed: #{extension_gems}"
|
117
|
+
extension_gems.each do |raw_gem|
|
118
|
+
install_gem(raw_gem, options)
|
119
|
+
end
|
120
|
+
log "successfully installed Sensu extensions: #{extensions}"
|
121
|
+
end
|
122
|
+
|
95
123
|
def run
|
96
124
|
options = cli_options
|
97
125
|
unless options[:plugins].empty?
|
98
126
|
install_plugins(options[:plugins], options)
|
99
|
-
|
100
|
-
|
127
|
+
end
|
128
|
+
unless options[:extensions].empty?
|
129
|
+
install_extensions(options[:extensions], options)
|
101
130
|
end
|
102
131
|
end
|
103
132
|
end
|
@@ -95,8 +95,8 @@ module Sensu
|
|
95
95
|
data = Sensu::JSON.load(@http_content)
|
96
96
|
valid = data.is_a?(Hash) && rules.all? do |key, rule|
|
97
97
|
value = data[key]
|
98
|
-
(
|
99
|
-
(value.nil? || rule[:regex].nil?) ||
|
98
|
+
(Array(rule[:type]).any? {|type| value.is_a?(type)} ||
|
99
|
+
(rule[:nil_ok] && value.nil?)) && (value.nil? || rule[:regex].nil?) ||
|
100
100
|
(rule[:regex] && (value =~ rule[:regex]) == 0)
|
101
101
|
end
|
102
102
|
if valid
|
data/lib/sensu/api/routes.rb
CHANGED
@@ -8,6 +8,7 @@ require "sensu/api/routes/resolve"
|
|
8
8
|
require "sensu/api/routes/aggregates"
|
9
9
|
require "sensu/api/routes/stashes"
|
10
10
|
require "sensu/api/routes/results"
|
11
|
+
require "sensu/api/routes/silenced"
|
11
12
|
|
12
13
|
module Sensu
|
13
14
|
module API
|
@@ -22,6 +23,7 @@ module Sensu
|
|
22
23
|
include Aggregates
|
23
24
|
include Stashes
|
24
25
|
include Results
|
26
|
+
include Silenced
|
25
27
|
|
26
28
|
GET_METHOD = "GET".freeze
|
27
29
|
HEAD_METHOD = "HEAD".freeze
|
@@ -49,7 +51,10 @@ module Sensu
|
|
49
51
|
[STASH_URI, :get_stash],
|
50
52
|
[RESULTS_URI, :get_results],
|
51
53
|
[RESULTS_CLIENT_URI, :get_results_client],
|
52
|
-
[RESULT_URI, :get_result]
|
54
|
+
[RESULT_URI, :get_result],
|
55
|
+
[SILENCED_URI, :get_silenced],
|
56
|
+
[SILENCED_SUBSCRIPTION_URI, :get_silenced_subscription],
|
57
|
+
[SILENCED_CHECK_URI, :get_silenced_check]
|
53
58
|
]
|
54
59
|
|
55
60
|
ROUTES = {
|
@@ -61,7 +66,9 @@ module Sensu
|
|
61
66
|
[RESOLVE_URI, :post_resolve],
|
62
67
|
[STASHES_URI, :post_stashes],
|
63
68
|
[STASH_URI, :post_stash],
|
64
|
-
[RESULTS_URI, :post_results]
|
69
|
+
[RESULTS_URI, :post_results],
|
70
|
+
[SILENCED_URI, :post_silenced],
|
71
|
+
[SILENCED_CLEAR_URI, :post_silenced_clear]
|
65
72
|
],
|
66
73
|
DELETE_METHOD => [
|
67
74
|
[CLIENT_URI, :delete_client],
|
@@ -7,14 +7,14 @@ module Sensu
|
|
7
7
|
|
8
8
|
# GET /checks
|
9
9
|
def get_checks
|
10
|
-
@response_content = @settings.checks
|
10
|
+
@response_content = @settings.checks.reject { |check| check[:standalone] }
|
11
11
|
respond
|
12
12
|
end
|
13
13
|
|
14
14
|
# GET /checks/:check_name
|
15
15
|
def get_check
|
16
16
|
check_name = parse_uri(CHECK_URI).first
|
17
|
-
if @settings[:checks][check_name]
|
17
|
+
if @settings[:checks][check_name] && !@settings[:checks][check_name][:standalone]
|
18
18
|
@response_content = @settings[:checks][check_name].merge(:name => check_name)
|
19
19
|
respond
|
20
20
|
else
|
@@ -0,0 +1,153 @@
|
|
1
|
+
module Sensu
|
2
|
+
module API
|
3
|
+
module Routes
|
4
|
+
module Silenced
|
5
|
+
SILENCED_URI = /^\/silenced$/
|
6
|
+
SILENCED_SUBSCRIPTION_URI = /^\/silenced\/subscriptions\/([\w\.-]+)$/
|
7
|
+
SILENCED_CHECK_URI = /^\/silenced\/checks\/([\w\.-]+)$/
|
8
|
+
SILENCED_CLEAR_URI = /^\/silenced\/clear$/
|
9
|
+
|
10
|
+
# Fetch silenced registry entries for the provided silenced
|
11
|
+
# entry keys.
|
12
|
+
#
|
13
|
+
# @param silenced_keys [Array]
|
14
|
+
# @yield callback [entries] callback/block called after the
|
15
|
+
# silenced registry entries have been fetched.
|
16
|
+
def fetch_silenced(silenced_keys=[])
|
17
|
+
entries = []
|
18
|
+
unless silenced_keys.empty?
|
19
|
+
@redis.mget(*silenced_keys) do |silenced|
|
20
|
+
silenced_keys.each_with_index do |silenced_key, silenced_index|
|
21
|
+
if silenced[silenced_index]
|
22
|
+
silenced_info = Sensu::JSON.load(silenced[silenced_index])
|
23
|
+
@redis.ttl(silenced_key) do |ttl|
|
24
|
+
silenced_info[:expire] = ttl
|
25
|
+
entries << silenced_info
|
26
|
+
if silenced_index == silenced_keys.length - 1
|
27
|
+
yield(entries)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
else
|
31
|
+
@redis.srem("silenced", silenced_key)
|
32
|
+
if silenced_index == silenced_keys.length - 1
|
33
|
+
@redis.ping do
|
34
|
+
yield(entries)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
else
|
41
|
+
yield(entries)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# POST /silenced
|
46
|
+
def post_silenced
|
47
|
+
rules = {
|
48
|
+
:subscription => {:type => String, :nil_ok => true},
|
49
|
+
:check => {:type => String, :nil_ok => true, :regex => /\A[\w\.-]+\z/},
|
50
|
+
:expire => {:type => Integer, :nil_ok => true},
|
51
|
+
:reason => {:type => String, :nil_ok => true},
|
52
|
+
:creator => {:type => String, :nil_ok => true},
|
53
|
+
:expire_on_resolve => {:type => [TrueClass, FalseClass], :nil_ok => true}
|
54
|
+
}
|
55
|
+
read_data(rules) do |data|
|
56
|
+
if data[:subscription] || data[:check]
|
57
|
+
subscription = data.fetch(:subscription, "*")
|
58
|
+
check = data.fetch(:check, "*")
|
59
|
+
silenced_id = "#{subscription}:#{check}"
|
60
|
+
silenced_info = {
|
61
|
+
:id => silenced_id,
|
62
|
+
:subscription => data[:subscription],
|
63
|
+
:check => data[:check],
|
64
|
+
:reason => data[:reason],
|
65
|
+
:creator => data[:creator],
|
66
|
+
:expire_on_resolve => data.fetch(:expire_on_resolve, false)
|
67
|
+
}
|
68
|
+
silenced_key = "silence:#{silenced_id}"
|
69
|
+
@redis.set(silenced_key, Sensu::JSON.dump(silenced_info)) do
|
70
|
+
@redis.sadd("silenced", silenced_key) do
|
71
|
+
if data[:expire]
|
72
|
+
@redis.expire(silenced_key, data[:expire]) do
|
73
|
+
created!
|
74
|
+
end
|
75
|
+
else
|
76
|
+
created!
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
else
|
81
|
+
bad_request!
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
# GET /silenced
|
87
|
+
def get_silenced
|
88
|
+
@redis.smembers("silenced") do |silenced_keys|
|
89
|
+
silenced_keys = pagination(silenced_keys)
|
90
|
+
fetch_silenced(silenced_keys) do |silenced|
|
91
|
+
@response_content = silenced
|
92
|
+
respond
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# GET /silenced/subscriptions/:subscription
|
98
|
+
def get_silenced_subscription
|
99
|
+
subscription = parse_uri(SILENCED_SUBSCRIPTION_URI).first
|
100
|
+
@redis.smembers("silenced") do |silenced_keys|
|
101
|
+
silenced_keys.select! do |key|
|
102
|
+
key =~ /^silence:#{subscription}:/
|
103
|
+
end
|
104
|
+
silenced_keys = pagination(silenced_keys)
|
105
|
+
fetch_silenced(silenced_keys) do |silenced|
|
106
|
+
@response_content = silenced
|
107
|
+
respond
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
# GET /silenced/checks/:check
|
113
|
+
def get_silenced_check
|
114
|
+
check_name = parse_uri(SILENCED_CHECK_URI).first
|
115
|
+
@redis.smembers("silenced") do |silenced_keys|
|
116
|
+
silenced_keys.select! do |key|
|
117
|
+
key =~ /.*:#{check_name}$/
|
118
|
+
end
|
119
|
+
silenced_keys = pagination(silenced_keys)
|
120
|
+
fetch_silenced(silenced_keys) do |silenced|
|
121
|
+
@response_content = silenced
|
122
|
+
respond
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# POST /silenced/clear
|
128
|
+
def post_silenced_clear
|
129
|
+
rules = {
|
130
|
+
:id => {:type => String, :nil_ok => true},
|
131
|
+
:subscription => {:type => String, :nil_ok => true},
|
132
|
+
:check => {:type => String, :nil_ok => true, :regex => /\A[\w\.-]+\z/}
|
133
|
+
}
|
134
|
+
read_data(rules) do |data|
|
135
|
+
if !data[:id].nil? || (data[:subscription] || data[:check])
|
136
|
+
subscription = data.fetch(:subscription, "*")
|
137
|
+
check = data.fetch(:check, "*")
|
138
|
+
silenced_id = data[:id] || "#{subscription}:#{check}"
|
139
|
+
silenced_key = "silence:#{silenced_id}"
|
140
|
+
@redis.srem("silenced", silenced_key) do
|
141
|
+
@redis.del(silenced_key) do |deleted|
|
142
|
+
deleted ? no_content! : not_found!
|
143
|
+
end
|
144
|
+
end
|
145
|
+
else
|
146
|
+
bad_request!
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
data/lib/sensu/client/process.rb
CHANGED
@@ -297,15 +297,20 @@ module Sensu
|
|
297
297
|
# using a calculated execution splay. The timers are stored in
|
298
298
|
# the timers hash under `:run`, so they can be cancelled etc.
|
299
299
|
# Check definitions are duplicated before processing them, in
|
300
|
-
# case they are mutated.
|
301
|
-
#
|
300
|
+
# case they are mutated. A check will not be executed if it is
|
301
|
+
# subdued. The check `:issued` timestamp is set here, to mimic
|
302
|
+
# check requests issued by a Sensu server.
|
302
303
|
#
|
303
304
|
# @param checks [Array] of definitions.
|
304
305
|
def schedule_checks(checks)
|
305
306
|
checks.each do |check|
|
306
307
|
execute_check = Proc.new do
|
307
|
-
check
|
308
|
-
|
308
|
+
unless check_subdued?(check)
|
309
|
+
check[:issued] = Time.now.to_i
|
310
|
+
process_check_request(check.dup)
|
311
|
+
else
|
312
|
+
@logger.info("check execution was subdued", :check => check)
|
313
|
+
end
|
309
314
|
end
|
310
315
|
execution_splay = testing? ? 0 : calculate_execution_splay(check)
|
311
316
|
interval = testing? ? 0.5 : check[:interval]
|
@@ -318,15 +323,16 @@ module Sensu
|
|
318
323
|
|
319
324
|
# Setup standalone check executions, scheduling standard check
|
320
325
|
# definition and check extension executions. Check definitions
|
321
|
-
# and extensions with `:standalone` set to `true
|
322
|
-
#
|
326
|
+
# and extensions with `:standalone` set to `true`, have a
|
327
|
+
# integer `:interval`, and do not have `:publish` set to `false`
|
328
|
+
# will be scheduled by the Sensu client for execution.
|
323
329
|
def setup_standalone
|
324
330
|
@logger.debug("scheduling standalone checks")
|
325
331
|
standard_checks = @settings.checks.select do |check|
|
326
|
-
check[:standalone]
|
332
|
+
check[:standalone] && check[:interval].is_a?(Integer) && check[:publish] != false
|
327
333
|
end
|
328
334
|
extension_checks = @extensions.checks.select do |check|
|
329
|
-
check[:standalone] && check[:interval].is_a?(Integer)
|
335
|
+
check[:standalone] && check[:interval].is_a?(Integer) && check[:publish] != false
|
330
336
|
end
|
331
337
|
schedule_checks(standard_checks + extension_checks)
|
332
338
|
end
|
data/lib/sensu/constants.rb
CHANGED
data/lib/sensu/daemon.rb
CHANGED
@@ -4,12 +4,12 @@ gem "eventmachine", "1.2.0.1"
|
|
4
4
|
|
5
5
|
gem "sensu-json", "2.0.0"
|
6
6
|
gem "sensu-logger", "1.2.0"
|
7
|
-
gem "sensu-settings", "
|
7
|
+
gem "sensu-settings", "9.1.0"
|
8
8
|
gem "sensu-extension", "1.5.0"
|
9
|
-
gem "sensu-extensions", "1.
|
9
|
+
gem "sensu-extensions", "1.7.0"
|
10
10
|
gem "sensu-transport", "6.0.0"
|
11
11
|
gem "sensu-spawn", "2.2.0"
|
12
|
-
gem "sensu-redis", "1.
|
12
|
+
gem "sensu-redis", "1.6.0"
|
13
13
|
|
14
14
|
require "time"
|
15
15
|
require "uri"
|
@@ -34,19 +34,21 @@ module Sensu
|
|
34
34
|
module Daemon
|
35
35
|
include Utilities
|
36
36
|
|
37
|
-
attr_reader :start_time
|
37
|
+
attr_reader :start_time, :settings
|
38
38
|
|
39
39
|
# Initialize the Sensu process. Set the start time, initial
|
40
|
-
# service state,
|
41
|
-
#
|
42
|
-
#
|
43
|
-
#
|
40
|
+
# service state, double the maximum number of EventMachine timers,
|
41
|
+
# set up the logger, and load settings. This method will load
|
42
|
+
# extensions and setup Sensu Spawn if the Sensu process is not the
|
43
|
+
# Sensu API. This method can and optionally daemonize the process
|
44
|
+
# and/or create a PID file.
|
44
45
|
#
|
45
46
|
# @param options [Hash]
|
46
47
|
def initialize(options={})
|
47
48
|
@start_time = Time.now.to_i
|
48
49
|
@state = :initializing
|
49
50
|
@timers = {:run => []}
|
51
|
+
EM::set_max_timers(200000) unless EM::reactor_running?
|
50
52
|
setup_logger(options)
|
51
53
|
load_settings(options)
|
52
54
|
unless sensu_service_name == "api"
|
@@ -148,7 +150,8 @@ module Sensu
|
|
148
150
|
#
|
149
151
|
# @param options [Hash]
|
150
152
|
def load_extensions(options={})
|
151
|
-
|
153
|
+
extensions_options = options.merge(:extensions => @settings[:extensions])
|
154
|
+
@extensions = Extensions.get(extensions_options)
|
152
155
|
log_notices(@extensions.warnings)
|
153
156
|
extension_settings = @settings.to_hash.dup
|
154
157
|
@extensions.all.each do |extension|
|
data/lib/sensu/server/filter.rb
CHANGED
@@ -5,112 +5,13 @@ module Sensu
|
|
5
5
|
module Filter
|
6
6
|
EVAL_PREFIX = "eval:".freeze
|
7
7
|
|
8
|
-
# Determine if
|
9
|
-
# provided condition must have a `:begin` and `:end` time, eg.
|
10
|
-
# "11:30:00 PM", or `false` will be returned.
|
11
|
-
#
|
12
|
-
# @param condition [Hash]
|
13
|
-
# @option condition [String] :begin time.
|
14
|
-
# @option condition [String] :end time.
|
15
|
-
# @return [TrueClass, FalseClass]
|
16
|
-
def subdue_time?(condition)
|
17
|
-
if condition.has_key?(:begin) && condition.has_key?(:end)
|
18
|
-
begin_time = Time.parse(condition[:begin])
|
19
|
-
end_time = Time.parse(condition[:end])
|
20
|
-
if end_time < begin_time
|
21
|
-
if Time.now < end_time
|
22
|
-
begin_time = Time.parse("12:00:00 AM")
|
23
|
-
else
|
24
|
-
end_time = Time.parse("11:59:59 PM")
|
25
|
-
end
|
26
|
-
end
|
27
|
-
Time.now >= begin_time && Time.now <= end_time
|
28
|
-
else
|
29
|
-
false
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
# Determine if the current day is subdued. The provided
|
34
|
-
# condition must have a list of `:days`, or false will be
|
35
|
-
# returned.
|
36
|
-
#
|
37
|
-
# @param condition [Hash]
|
38
|
-
# @option condition [Array] :days of the week to subdue.
|
39
|
-
# @return [TrueClass, FalseClass]
|
40
|
-
def subdue_days?(condition)
|
41
|
-
if condition.has_key?(:days)
|
42
|
-
days = condition[:days].map(&:downcase)
|
43
|
-
days.include?(Time.now.strftime("%A").downcase)
|
44
|
-
else
|
45
|
-
false
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
# Determine if there is an exception a period of time (window)
|
50
|
-
# that is subdued. The provided condition must have an
|
51
|
-
# `:exception`, containing one or more `:begin` and `:end`
|
52
|
-
# times, eg. "11:30:00 PM", or `false` will be returned. If
|
53
|
-
# there are any exceptions to a subdued period of time, `true`
|
54
|
-
# will be returned.
|
55
|
-
#
|
56
|
-
# @param condition [Hash]
|
57
|
-
# @option condition [Hash] :exceptions array of `:begin` and
|
58
|
-
# `:end` times.
|
59
|
-
# @return [TrueClass, FalseClass]
|
60
|
-
def subdue_exception?(condition)
|
61
|
-
if condition.has_key?(:exceptions)
|
62
|
-
condition[:exceptions].any? do |exception|
|
63
|
-
Time.now >= Time.parse(exception[:begin]) && Time.now <= Time.parse(exception[:end])
|
64
|
-
end
|
65
|
-
else
|
66
|
-
false
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# Determine if an action is subdued and if there is an
|
71
|
-
# exception. This method makes use of `subdue_time?()`,
|
72
|
-
# `subdue_days?()`, and subdue_exception?().
|
73
|
-
#
|
74
|
-
# @param condition [Hash]
|
75
|
-
# @return [TrueClass, FalseClass]
|
76
|
-
def action_subdued?(condition)
|
77
|
-
subdued = subdue_time?(condition) || subdue_days?(condition)
|
78
|
-
subdued && !subdue_exception?(condition)
|
79
|
-
end
|
80
|
-
|
81
|
-
# Determine if an event handler is subdued, by conditions set in
|
82
|
-
# the check and/or the handler definition. If any of the
|
83
|
-
# conditions are true, without an exception, the handler is
|
84
|
-
# subdued.
|
8
|
+
# Determine if an event handler is silenced.
|
85
9
|
#
|
86
10
|
# @param handler [Hash] definition.
|
87
|
-
# @param event [Hash]
|
88
|
-
# conditions.
|
89
|
-
# @return [TrueClass, FalseClass]
|
90
|
-
def handler_subdued?(handler, event)
|
91
|
-
subdued = []
|
92
|
-
if handler[:subdue]
|
93
|
-
subdued << action_subdued?(handler[:subdue])
|
94
|
-
end
|
95
|
-
check = event[:check]
|
96
|
-
if check[:subdue] && check[:subdue][:at] != "publisher"
|
97
|
-
subdued << action_subdued?(check[:subdue])
|
98
|
-
end
|
99
|
-
subdued.any?
|
100
|
-
end
|
101
|
-
|
102
|
-
# Determine if a check request is subdued, by conditions set in
|
103
|
-
# the check definition. If any of the conditions are true,
|
104
|
-
# without an exception, the check request is subdued.
|
105
|
-
#
|
106
|
-
# @param check [Hash] definition.
|
11
|
+
# @param event [Hash]
|
107
12
|
# @return [TrueClass, FalseClass]
|
108
|
-
def
|
109
|
-
|
110
|
-
action_subdued?(check[:subdue])
|
111
|
-
else
|
112
|
-
false
|
113
|
-
end
|
13
|
+
def handler_silenced?(handler, event)
|
14
|
+
event[:silenced] && !handler[:handle_silenced]
|
114
15
|
end
|
115
16
|
|
116
17
|
# Determine if handling is disabled for an event. Check
|
@@ -257,13 +158,64 @@ module Sensu
|
|
257
158
|
end
|
258
159
|
end
|
259
160
|
|
260
|
-
# Determine if
|
161
|
+
# Determine if a filter is to be evoked for the current time. A
|
162
|
+
# filter can be configured with a time window defining when it
|
163
|
+
# is to be evoked, e.g. Monday through Friday, 9-5.
|
164
|
+
#
|
165
|
+
# @param filter [Hash] definition.
|
166
|
+
# @return [TrueClass, FalseClass]
|
167
|
+
def in_filter_time_windows?(filter)
|
168
|
+
if filter[:when]
|
169
|
+
in_time_windows?(filter[:when])
|
170
|
+
else
|
171
|
+
true
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
# Determine if an event is filtered by a native filter.
|
176
|
+
#
|
177
|
+
# @param filter_name [String]
|
178
|
+
# @param event [Hash]
|
179
|
+
# @yield [filtered] callback/block called with a single
|
180
|
+
# parameter to indicate if the event was filtered.
|
181
|
+
# @yieldparam filtered [TrueClass,FalseClass] indicating if the
|
182
|
+
# event was filtered.
|
183
|
+
def native_filter(filter_name, event)
|
184
|
+
filter = @settings[:filters][filter_name]
|
185
|
+
if in_filter_time_windows?(filter)
|
186
|
+
matched = filter_attributes_match?(event, filter[:attributes])
|
187
|
+
yield(filter[:negate] ? matched : !matched)
|
188
|
+
else
|
189
|
+
yield(false)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
# Determine if an event is filtered by a filter extension.
|
194
|
+
#
|
195
|
+
# @param filter_name [String]
|
196
|
+
# @param event [Hash]
|
197
|
+
# @yield [filtered] callback/block called with a single
|
198
|
+
# parameter to indicate if the event was filtered.
|
199
|
+
# @yieldparam filtered [TrueClass,FalseClass] indicating if the
|
200
|
+
# event was filtered.
|
201
|
+
def extension_filter(filter_name, event)
|
202
|
+
extension = @extensions[:filters][filter_name]
|
203
|
+
if in_filter_time_windows?(extension.definition)
|
204
|
+
extension.safe_run(event) do |output, status|
|
205
|
+
yield(status == 0)
|
206
|
+
end
|
207
|
+
else
|
208
|
+
yield(false)
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
# Determine if an event is filtered by an event filter, native
|
261
213
|
# or extension. This method first checks for the existence of a
|
262
|
-
#
|
263
|
-
#
|
264
|
-
#
|
265
|
-
#
|
266
|
-
#
|
214
|
+
# native filter, then checks for an extension if a native filter
|
215
|
+
# is not defined. The provided callback is called with a single
|
216
|
+
# parameter, indicating if the event was filtered by a filter.
|
217
|
+
# If a filter does not exist for the provided name, the event is
|
218
|
+
# not filtered.
|
267
219
|
#
|
268
220
|
# @param filter_name [String]
|
269
221
|
# @param event [Hash]
|
@@ -274,13 +226,12 @@ module Sensu
|
|
274
226
|
def event_filter(filter_name, event)
|
275
227
|
case
|
276
228
|
when @settings.filter_exists?(filter_name)
|
277
|
-
|
278
|
-
|
279
|
-
|
229
|
+
native_filter(filter_name, event) do |filtered|
|
230
|
+
yield(filtered)
|
231
|
+
end
|
280
232
|
when @extensions.filter_exists?(filter_name)
|
281
|
-
|
282
|
-
|
283
|
-
yield(status == 0)
|
233
|
+
extension_filter(filter_name, event) do |filtered|
|
234
|
+
yield(filtered)
|
284
235
|
end
|
285
236
|
else
|
286
237
|
@logger.error("unknown filter", :filter_name => filter_name)
|
@@ -340,8 +291,8 @@ module Sensu
|
|
340
291
|
"handler does not handle action"
|
341
292
|
when !handle_severity?(handler, event)
|
342
293
|
"handler does not handle event severity"
|
343
|
-
when
|
344
|
-
"handler is
|
294
|
+
when handler_silenced?(handler, event)
|
295
|
+
"handler is silenced"
|
345
296
|
end
|
346
297
|
if filter_message
|
347
298
|
@logger.info(filter_message, details)
|
data/lib/sensu/server/process.rb
CHANGED
@@ -275,26 +275,37 @@ module Sensu
|
|
275
275
|
end
|
276
276
|
end
|
277
277
|
|
278
|
-
# Add a check result to
|
279
|
-
# determined by the value of check `:
|
280
|
-
#
|
281
|
-
#
|
282
|
-
#
|
283
|
-
# name
|
284
|
-
#
|
278
|
+
# Add a check result to one or more aggregates. The aggregate name is
|
279
|
+
# determined by the value of check `:aggregates` array, if present,
|
280
|
+
# and falling back to `:aggregate` otherwise.
|
281
|
+
#
|
282
|
+
# When one or more aggregates are specified as `:aggregates`, the
|
283
|
+
# client name and check are updated on each aggregate.
|
284
|
+
#
|
285
|
+
# When no aggregates are specified as `:aggregates`, and `:aggregate`
|
286
|
+
# is `true` (legacy), the check `:name` is used as the aggregate name.
|
287
|
+
#
|
288
|
+
# When no aggregates are specified as `:aggregates` and check `:aggregate`
|
289
|
+
# is a string, it used as the aggregate name.
|
290
|
+
#
|
291
|
+
# This method will add the client name to configured aggregates, all
|
292
|
+
# other processing (e.g. counters) is done by the Sensu API on request.
|
285
293
|
#
|
286
294
|
# @param client [Hash]
|
287
295
|
# @param check [Hash]
|
288
296
|
def aggregate_check_result(client, check)
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
297
|
+
check_aggregate = (check[:aggregate].is_a?(String) ? check[:aggregate] : check[:name])
|
298
|
+
aggregate_list = Array(check[:aggregates] || check_aggregate)
|
299
|
+
aggregate_list.each do |aggregate|
|
300
|
+
@logger.debug("adding check result to aggregate", {
|
301
|
+
:aggregate => aggregate,
|
302
|
+
:client => client,
|
303
|
+
:check => check
|
304
|
+
})
|
305
|
+
aggregate_member = "#{client[:name]}:#{check[:name]}"
|
306
|
+
@redis.sadd("aggregates:#{aggregate}", aggregate_member) do
|
307
|
+
@redis.sadd("aggregates", aggregate)
|
308
|
+
end
|
298
309
|
end
|
299
310
|
end
|
300
311
|
|
@@ -414,6 +425,50 @@ module Sensu
|
|
414
425
|
end
|
415
426
|
end
|
416
427
|
|
428
|
+
# Determine if an event has been silenced. This method compiles
|
429
|
+
# an array of possible silenced registry entry keys for the
|
430
|
+
# event. An attempt is made to fetch one or more of the silenced
|
431
|
+
# registry entries to determine if the event has been silenced.
|
432
|
+
# The event data is updated to indicate if the event has been
|
433
|
+
# silenced. If the event is silenced and the event action is
|
434
|
+
# `:resolve`, silenced registry entries with
|
435
|
+
# `:expire_on_resolve` set to true will be deleted. Silencing is
|
436
|
+
# disabled for events with a check status of `0` (OK), unless
|
437
|
+
# the event action is `:resolve` or `:flapping`.
|
438
|
+
#
|
439
|
+
# @param event [Hash]
|
440
|
+
# @yield callback [event] callback/block called after the event
|
441
|
+
# data has been updated to indicate if it has been silenced.
|
442
|
+
def event_silenced?(event)
|
443
|
+
event[:silenced] = false
|
444
|
+
event[:silenced_by] = []
|
445
|
+
if event[:check][:status] != 0 || event[:action] != :create
|
446
|
+
check_name = event[:check][:name]
|
447
|
+
silenced_keys = event[:client][:subscriptions].map { |subscription|
|
448
|
+
["silence:#{subscription}:*", "silence:#{subscription}:#{check_name}"]
|
449
|
+
}.flatten
|
450
|
+
silenced_keys << "silence:*:#{check_name}"
|
451
|
+
@redis.mget(*silenced_keys) do |silenced|
|
452
|
+
silenced.compact!
|
453
|
+
event[:silenced] = !silenced.empty?
|
454
|
+
if event[:silenced]
|
455
|
+
silenced.each do |silenced_json|
|
456
|
+
silenced_info = Sensu::JSON.load(silenced_json)
|
457
|
+
event[:silenced_by] << silenced_info[:id]
|
458
|
+
silenced_key = "silence:#{silenced_info[:id]}"
|
459
|
+
if silenced_info[:expire_on_resolve] && event[:action] == :resolve
|
460
|
+
@redis.srem("silenced", silenced_key)
|
461
|
+
@redis.del(silenced_key)
|
462
|
+
end
|
463
|
+
end
|
464
|
+
end
|
465
|
+
yield(event)
|
466
|
+
end
|
467
|
+
else
|
468
|
+
yield(event)
|
469
|
+
end
|
470
|
+
end
|
471
|
+
|
417
472
|
# Update the event registry, stored in Redis. This method
|
418
473
|
# determines if event data warrants in the creation or update of
|
419
474
|
# event data in the registry. If a check `:status` is not
|
@@ -451,7 +506,8 @@ module Sensu
|
|
451
506
|
# Create an event, using the provided client and check result
|
452
507
|
# data. Existing event data for the client/check pair is fetched
|
453
508
|
# from the event registry to be used in the composition of the
|
454
|
-
# new event.
|
509
|
+
# new event. The silenced registry is used to determine if the
|
510
|
+
# event has been silenced.
|
455
511
|
#
|
456
512
|
# @param client [Hash]
|
457
513
|
# @param check [Hash]
|
@@ -469,6 +525,7 @@ module Sensu
|
|
469
525
|
:client => client,
|
470
526
|
:check => check,
|
471
527
|
:occurrences => 1,
|
528
|
+
:occurrences_watermark => 1,
|
472
529
|
:action => (flapping ? :flapping : :create),
|
473
530
|
:timestamp => Time.now.to_i
|
474
531
|
}
|
@@ -477,12 +534,17 @@ module Sensu
|
|
477
534
|
event[:last_state_change] = stored_event[:last_state_change]
|
478
535
|
event[:last_ok] = stored_event[:last_ok]
|
479
536
|
event[:occurrences] = stored_event[:occurrences]
|
537
|
+
event[:occurrences_watermark] = stored_event[:occurrences_watermark] || event[:occurrences]
|
480
538
|
else
|
481
539
|
event[:id] = random_uuid
|
540
|
+
event[:last_ok] = event[:timestamp]
|
482
541
|
end
|
483
542
|
if check[:status] != 0 || flapping
|
484
543
|
if history[-1] == history[-2]
|
485
544
|
event[:occurrences] += 1
|
545
|
+
if event[:occurrences] > event[:occurrences_watermark]
|
546
|
+
event[:occurrences_watermark] = event[:occurrences]
|
547
|
+
end
|
486
548
|
else
|
487
549
|
event[:occurrences] = 1
|
488
550
|
event[:last_state_change] = event[:timestamp]
|
@@ -494,7 +556,9 @@ module Sensu
|
|
494
556
|
if check[:status] == 0
|
495
557
|
event[:last_ok] = event[:timestamp]
|
496
558
|
end
|
497
|
-
|
559
|
+
event_silenced?(event) do |event|
|
560
|
+
yield(event)
|
561
|
+
end
|
498
562
|
end
|
499
563
|
end
|
500
564
|
end
|
@@ -555,6 +619,16 @@ module Sensu
|
|
555
619
|
end
|
556
620
|
end
|
557
621
|
|
622
|
+
# Determine if a keepalive event exists for a client.
|
623
|
+
#
|
624
|
+
# @param client_name [String] name of client to look up in event registry.
|
625
|
+
# @return [TrueClass, FalseClass]
|
626
|
+
def keepalive_event_exists?(client_name)
|
627
|
+
@redis.hexists("events:#{client_name}", "keepalive") do |event_exists|
|
628
|
+
yield(event_exists)
|
629
|
+
end
|
630
|
+
end
|
631
|
+
|
558
632
|
# Process a check result, storing its data, inspecting its
|
559
633
|
# contents, and taking the appropriate actions (eg. update the
|
560
634
|
# event registry). The `@in_progress[:check_results]` counter is
|
@@ -579,7 +653,7 @@ module Sensu
|
|
579
653
|
end
|
580
654
|
check[:type] ||= STANDARD_CHECK_TYPE
|
581
655
|
check[:origin] = result[:client] if check[:source]
|
582
|
-
aggregate_check_result(client, check) if check[:aggregate]
|
656
|
+
aggregate_check_result(client, check) if check[:aggregates] || check[:aggregate]
|
583
657
|
store_check_result(client, check) do
|
584
658
|
create_event(client, check) do |event|
|
585
659
|
event_bridges(event)
|
@@ -693,7 +767,7 @@ module Sensu
|
|
693
767
|
def schedule_check_executions(checks)
|
694
768
|
checks.each do |check|
|
695
769
|
create_check_request = Proc.new do
|
696
|
-
unless
|
770
|
+
unless check_subdued?(check)
|
697
771
|
publish_check_request(check)
|
698
772
|
else
|
699
773
|
@logger.info("check request was subdued", :check => check)
|
@@ -877,10 +951,14 @@ module Sensu
|
|
877
951
|
time_since_last_execution = Time.now.to_i - check[:executed]
|
878
952
|
if time_since_last_execution >= check[:ttl]
|
879
953
|
client_name = result_key.split(":").first
|
880
|
-
|
881
|
-
|
882
|
-
|
883
|
-
|
954
|
+
keepalive_event_exists?(client_name) do |event_exists|
|
955
|
+
unless event_exists
|
956
|
+
check[:output] = "Last check execution was "
|
957
|
+
check[:output] << "#{time_since_last_execution} seconds ago"
|
958
|
+
check[:status] = 1
|
959
|
+
publish_check_result(client_name, check)
|
960
|
+
end
|
961
|
+
end
|
884
962
|
end
|
885
963
|
else
|
886
964
|
@redis.srem("ttl", result_key)
|
data/lib/sensu/utilities.rb
CHANGED
@@ -118,5 +118,69 @@ module Sensu
|
|
118
118
|
end
|
119
119
|
[substituted, unmatched_tokens]
|
120
120
|
end
|
121
|
+
|
122
|
+
# Determine if the current time falls within a time window. The
|
123
|
+
# provided condition must have a `:begin` and `:end` time, eg.
|
124
|
+
# "11:30:00 PM", or `false` will be returned.
|
125
|
+
#
|
126
|
+
# @param condition [Hash]
|
127
|
+
# @option condition [String] :begin time.
|
128
|
+
# @option condition [String] :end time.
|
129
|
+
# @return [TrueClass, FalseClass]
|
130
|
+
def in_time_window?(condition)
|
131
|
+
if condition.has_key?(:begin) && condition.has_key?(:end)
|
132
|
+
begin_time = Time.parse(condition[:begin])
|
133
|
+
end_time = Time.parse(condition[:end])
|
134
|
+
if end_time < begin_time
|
135
|
+
if Time.now < end_time
|
136
|
+
begin_time = Time.parse("12:00:00 AM")
|
137
|
+
else
|
138
|
+
end_time = Time.parse("11:59:59 PM")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
Time.now >= begin_time && Time.now <= end_time
|
142
|
+
else
|
143
|
+
false
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
# Determine if time window conditions for one or more days of the
|
148
|
+
# week are met. If a day of the week is provided, it can provide
|
149
|
+
# one or more conditions, each with a `:begin` and `:end` time,
|
150
|
+
# eg. "11:30:00 PM", or `false` will be returned.
|
151
|
+
#
|
152
|
+
# @param conditions [Hash]
|
153
|
+
# @option conditions [String] :days of the week.
|
154
|
+
# @return [TrueClass, FalseClass]
|
155
|
+
def in_time_windows?(conditions)
|
156
|
+
in_window = false
|
157
|
+
window_days = conditions[:days] || {}
|
158
|
+
if window_days[:all]
|
159
|
+
in_window = window_days[:all].any? do |condition|
|
160
|
+
in_time_window?(condition)
|
161
|
+
end
|
162
|
+
end
|
163
|
+
current_day = Time.now.strftime("%A").downcase.to_sym
|
164
|
+
if !in_window && window_days[current_day]
|
165
|
+
in_window = window_days[current_day].any? do |condition|
|
166
|
+
in_time_window?(condition)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
in_window
|
170
|
+
end
|
171
|
+
|
172
|
+
# Determine if a check is subdued, by conditions set in the check
|
173
|
+
# definition. If any of the conditions are true, without an
|
174
|
+
# exception, the check is subdued.
|
175
|
+
#
|
176
|
+
# @param check [Hash] definition.
|
177
|
+
# @return [TrueClass, FalseClass]
|
178
|
+
def check_subdued?(check)
|
179
|
+
if check[:subdue]
|
180
|
+
in_time_windows?(check[:subdue])
|
181
|
+
else
|
182
|
+
false
|
183
|
+
end
|
184
|
+
end
|
121
185
|
end
|
122
186
|
end
|
data/sensu.gemspec
CHANGED
@@ -15,12 +15,12 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.add_dependency "eventmachine", "1.2.0.1"
|
16
16
|
s.add_dependency "sensu-json", "2.0.0"
|
17
17
|
s.add_dependency "sensu-logger", "1.2.0"
|
18
|
-
s.add_dependency "sensu-settings", "
|
18
|
+
s.add_dependency "sensu-settings", "9.1.0"
|
19
19
|
s.add_dependency "sensu-extension", "1.5.0"
|
20
|
-
s.add_dependency "sensu-extensions", "1.
|
20
|
+
s.add_dependency "sensu-extensions", "1.7.0"
|
21
21
|
s.add_dependency "sensu-transport", "6.0.0"
|
22
22
|
s.add_dependency "sensu-spawn", "2.2.0"
|
23
|
-
s.add_dependency "sensu-redis", "1.
|
23
|
+
s.add_dependency "sensu-redis", "1.6.0"
|
24
24
|
s.add_dependency "em-http-server", "0.1.8"
|
25
25
|
|
26
26
|
s.add_development_dependency "rake", "10.5.0"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.26.0.beta
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sean Porter
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-08-
|
12
|
+
date: 2016-08-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: eventmachine
|
@@ -59,14 +59,14 @@ dependencies:
|
|
59
59
|
requirements:
|
60
60
|
- - '='
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
62
|
+
version: 9.1.0
|
63
63
|
type: :runtime
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - '='
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
69
|
+
version: 9.1.0
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: sensu-extension
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,14 +87,14 @@ dependencies:
|
|
87
87
|
requirements:
|
88
88
|
- - '='
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version: 1.
|
90
|
+
version: 1.7.0
|
91
91
|
type: :runtime
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
95
|
- - '='
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version: 1.
|
97
|
+
version: 1.7.0
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: sensu-transport
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
@@ -129,14 +129,14 @@ dependencies:
|
|
129
129
|
requirements:
|
130
130
|
- - '='
|
131
131
|
- !ruby/object:Gem::Version
|
132
|
-
version: 1.
|
132
|
+
version: 1.6.0
|
133
133
|
type: :runtime
|
134
134
|
prerelease: false
|
135
135
|
version_requirements: !ruby/object:Gem::Requirement
|
136
136
|
requirements:
|
137
137
|
- - '='
|
138
138
|
- !ruby/object:Gem::Version
|
139
|
-
version: 1.
|
139
|
+
version: 1.6.0
|
140
140
|
- !ruby/object:Gem::Dependency
|
141
141
|
name: em-http-server
|
142
142
|
requirement: !ruby/object:Gem::Requirement
|
@@ -239,6 +239,7 @@ files:
|
|
239
239
|
- lib/sensu/api/routes/request.rb
|
240
240
|
- lib/sensu/api/routes/resolve.rb
|
241
241
|
- lib/sensu/api/routes/results.rb
|
242
|
+
- lib/sensu/api/routes/silenced.rb
|
242
243
|
- lib/sensu/api/routes/stashes.rb
|
243
244
|
- lib/sensu/api/utilities/publish_check_request.rb
|
244
245
|
- lib/sensu/api/utilities/publish_check_result.rb
|
@@ -274,9 +275,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
274
275
|
version: '0'
|
275
276
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
276
277
|
requirements:
|
277
|
-
- - "
|
278
|
+
- - ">"
|
278
279
|
- !ruby/object:Gem::Version
|
279
|
-
version:
|
280
|
+
version: 1.3.1
|
280
281
|
requirements: []
|
281
282
|
rubyforge_project:
|
282
283
|
rubygems_version: 2.6.3
|