sensu-extensions-check-deps 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5809597894d95fd153b57025b12ef9a0d9a02e80
4
- data.tar.gz: cb13407e0ae4c6553892a43a0201545df833c398
3
+ metadata.gz: 6e2ba3613eeaea04f758239bfe48ee60bdedd0c2
4
+ data.tar.gz: fe25b9a5d0333443de861370f662e9929cc98402
5
5
  SHA512:
6
- metadata.gz: 679709902130df38fa85c9c7a6f61ace6c5b208b278ce306c0b89f5a16dd03ea0f30dcfd9f1a302e82c1b509e263df2f2e846c4c24f1e41ac9cf179ead0bc4db
7
- data.tar.gz: ad1e4593451fb35d396c9bdbc9175b091c6f00de8eeeb09446f1b2f1b30f930f0e31f83a2b355978378c656aa14712cbccce3872194a6403678bcddf129ca298
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", 0]
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.3
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-29 00:00:00.000000000 Z
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 push message to Rabbitmq with event
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 push message to Rabbitmq with event json
131
+ summary: Filter events when event exists and post message to Slack
132
132
  test_files: []