sensu-extensions-check-deps 0.0.9 → 0.1.0
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/lib/sensu/extensions/check-deps.rb +75 -72
- metadata +2 -3
- data/lib/sensu/extensions/check-deps-any.rb +0 -132
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59be05b85439a80f8d74c90373dea64ea9247e0b
|
4
|
+
data.tar.gz: dbb25f5246f5aa96ff3ea55a65f56a5420bd55ed
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb2ceb055ffab70b523c7d61798800b5bb1dcd8a225bcb290468d182b35456bc70dc2ff14c7831d03287af2a06d8df1d3cade9bd830eb129ac2cb9ee355d42a6
|
7
|
+
data.tar.gz: 0f351aca2dfed91df4d4e1e40fecb05829f854c729b9f9198e01542d45b735be552b1c43e52f6bf497c2715869f3440c2021842208c870981eb79d711ca49ad9
|
@@ -11,12 +11,12 @@ module Sensu
|
|
11
11
|
end
|
12
12
|
|
13
13
|
def description
|
14
|
-
"filter events when an event exists and send to
|
14
|
+
"filter events when an event exists and send slack to channel sensu"
|
15
15
|
end
|
16
16
|
|
17
17
|
# Will post Slack message to channel sensu
|
18
|
-
|
19
|
-
|
18
|
+
def writeToSlack(message, err=false)
|
19
|
+
webhook = "T02B3AJ9B/BAYDG2VHN/jOVR3fy8AG5O7Y4ftTfNzon7"
|
20
20
|
webhookUrl = "https://hooks.slack.com/services/" + webhook
|
21
21
|
channel = "#sensu"
|
22
22
|
begin
|
@@ -59,79 +59,82 @@ module Sensu
|
|
59
59
|
path = "/events/#{client_name}/#{check_name}"
|
60
60
|
response = sensu_api_get_request(path)
|
61
61
|
response.code.to_i == 200
|
62
|
-
|
62
|
+
end
|
63
63
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
64
|
+
# Check to see if an event exists for a subscription/check pair. This
|
65
|
+
# method is looking for a HTTP response code of `200`.
|
66
|
+
#
|
67
|
+
# @param subscription_name [String]
|
68
|
+
# @param check_name [String]
|
69
|
+
# @return [Boolean]
|
70
|
+
def subscription_event_exists?(subscription_name, check_name)
|
71
|
+
path = "/events"
|
72
|
+
response = sensu_api_get_request(path)
|
73
|
+
events = JSON.load(response.body)
|
74
|
+
!events.select { |event| event[:client][:subscriptions].include?(subscription_name) && event[:check][:name] == check_name}.empty?
|
75
|
+
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
77
|
+
# Determine if an event exists for any of the check
|
78
|
+
# dependencies declared in the event data, specified in array,
|
79
|
+
# check `dependencies`. A check dependency can be a check
|
80
|
+
# executed by the same Sensu client (eg. `check_app`), a
|
81
|
+
# client/check pair (eg.`i-424242/check_mysql`), or a
|
82
|
+
# subscription/check pair (eg. `subscription:mysql/check_mysql`).
|
83
|
+
#
|
84
|
+
# @param event [Hash]
|
85
|
+
# @return [Boolean]
|
86
86
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
87
|
+
def dependency_events_exist?(event)
|
88
|
+
dependencies_string = event[:check][:dependencies][:dependency]
|
89
|
+
dependencies_array = dependencies_string.split(" ")
|
90
|
+
dependencies_array ||= []
|
91
|
+
if dependencies_array.is_a?(Array)
|
92
|
+
dependencies_array.any? do |dependency|
|
93
|
+
begin
|
94
|
+
check_name, entity = dependency.split("/").reverse
|
95
|
+
if entity =~ /^subscription:.*$/
|
96
|
+
subscription_name = entity.split(":")[1]
|
97
|
+
subscription_event_exists?(subscription_name, check_name)
|
98
|
+
else
|
99
|
+
client_name = entity
|
100
|
+
client_name ||= event[:client][:name]
|
101
|
+
client_event_exists?(client_name, check_name)
|
102
|
+
end
|
103
|
+
rescue => error
|
104
|
+
@logger.error("failed to query api for a check dependency event", :error => error)
|
105
|
+
false
|
106
|
+
end
|
107
|
+
end
|
95
108
|
else
|
96
|
-
|
97
|
-
client_name ||= event[:client][:name]
|
98
|
-
client_event_exists?(client_name, check_name)
|
109
|
+
false
|
99
110
|
end
|
100
|
-
rescue => error
|
101
|
-
@logger.error("failed to query api for a check dependency event", :error => error)
|
102
|
-
false
|
103
111
|
end
|
104
|
-
end
|
105
|
-
else
|
106
|
-
false
|
107
|
-
end
|
108
|
-
end
|
109
112
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
end
|
113
|
+
def run(event, &callback)
|
114
|
+
filter = Proc.new do
|
115
|
+
begin
|
116
|
+
dependencies_string = event[:check][:dependencies][:dependency]
|
117
|
+
dependencies_string ||= "empty"
|
118
|
+
@logger.info("check_deps filter: Processing #{event[:check][:name]} #{event[:action]} dependencies: #{dependencies_string} ")
|
119
|
+
writeToSlack(":face_with_monocle: Processing #{event[:check][:name]} #{event[:action]}")
|
120
|
+
Timeout::timeout(10) do
|
121
|
+
if dependency_events_exist?(event)
|
122
|
+
#writeToSlack(":no_entry: event exists for check dependency")
|
123
|
+
writeToSlack(":no_entry: Event: #{event[:check][:name]} will be blocked Action: #{event[:action]}. Deps list: #{dependencies_string}")
|
124
|
+
["event exists for check dependency", 1]
|
125
|
+
else
|
126
|
+
#writeToSlack(":arrow_up: no current events for check dependencies")
|
127
|
+
writeToSlack(":arrow_up: Event: #{event[:check][:name]} will pass. Action: #{event[:action]}. Deps list: #{dependencies_string}")
|
128
|
+
["no current events for check dependencies", 1]
|
129
|
+
end
|
130
|
+
end
|
131
|
+
rescue => error
|
132
|
+
@logger.error("check dependencies filter error", :error => error.to_s)
|
133
|
+
["check dependencies filter error: #{error}", 1]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
EM.defer(filter, callback)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu-extensions-check-deps
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vladimir Mevzos
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sensu-extension
|
@@ -104,7 +104,6 @@ files:
|
|
104
104
|
- CHANGELOG.md
|
105
105
|
- LICENSE
|
106
106
|
- README.md
|
107
|
-
- lib/sensu/extensions/check-deps-any.rb
|
108
107
|
- lib/sensu/extensions/check-deps.rb
|
109
108
|
homepage: https://github.com/mau1024/sensu-extensions-check-deps
|
110
109
|
licenses: []
|
@@ -1,132 +0,0 @@
|
|
1
|
-
require "sensu/extension"
|
2
|
-
require "timeout"
|
3
|
-
require "net/http"
|
4
|
-
require 'json'
|
5
|
-
|
6
|
-
module Sensu
|
7
|
-
module Extension
|
8
|
-
class CheckDeps < Filter
|
9
|
-
def name
|
10
|
-
"check_deps"
|
11
|
-
end
|
12
|
-
|
13
|
-
def description
|
14
|
-
"filter events when an event exists and send to RabbitMQ event json"
|
15
|
-
end
|
16
|
-
|
17
|
-
# Will post Slack message to channel sensu
|
18
|
-
def writeToSlack(message, err=false)
|
19
|
-
webhookUrl = "https://hooks.slack.com/services/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"
|
20
|
-
channel = "#sensu"
|
21
|
-
emoji = ":no_entry:"
|
22
|
-
begin
|
23
|
-
payload = {
|
24
|
-
:channel => channel,
|
25
|
-
:text => message,
|
26
|
-
:icon_url => emoji
|
27
|
-
}.to_json
|
28
|
-
cmd = "curl -X POST --data-urlencode 'payload=#{payload}' #{webhookUrl}"
|
29
|
-
system(cmd)
|
30
|
-
rescue
|
31
|
-
puts "failed to notify slack, proceeding..."
|
32
|
-
end
|
33
|
-
end
|
34
|
-
#writeToSlack("Event was blocked: " + @event['check']['name'] + "becasuse some of dependencies was already triggered. Deps list: "+ @event['check']['dependencies'])
|
35
|
-
|
36
|
-
# Make an HTTP GET request to the Sensu API, using the URI
|
37
|
-
# path provided. Uses Sensu settings to determine how to
|
38
|
-
# connect to the API.
|
39
|
-
#
|
40
|
-
# @param path [String]
|
41
|
-
# @return [Object] http response object.
|
42
|
-
|
43
|
-
def sensu_api_get_request(path)
|
44
|
-
api = @settings[:api] || {}
|
45
|
-
request = Net::HTTP::Get.new(path)
|
46
|
-
if api[:user]
|
47
|
-
request.basic_auth(api[:user], api[:password])
|
48
|
-
end
|
49
|
-
Net::HTTP.new(api[:host] || '127.0.0.1', api[:port] || 4567).start do |http|
|
50
|
-
http.request(request)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# Check to see if an event exists for a client/check pair. This
|
55
|
-
# method is looking for a HTTP response code of `200`.
|
56
|
-
#
|
57
|
-
# @param client_name [String]
|
58
|
-
# @param check_name [String]
|
59
|
-
# @return [Boolean]
|
60
|
-
def client_event_exists?(client_name, check_name)
|
61
|
-
path = "/events/#{client_name}/#{check_name}"
|
62
|
-
response = sensu_api_get_request(path)
|
63
|
-
response.code.to_i == 200
|
64
|
-
end
|
65
|
-
|
66
|
-
# Check to see if an event exists for a subscription/check pair. This
|
67
|
-
# method is looking for a HTTP response code of `200`.
|
68
|
-
#
|
69
|
-
# @param subscription_name [String]
|
70
|
-
# @param check_name [String]
|
71
|
-
# @return [Boolean]
|
72
|
-
def subscription_event_exists?(subscription_name, check_name)
|
73
|
-
path = "/events"
|
74
|
-
response = sensu_api_get_request(path)
|
75
|
-
events = JSON.load(response.body)
|
76
|
-
!events.select { |event| event[:client][:subscriptions].include?(subscription_name) && event[:check][:name] == check_name}.empty?
|
77
|
-
end
|
78
|
-
|
79
|
-
# Determine if an event exists for any of the check
|
80
|
-
# dependencies declared in the event data, specified in array,
|
81
|
-
# check `dependencies`. A check dependency can be a check
|
82
|
-
# executed by the same Sensu client (eg. `check_app`), a
|
83
|
-
# client/check pair (eg.`i-424242/check_mysql`), or a
|
84
|
-
# subscription/check pair (eg. `subscription:mysql/check_mysql`).
|
85
|
-
#
|
86
|
-
# @param event [Hash]
|
87
|
-
# @return [Boolean]
|
88
|
-
|
89
|
-
def dependency_events_exist?(event)
|
90
|
-
if event[:check][:dependencies].is_a?(Array)
|
91
|
-
event[:check][:dependencies].any? do |dependency|
|
92
|
-
begin
|
93
|
-
check_name, entity = dependency.split("/").reverse
|
94
|
-
if entity =~ /^subscription:.*$/
|
95
|
-
subscription_name = entity.split(":")[1]
|
96
|
-
subscription_event_exists?(subscription_name, check_name)
|
97
|
-
else
|
98
|
-
client_name = entity
|
99
|
-
client_name ||= event[:client][:name]
|
100
|
-
client_event_exists?(client_name, check_name)
|
101
|
-
end
|
102
|
-
rescue => error
|
103
|
-
@logger.error("failed to query api for a check dependency event", :error => error)
|
104
|
-
false
|
105
|
-
end
|
106
|
-
end
|
107
|
-
else
|
108
|
-
false
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def run(event, &callback)
|
113
|
-
filter = Proc.new do
|
114
|
-
begin
|
115
|
-
Timeout::timeout(10) do
|
116
|
-
if dependency_events_exist?(event)
|
117
|
-
["event exists for check dependency", 1]
|
118
|
-
writeToSlack("Event: " + event[check][name] + " will be blocked." "Some of dependencies were already triggered. Deps list: "+ event[check][dependencies])
|
119
|
-
else
|
120
|
-
["no current events for check dependencies", 1]
|
121
|
-
end
|
122
|
-
end
|
123
|
-
rescue => error
|
124
|
-
@logger.error("check dependencies filter error", :error => error.to_s)
|
125
|
-
["check dependencies filter error: #{error}", 1]
|
126
|
-
end
|
127
|
-
end
|
128
|
-
EM.defer(filter, callback)
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|