Class: Sensu::Extension::CheckDeps

Inherits:
Filter
  • Object
show all
Defined in:
lib/sensu/extensions/check-deps.rb

Instance Method Summary collapse

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`.

Parameters:

  • client_name (String)
  • check_name (String)

Returns:

  • (Boolean)


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`).

Parameters:

  • event (Hash)

Returns:

  • (Boolean)


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

#descriptionObject



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

#nameObject



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.

Parameters:

  • path (String)

Returns:

  • (Object)

    http response object.



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`.

Parameters:

  • subscription_name (String)
  • check_name (String)

Returns:

  • (Boolean)


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(message, err=false)
      webhook = "T02B3AJ9B/BAYDG2VHN/jOVR3fy8AG5O7Y4ftTfNzon7"
      webhookUrl = "https://hooks.slack.com/services/" + webhook
      channel = "#sensu"
      begin
      payload = {
          :channel  => channel,
          :text     => message,
      }.to_json
        cmd = "curl -X POST --data-urlencode 'payload=#{payload}' #{webhookUrl}"
        system(cmd)
      rescue
              puts "failed to notify slack, proceeding..."
      end
end