bin/check-cloudwatch-alarm.rb
#! /usr/bin/env ruby
#
# check-cloudwatch-alarm
#
# DESCRIPTION:
# This plugin retrieves the state of a CloudWatch alarm. Can be configured
# to trigger a warning or critical based on the result. Defaults to OK unless
# alarm is missing
#
# OUTPUT:
# plain-text
#
# PLATFORMS:
# Linux
#
# DEPENDENCIES:
# gem: aws-sdk
# gem: sensu-plugin
#
# USAGE:
# ./check-cloudwatch-alarm -n TestAlarm
# ./check-cloudwatch-alarm -c Alarm,INSUFFICIENT_DATA -n TestAlarm
# ./check-cloudwatch-alarm -c Alarm -w INSUFFICIENT_DATA -n TestAlarm
#
# NOTES:
#
# LICENSE:
# Justin McCarty
# Released under the same terms as Sensu (the MIT license); see LICENSE
# for details.
#
require 'sensu-plugin/check/cli'
require 'aws-sdk'
class CloudWatchCheck < Sensu::Plugin::Check::CLI
option :aws_access_key,
short: '-a AWS_ACCESS_KEY',
long: '--aws-access-key AWS_ACCESS_KEY',
description: "AWS Access Key. Either set ENV['AWS_ACCESS_KEY'] or provide it as an option",
default: ENV['AWS_ACCESS_KEY']
option :aws_secret_access_key,
short: '-k AWS_SECRET_KEY',
long: '--aws-secret-access-key AWS_SECRET_KEY',
description: "AWS Secret Access Key. Either set ENV['AWS_SECRET_KEY'] or provide it as an option",
default: ENV['AWS_SECRET_KEY']
option :aws_region,
short: '-r AWS_REGION',
long: '--aws-region REGION',
description: 'AWS Region (defaults to us-east-1).',
default: 'us-east-1'
option :name,
description: 'Alarm name',
short: '-n NAME',
long: '--name NAME',
default: ''
option :critical,
description: 'Critical List',
short: '-c Criticals',
long: '--critical',
default: ''
option :warning,
description: 'Warning state threshold',
short: '-w THRESHOLD',
long: '--warning THRESHOLD',
default: ''
def aws_config
{ access_key_id: config[:aws_access_key],
secret_access_key: config[:aws_secret_access_key],
region: config[:aws_region] }
end
def run
client = Aws::CloudWatch::Client.new aws_config
options = { alarm_names: [config[:name]] }
data = client.describe_alarms(options)
if data.metric_alarms.empty?
unknown 'Unable to find alarm'
end
message = "Alarm State: #{data.metric_alarms[0].state_value}"
if config[:critical].upcase.split(',').include? data.metric_alarms[0].state_value
critical message
elsif config[:warning].upcase.split(',').include? data.metric_alarms[0].state_value
warning message
end
ok message
rescue StandardError => e
puts "Error: exception: #{e}"
critical
end
end