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 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: []