Class: Sensu::Extension::CheckDeps
- Inherits:
-
Filter
- Object
- Filter
- Sensu::Extension::CheckDeps
- Defined in:
- lib/sensu/extensions/check-deps.rb
Instance Method Summary collapse
-
#client_event_exists?(client_name, check_name) ⇒ Boolean
Check to see if an event exists for a client/check pair.
-
#dependency_events_exist?(event) ⇒ Boolean
Determine if an event exists for any of the check dependencies declared in the event data, specified in array, check ‘dependencies`.
- #description ⇒ Object
- #name ⇒ Object
- #run(event, &callback) ⇒ Object
-
#sensu_api_get_request(path) ⇒ Object
Make an HTTP GET request to the Sensu API, using the URI path provided.
-
#subscription_event_exists?(subscription_name, check_name) ⇒ Boolean
Check to see if an event exists for a subscription/check pair.
-
#writeToSlack(message, err = false) ⇒ Object
Will post Slack message to channel sensu.
Instance Method Details
#client_event_exists?(client_name, check_name) ⇒ Boolean
Check to see if an event exists for a client/check pair. This method is looking for a HTTP response code of ‘200`.
58 59 60 61 62 |
# File 'lib/sensu/extensions/check-deps.rb', line 58 def client_event_exists?(client_name, check_name) path = "/events/#{client_name}/#{check_name}" response = sensu_api_get_request(path) response.code.to_i == 200 end |
#dependency_events_exist?(event) ⇒ Boolean
Determine if an event exists for any of the check dependencies declared in the event data, specified in array, check ‘dependencies`. A check dependency can be a check executed by the same Sensu client (eg. `check_app`), a client/check pair (eg.`i-424242/check_mysql`), or a subscription/check pair (eg. `subscription:mysql/check_mysql`).
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'lib/sensu/extensions/check-deps.rb', line 87 def dependency_events_exist?(event) dependencies_string = event[:check][:dependencies][:dependency] dependencies_array = dependencies_string.split(" ") dependencies_array ||= [] if dependencies_array.is_a?(Array) dependencies_array.any? do |dependency| begin check_name, entity = dependency.split("/").reverse if entity =~ /^subscription:.*$/ subscription_name = entity.split(":")[1] subscription_event_exists?(subscription_name, check_name) else client_name = entity client_name ||= event[:client][:name] client_event_exists?(client_name, check_name) end rescue => error @logger.error("failed to query api for a check dependency event", :error => error) false end end else false end end |
#description ⇒ Object
13 14 15 |
# File 'lib/sensu/extensions/check-deps.rb', line 13 def description "filter events when an event exists and send slack to channel sensu" end |
#name ⇒ Object
9 10 11 |
# File 'lib/sensu/extensions/check-deps.rb', line 9 def name "check_deps" end |
#run(event, &callback) ⇒ Object
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 |
# File 'lib/sensu/extensions/check-deps.rb', line 113 def run(event, &callback) filter = Proc.new do begin dependencies_string = event[:check][:dependencies][:dependency] dependencies_string ||= "empty" @logger.info("check_deps filter: Processing #{event[:check][:name]} #{event[:action]} dependencies: #{dependencies_string} ") writeToSlack(":face_with_monocle: Processing #{event[:check][:name]} #{event[:action]}") Timeout::timeout(10) do if dependency_events_exist?(event) #writeToSlack(":no_entry: event exists for check dependency") writeToSlack(":no_entry: Event: #{event[:check][:name]} will be blocked Action: #{event[:action]}. Deps list: #{dependencies_string}") ["event exists for check dependency", 1] else #writeToSlack(":arrow_up: no current events for check dependencies") writeToSlack(":arrow_up: Event: #{event[:check][:name]} will pass. Action: #{event[:action]}. Deps list: #{dependencies_string}") ["no current events for check dependencies", 1] end end rescue => error @logger.error("check dependencies filter error", :error => error.to_s) ["check dependencies filter error: #{error}", 1] end end EM.defer(filter, callback) end |
#sensu_api_get_request(path) ⇒ Object
Make an HTTP GET request to the Sensu API, using the URI path provided. Uses Sensu settings to determine how to connect to the API.
41 42 43 44 45 46 47 48 49 50 |
# File 'lib/sensu/extensions/check-deps.rb', line 41 def sensu_api_get_request(path) api = @settings[:api] || {} request = Net::HTTP::Get.new(path) if api[:user] request.basic_auth(api[:user], api[:password]) end Net::HTTP.new(api[:host] || '127.0.0.1', api[:port] || 4567).start do |http| http.request(request) end end |
#subscription_event_exists?(subscription_name, check_name) ⇒ Boolean
Check to see if an event exists for a subscription/check pair. This method is looking for a HTTP response code of ‘200`.
70 71 72 73 74 75 |
# File 'lib/sensu/extensions/check-deps.rb', line 70 def subscription_event_exists?(subscription_name, check_name) path = "/events" response = sensu_api_get_request(path) events = JSON.load(response.body) !events.select { |event| event[:client][:subscriptions].include?(subscription_name) && event[:check][:name] == check_name}.empty? end |
#writeToSlack(message, err = false) ⇒ Object
Will post Slack message to channel sensu
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/sensu/extensions/check-deps.rb', line 18 def writeToSlack(, err=false) webhook = "T02B3AJ9B/BAYDG2VHN/jOVR3fy8AG5O7Y4ftTfNzon7" webhookUrl = "https://hooks.slack.com/services/" + webhook channel = "#sensu" begin payload = { :channel => channel, :text => , }.to_json cmd = "curl -X POST --data-urlencode 'payload=#{payload}' #{webhookUrl}" system(cmd) rescue puts "failed to notify slack, proceeding..." end end |