sensu-extensions-check-deps 0.0.3 → 0.0.4
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-any.rb +132 -0
- data/lib/sensu/extensions/check-deps.rb +24 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6e2ba3613eeaea04f758239bfe48ee60bdedd0c2
|
4
|
+
data.tar.gz: fe25b9a5d0333443de861370f662e9929cc98402
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 948ae5fe2c3d3612c1a11af48b8a38d3f7d8e8b3d8ed713594153ccdc53792d4246ca53abedd730381feb7c8994d4a2d4ad8ace8d1325eb386fcf050ec876286
|
7
|
+
data.tar.gz: c66748f87fa1fc9b3f179d50d5b53503496cb68e4b1ade77f5eeb9769c5e55bb8654b187ee8478e25a5296742f2f3902fb73ba5f449f24dc41c8b8e59597e97e
|
@@ -0,0 +1,132 @@
|
|
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
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require "sensu/extension"
|
2
2
|
require "timeout"
|
3
3
|
require "net/http"
|
4
|
+
require 'json'
|
4
5
|
|
5
6
|
module Sensu
|
6
7
|
module Extension
|
@@ -13,12 +14,32 @@ module Sensu
|
|
13
14
|
"filter events when an event exists and send to RabbitMQ event json"
|
14
15
|
end
|
15
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
|
+
|
16
36
|
# Make an HTTP GET request to the Sensu API, using the URI
|
17
37
|
# path provided. Uses Sensu settings to determine how to
|
18
38
|
# connect to the API.
|
19
39
|
#
|
20
40
|
# @param path [String]
|
21
41
|
# @return [Object] http response object.
|
42
|
+
|
22
43
|
def sensu_api_get_request(path)
|
23
44
|
api = @settings[:api] || {}
|
24
45
|
request = Net::HTTP::Get.new(path)
|
@@ -64,6 +85,7 @@ module Sensu
|
|
64
85
|
#
|
65
86
|
# @param event [Hash]
|
66
87
|
# @return [Boolean]
|
88
|
+
|
67
89
|
def dependency_events_exist?(event)
|
68
90
|
if event[:check][:dependencies].is_a?(Array)
|
69
91
|
event[:check][:dependencies].any? do |dependency|
|
@@ -92,7 +114,8 @@ module Sensu
|
|
92
114
|
begin
|
93
115
|
Timeout::timeout(10) do
|
94
116
|
if dependency_events_exist?(event)
|
95
|
-
["event exists for check dependency",
|
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])
|
96
119
|
else
|
97
120
|
["no current events for check dependencies", 1]
|
98
121
|
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.0.4
|
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-05-
|
11
|
+
date: 2018-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sensu-extension
|
@@ -94,8 +94,7 @@ dependencies:
|
|
94
94
|
- - ">="
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: '0'
|
97
|
-
description: Filter events when event exists and
|
98
|
-
json
|
97
|
+
description: Filter events when event exists and post message to Slack
|
99
98
|
email:
|
100
99
|
- "<vladimir@appsflyer.com>"
|
101
100
|
executables: []
|
@@ -105,6 +104,7 @@ files:
|
|
105
104
|
- CHANGELOG.md
|
106
105
|
- LICENSE
|
107
106
|
- README.md
|
107
|
+
- lib/sensu/extensions/check-deps-any.rb
|
108
108
|
- lib/sensu/extensions/check-deps.rb
|
109
109
|
homepage: https://github.com/mau1024/sensu-extensions-check-deps
|
110
110
|
licenses: []
|
@@ -128,5 +128,5 @@ rubyforge_project:
|
|
128
128
|
rubygems_version: 2.6.11
|
129
129
|
signing_key:
|
130
130
|
specification_version: 4
|
131
|
-
summary: Filter events when event exists and
|
131
|
+
summary: Filter events when event exists and post message to Slack
|
132
132
|
test_files: []
|