sensu-plugins-aws 2.0.1 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG.md +21 -0
- data/README.md +6 -0
- data/bin/check-beanstalk-elb-metric.rb +123 -0
- data/bin/check-certificate-expiry.rb +124 -0
- data/bin/check-cloudwatch-metric.rb +117 -0
- data/bin/check-elb-health-sdk.rb +16 -3
- data/bin/check-elb-nodes.rb +4 -4
- data/bin/check-rds-events.rb +3 -2
- data/bin/check-rds.rb +13 -8
- data/bin/check-ses-limit.rb +20 -27
- data/bin/handler-ec2_node.rb +51 -12
- data/bin/handler-sns.rb +14 -1
- data/bin/metrics-elasticache.rb +3 -2
- data/bin/metrics-elb-full.rb +1 -4
- data/lib/sensu-plugins-aws/cloudwatch-common.rb +62 -0
- data/lib/sensu-plugins-aws/version.rb +2 -2
- metadata +25 -3
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2efbcaa411b6ef7da6f0c0217d3949b8a94ecce0
|
4
|
+
data.tar.gz: 908abecb23899de8f95741c7fbc515031ec9d149
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9735551c5d5a0117dcfab9709ddf7a572cb0ebef73bb079bf0f1e450c81d805dd744a4dbb3454ba51b21e6f7b24d8dc5172452b4ee67b49deb343218c4966ba0
|
7
|
+
data.tar.gz: 69fe7444c11198923d7d4ec4f63f03ba3109997eccc62c0a8ed132183a8d8badaac129864cf83f7c973bb59e92409f786a5de754c1036aafdd6b0a5ed63a1493
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,27 @@ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachang
|
|
5
5
|
|
6
6
|
## Unreleased
|
7
7
|
|
8
|
+
## [2.1.0] - 2016-01-15
|
9
|
+
### Added
|
10
|
+
- check-elb-health-sdk.rb: add option for warning instead of critical when unhealthy instances are found
|
11
|
+
- check-rds.rb: add M4 instances
|
12
|
+
- handler-sns.rb: add option to use a template to render body mail
|
13
|
+
- check-rds-events.rb: add RDS event message to output
|
14
|
+
- Added check-cloudwatch-metric that checks the values of cloudwatch metrics
|
15
|
+
- Added check-beanstalk-elb-metric that checks an ELB used in a Beanstalk environment
|
16
|
+
- Added check-certificate-expiry that checks the expiration date of certificates loaded into IAM
|
17
|
+
- Added test cases for check-certificate-expiry.rb
|
18
|
+
|
19
|
+
### Changed
|
20
|
+
- handler-ec2_node.rb: Update to new API event naming and simplifying ec2_node_should_be_deleted method and fixing match that will work with any user state defined, also improved docs
|
21
|
+
- metrics-elb-full.rb: flush hash in-between iterations
|
22
|
+
- check-ses-limit.rb: move to AWS-SDK v2, use common module, return unknown on empty responses
|
23
|
+
|
24
|
+
### Fixed
|
25
|
+
- metrics-memcached.rb: Fixed default scheme
|
26
|
+
- Fix typo in cloudwatch comparison check
|
27
|
+
|
28
|
+
## [2.0.1] - 2015-11-03
|
8
29
|
### Changed
|
9
30
|
- pinned all dependencies
|
10
31
|
- set gemspec to require > `2.0.0`
|
data/README.md
CHANGED
@@ -11,6 +11,10 @@
|
|
11
11
|
|
12
12
|
**check-autoscaling-cpucredits.rb**
|
13
13
|
|
14
|
+
**check-beanstalk-elb-metric.rb**
|
15
|
+
|
16
|
+
**check-certificate-expiry.rb**
|
17
|
+
|
14
18
|
**check-cloudwatch-alarm**
|
15
19
|
|
16
20
|
**check-dynamodb-capacity.rb**
|
@@ -87,6 +91,8 @@
|
|
87
91
|
## Files
|
88
92
|
|
89
93
|
* /bin/check-autoscaling-cpucredits.rb
|
94
|
+
* /bin/check-beanstalk-elb-metric.rb
|
95
|
+
* /bin/check-certificate-expiry.rb
|
90
96
|
* /bin/check-cloudwatch-alarm.rb
|
91
97
|
* /bin/check-dynamodb-capacity.rb
|
92
98
|
* /bin/check-dynamodb-throttle.rb
|
@@ -0,0 +1,123 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-beanstalk-elb-metric
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# This plugin finds the desired ELB in a beanstalk environment and queries
|
7
|
+
# for the requested cloudwatch metric for that ELB
|
8
|
+
#
|
9
|
+
# OUTPUT:
|
10
|
+
# plain-text
|
11
|
+
#
|
12
|
+
# PLATFORMS:
|
13
|
+
# Linux
|
14
|
+
#
|
15
|
+
# DEPENDENCIES:
|
16
|
+
# gem: aws-sdk
|
17
|
+
# gem: sensu-plugin
|
18
|
+
#
|
19
|
+
# USAGE:
|
20
|
+
# ./check-beanstalk-elb-metric -e MyAppEnv -m Latency -c 100
|
21
|
+
#
|
22
|
+
# NOTES:
|
23
|
+
#
|
24
|
+
# LICENSE:
|
25
|
+
# Andrew Matheny
|
26
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
27
|
+
# for details.
|
28
|
+
#
|
29
|
+
|
30
|
+
require 'sensu-plugins-aws/cloudwatch-common'
|
31
|
+
require 'sensu-plugin/check/cli'
|
32
|
+
require 'aws-sdk'
|
33
|
+
|
34
|
+
class BeanstalkELBCheck < Sensu::Plugin::Check::CLI
|
35
|
+
option :environment,
|
36
|
+
description: 'Application environment name',
|
37
|
+
short: '-e ENVIRONMENT_NAME',
|
38
|
+
long: '--environment ENVIRONMENT_NAME',
|
39
|
+
required: true
|
40
|
+
|
41
|
+
option :elb_idx,
|
42
|
+
description: 'Index of ELB. Useful for multiple ELB environments',
|
43
|
+
short: '-i ELB_NUM',
|
44
|
+
long: '--elb-idx ELB_NUM',
|
45
|
+
default: 0,
|
46
|
+
proc: proc(&:to_i)
|
47
|
+
|
48
|
+
option :metric_name,
|
49
|
+
description: 'ELB CloudWatch Metric',
|
50
|
+
short: '-m METRIC_NAME',
|
51
|
+
long: '--metric METRIC_NAME',
|
52
|
+
required: true
|
53
|
+
|
54
|
+
option :period,
|
55
|
+
description: 'CloudWatch metric statistics period. Must be a multiple of 60',
|
56
|
+
short: '-p N',
|
57
|
+
long: '--period SECONDS',
|
58
|
+
default: 60,
|
59
|
+
proc: proc(&:to_i)
|
60
|
+
|
61
|
+
option :statistics,
|
62
|
+
short: '-s N',
|
63
|
+
long: '--statistics NAME',
|
64
|
+
default: 'Average',
|
65
|
+
description: 'CloudWatch statistics method'
|
66
|
+
|
67
|
+
option :unit,
|
68
|
+
short: '-u UNIT',
|
69
|
+
long: '--unit UNIT',
|
70
|
+
description: 'CloudWatch metric unit'
|
71
|
+
|
72
|
+
option :critical,
|
73
|
+
description: 'Trigger a critical when value is over VALUE',
|
74
|
+
short: '-c VALUE',
|
75
|
+
long: '--critical VALUE',
|
76
|
+
proc: proc(&:to_f),
|
77
|
+
required: true
|
78
|
+
|
79
|
+
option :warning,
|
80
|
+
description: 'Trigger a critical when value is over VALUE',
|
81
|
+
short: '-w VALUE',
|
82
|
+
long: '--warning VALUE',
|
83
|
+
proc: proc(&:to_f)
|
84
|
+
|
85
|
+
option :compare,
|
86
|
+
description: 'Comparision operator for threshold: equal, not, greater, less',
|
87
|
+
short: '-o OPERATION',
|
88
|
+
long: '--opertor OPERATION',
|
89
|
+
default: 'greater'
|
90
|
+
|
91
|
+
option :no_data_ok,
|
92
|
+
short: '-n',
|
93
|
+
long: '--allow-no-data',
|
94
|
+
description: 'Returns ok if no data is returned from the metric',
|
95
|
+
boolean: true,
|
96
|
+
default: false
|
97
|
+
|
98
|
+
include CloudwatchCommon
|
99
|
+
|
100
|
+
def metric_desc
|
101
|
+
@metric_desc ||= "BeanstalkELB/#{config[:environment]}/#{elb_name}/#{config[:metric_name]}"
|
102
|
+
end
|
103
|
+
|
104
|
+
def elb_name
|
105
|
+
@elb_name ||= Aws::ElasticBeanstalk::Client.new
|
106
|
+
.describe_environment_resources(environment_name: config[:environment])
|
107
|
+
.environment_resources
|
108
|
+
.load_balancers[config[:elb_idx]]
|
109
|
+
.name
|
110
|
+
end
|
111
|
+
|
112
|
+
def run
|
113
|
+
new_config = config.clone
|
114
|
+
new_config[:namespace] = 'AWS/ELB'
|
115
|
+
new_config[:dimensions] = [
|
116
|
+
{
|
117
|
+
name: 'LoadBalancerName',
|
118
|
+
value: elb_name
|
119
|
+
}
|
120
|
+
]
|
121
|
+
check new_config
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-certificate-expiry
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# Checks expiration date on certificate. If no certificate is passed it checks
|
7
|
+
# all certs in account. Will use default provider if no access key and secret are passed
|
8
|
+
#
|
9
|
+
# OUTPUT:
|
10
|
+
# plain-text
|
11
|
+
#
|
12
|
+
# PLATFORMS:
|
13
|
+
# Linux
|
14
|
+
#
|
15
|
+
# DEPENDENCIES:
|
16
|
+
# gem: aws-sdk
|
17
|
+
# gem: sensu-plugin
|
18
|
+
#
|
19
|
+
# USAGE:
|
20
|
+
# ./check-certificate-expiry.rb --server-certificate-name ${cert_name} --warning 45 --critical 30
|
21
|
+
#
|
22
|
+
# NOTES:
|
23
|
+
# Based heavily on Yohei Kawahara's check-ec2-network
|
24
|
+
#
|
25
|
+
# LICENSE:
|
26
|
+
# Zach Bintliff <zbintliff@gmail.com>
|
27
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
28
|
+
# for details.
|
29
|
+
#
|
30
|
+
|
31
|
+
require 'sensu-plugin/check/cli'
|
32
|
+
require 'aws-sdk'
|
33
|
+
|
34
|
+
class CheckCertificateExpiry < Sensu::Plugin::Check::CLI
|
35
|
+
option :aws_access_key,
|
36
|
+
short: '-a AWS_ACCESS_KEY',
|
37
|
+
long: '--aws-access-key AWS_ACCESS_KEY',
|
38
|
+
description: "AWS Access Key. Either set ENV['AWS_ACCESS_KEY'] or provide it as an option. Uses Default Credential if none are passed",
|
39
|
+
default: ENV['AWS_ACCESS_KEY']
|
40
|
+
|
41
|
+
option :aws_secret_access_key,
|
42
|
+
short: '-k AWS_SECRET_KEY',
|
43
|
+
long: '--aws-secret-access-key AWS_SECRET_KEY',
|
44
|
+
description: "AWS Secret Access Key. Either set ENV['AWS_SECRET_KEY'] or provide it as an option. Uses Default Credential if none are passed",
|
45
|
+
default: ENV['AWS_SECRET_KEY']
|
46
|
+
|
47
|
+
option :aws_region,
|
48
|
+
short: '-r AWS_REGION',
|
49
|
+
long: '--aws-region REGION',
|
50
|
+
description: 'AWS Region (defaults to us-east-1).',
|
51
|
+
default: 'us-east-1'
|
52
|
+
|
53
|
+
option :server_certificate_name,
|
54
|
+
short: '-n CERTIFICATE_NAME',
|
55
|
+
long: '--server-certificate-name CERTIFICATE_NAME',
|
56
|
+
description: 'Certificate to check. Checks all if not passed'
|
57
|
+
|
58
|
+
option :warning,
|
59
|
+
short: '-w N',
|
60
|
+
long: '--warning VALUE',
|
61
|
+
description: 'Issue a warning if the Cert will expire in under VALUE days'
|
62
|
+
|
63
|
+
option :critical,
|
64
|
+
short: '-c N',
|
65
|
+
long: '--critical VALUE',
|
66
|
+
description: 'Issue a critical if the Cert will expire in under VALUE days',
|
67
|
+
default: 0
|
68
|
+
|
69
|
+
def aws_config
|
70
|
+
{ access_key_id: config[:aws_access_key],
|
71
|
+
secret_access_key: config[:aws_secret_access_key],
|
72
|
+
region: config[:aws_region]
|
73
|
+
}
|
74
|
+
end
|
75
|
+
|
76
|
+
def aws_client(opts = {})
|
77
|
+
config = aws_config.merge(opts)
|
78
|
+
@aws_client ||= Aws::IAM::Client.new config
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_cert(cert_name)
|
82
|
+
aws_client.get_server_certificate(server_certificate_name: cert_name).server_certificate.server_certificate_metadata
|
83
|
+
end
|
84
|
+
|
85
|
+
def check_expiry(cert, reportstring, warnflag, critflag)
|
86
|
+
expiration = cert.expiration.gmtime
|
87
|
+
current_time = Time.now.gmtime
|
88
|
+
time_to_expiry = (expiration - current_time).to_i / (24 * 60 * 60) ## Seconds to days, integer division
|
89
|
+
|
90
|
+
if time_to_expiry <= config[:critical].to_i
|
91
|
+
critflag = true
|
92
|
+
if time_to_expiry < 1
|
93
|
+
reportstring += " #{cert.server_certificate_name} certificate is expired!"
|
94
|
+
else
|
95
|
+
reportstring += " #{cert.server_certificate_name} certificate expires in #{time_to_expiry} days;"
|
96
|
+
end
|
97
|
+
elsif time_to_expiry <= config[:warning].to_i
|
98
|
+
warnflag = true
|
99
|
+
reportstring += " #{cert.server_certificate_name} certificate expires in #{time_to_expiry} days;"
|
100
|
+
end
|
101
|
+
[reportstring, warnflag, critflag]
|
102
|
+
end
|
103
|
+
|
104
|
+
def run
|
105
|
+
warnflag = false
|
106
|
+
critflag = false
|
107
|
+
reportstring = ''
|
108
|
+
if config[:server_certificate_name].nil?
|
109
|
+
aws_client.list_server_certificates.server_certificate_metadata_list.each do |cert|
|
110
|
+
reportstring, warnflag, critflag = check_expiry(cert, reportstring, warnflag, critflag)
|
111
|
+
end
|
112
|
+
else
|
113
|
+
reportstring, warnflag, critflag = check_expiry(get_cert(config[:server_certificate_name]), reportstring, warnflag, critflag)
|
114
|
+
end
|
115
|
+
|
116
|
+
if critflag
|
117
|
+
critical reportstring
|
118
|
+
elsif warnflag
|
119
|
+
warning reportstring
|
120
|
+
else
|
121
|
+
ok 'All checked Certificates are ok'
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-cloudwatch-metric
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# This plugin retrieves the value of a cloudwatch metric and triggers
|
7
|
+
# alarms based on the thresholds specified
|
8
|
+
#
|
9
|
+
# OUTPUT:
|
10
|
+
# plain-text
|
11
|
+
#
|
12
|
+
# PLATFORMS:
|
13
|
+
# Linux
|
14
|
+
#
|
15
|
+
# DEPENDENCIES:
|
16
|
+
# gem: aws-sdk
|
17
|
+
# gem: sensu-plugin
|
18
|
+
#
|
19
|
+
# USAGE:
|
20
|
+
# ./check-cloudwatch-metric -n CPUUtilization -d InstanceId=i-12345678,AvailabilityZone=us-east-1a -c 90
|
21
|
+
#
|
22
|
+
# NOTES:
|
23
|
+
#
|
24
|
+
# LICENSE:
|
25
|
+
# Andrew Matheny
|
26
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
27
|
+
# for details.
|
28
|
+
#
|
29
|
+
|
30
|
+
require 'sensu-plugins-aws/cloudwatch-common'
|
31
|
+
require 'sensu-plugin/check/cli'
|
32
|
+
require 'aws-sdk'
|
33
|
+
|
34
|
+
class CloudWatchMetricCheck < Sensu::Plugin::Check::CLI
|
35
|
+
option :namespace,
|
36
|
+
description: 'CloudWatch namespace for metric',
|
37
|
+
short: '-n NAME',
|
38
|
+
long: '--namespace NAME',
|
39
|
+
default: 'AWS/EC2'
|
40
|
+
|
41
|
+
option :metric_name,
|
42
|
+
description: 'Metric name',
|
43
|
+
short: '-m NAME',
|
44
|
+
long: '--metric NAME',
|
45
|
+
required: true
|
46
|
+
|
47
|
+
option :dimensions,
|
48
|
+
description: 'Comma delimited list of DimName=Value',
|
49
|
+
short: '-d DIMENSIONS',
|
50
|
+
long: '--dimensions DIMENSIONS',
|
51
|
+
proc: proc { |d| CloudWatchMetricCheck.parse_dimensions d },
|
52
|
+
default: ''
|
53
|
+
|
54
|
+
option :period,
|
55
|
+
description: 'CloudWatch metric statistics period. Must be a multiple of 60',
|
56
|
+
short: '-p N',
|
57
|
+
long: '--period SECONDS',
|
58
|
+
default: 60,
|
59
|
+
proc: proc(&:to_i)
|
60
|
+
|
61
|
+
option :statistics,
|
62
|
+
short: '-s N',
|
63
|
+
long: '--statistics NAME',
|
64
|
+
default: 'Average',
|
65
|
+
description: 'CloudWatch statistics method'
|
66
|
+
|
67
|
+
option :unit,
|
68
|
+
short: '-u UNIT',
|
69
|
+
long: '--unit UNIT',
|
70
|
+
description: 'CloudWatch metric unit'
|
71
|
+
|
72
|
+
option :critical,
|
73
|
+
description: 'Trigger a critical when value is over VALUE',
|
74
|
+
short: '-c VALUE',
|
75
|
+
long: '--critical VALUE',
|
76
|
+
proc: proc(&:to_f),
|
77
|
+
required: true
|
78
|
+
|
79
|
+
option :warning,
|
80
|
+
description: 'Trigger a critical when value is over VALUE',
|
81
|
+
short: '-w VALUE',
|
82
|
+
long: '--warning VALUE',
|
83
|
+
proc: proc(&:to_f)
|
84
|
+
|
85
|
+
option :compare,
|
86
|
+
description: 'Comparision operator for threshold: equal, not, greater, less',
|
87
|
+
short: '-o OPERATION',
|
88
|
+
long: '--opertor OPERATION',
|
89
|
+
default: 'greater'
|
90
|
+
|
91
|
+
option :no_data_ok,
|
92
|
+
short: '-n',
|
93
|
+
long: '--allow-no-data',
|
94
|
+
description: 'Returns ok if no data is returned from the metric',
|
95
|
+
boolean: true,
|
96
|
+
default: false
|
97
|
+
|
98
|
+
include CloudwatchCommon
|
99
|
+
|
100
|
+
def self.parse_dimensions(dimension_string)
|
101
|
+
dimension_string.split(',')
|
102
|
+
.collect { |d| d.split '=' }
|
103
|
+
.collect { |a| { name: a[0], value: a[1] } }
|
104
|
+
end
|
105
|
+
|
106
|
+
def dimension_string
|
107
|
+
config[:dimensions].map { |d| "#{d[:name]}=#{d[:value]}" }.join('&')
|
108
|
+
end
|
109
|
+
|
110
|
+
def metric_desc
|
111
|
+
"#{config[:namespace]}-#{config[:metric_name]}(#{dimension_string})"
|
112
|
+
end
|
113
|
+
|
114
|
+
def run
|
115
|
+
check config
|
116
|
+
end
|
117
|
+
end
|
data/bin/check-elb-health-sdk.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
3
|
# check-elb-health-sdk
|
4
|
-
# Last Update: 1/22/2015 by bkett
|
5
|
-
# ===
|
6
4
|
#
|
7
5
|
# DESCRIPTION:
|
8
6
|
# This plugin checks the health of an Amazon Elastic Load Balancer or all ELBs in a given region.
|
@@ -17,6 +15,11 @@
|
|
17
15
|
# gem: aws-sdk-v1
|
18
16
|
# gem: sensu-plugin
|
19
17
|
#
|
18
|
+
# USAGE:
|
19
|
+
# check-elb-health-sdk.rb -r region
|
20
|
+
# check-elb-health-sdk.rb -r region -n my-elb
|
21
|
+
# check-elb-health-sdk.rb -r region -n my-elb -i instance1,instance2
|
22
|
+
#
|
20
23
|
# Copyright (c) 2015, Benjamin Kett <bkett@umn.edu>
|
21
24
|
#
|
22
25
|
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
@@ -63,6 +66,12 @@ class ELBHealth < Sensu::Plugin::Check::CLI
|
|
63
66
|
boolean: true,
|
64
67
|
default: false
|
65
68
|
|
69
|
+
option :warn_only,
|
70
|
+
short: '-w',
|
71
|
+
long: '--warn-only',
|
72
|
+
description: 'Warn instead of critical when unhealthy instances are found',
|
73
|
+
default: false
|
74
|
+
|
66
75
|
def aws_config
|
67
76
|
{ access_key_id: config[:aws_access_key],
|
68
77
|
secret_access_key: config[:aws_secret_access_key],
|
@@ -113,7 +122,11 @@ class ELBHealth < Sensu::Plugin::Check::CLI
|
|
113
122
|
end
|
114
123
|
end
|
115
124
|
if critical
|
116
|
-
|
125
|
+
if config[:warn_only]
|
126
|
+
warning @message
|
127
|
+
else
|
128
|
+
critical @message
|
129
|
+
end
|
117
130
|
else
|
118
131
|
ok @message
|
119
132
|
end
|
data/bin/check-elb-nodes.rb
CHANGED
@@ -17,11 +17,11 @@
|
|
17
17
|
# gem: sensu-plugin
|
18
18
|
#
|
19
19
|
# USAGE:
|
20
|
-
# Warning if
|
21
|
-
# check-elb-
|
20
|
+
# Warning if the load balancer has 3 or fewer healthy nodes and critical if 2 or fewer
|
21
|
+
# check-elb-nodes --warn 3 --crit 2
|
22
22
|
#
|
23
|
-
#
|
24
|
-
# check-elb-
|
23
|
+
# Warning if the load balancer has 50% or less healthy nodes and critical if 25% or less
|
24
|
+
# check-elb-nodes --warn_perc 50 --crit_perc 25
|
25
25
|
#
|
26
26
|
# NOTES:
|
27
27
|
#
|
data/bin/check-rds-events.rb
CHANGED
@@ -64,7 +64,7 @@ class CheckRDSEvents < Sensu::Plugin::Check::CLI
|
|
64
64
|
if clusters.empty?
|
65
65
|
ok
|
66
66
|
else
|
67
|
-
critical("Clusters w/ critical events: #{clusters.join(',')}")
|
67
|
+
critical("Clusters w/ critical events: #{clusters.join(', ')}")
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
@@ -82,7 +82,8 @@ class CheckRDSEvents < Sensu::Plugin::Check::CLI
|
|
82
82
|
next if events_record[:events].empty?
|
83
83
|
|
84
84
|
# if the last event is a start maint event then the cluster is still in maint
|
85
|
-
|
85
|
+
cluster_name_long = "#{cluster_name} (#{aws_config[:region]}) #{events_record[:events][-1][:message]}"
|
86
|
+
maint_clusters.push(cluster_name_long) if events_record[:events][-1][:message] =~ /has started|is being|off-line|shutdown/
|
86
87
|
end
|
87
88
|
rescue => e
|
88
89
|
unknown "An error occurred processing AWS RDS API: #{e.message}"
|
data/bin/check-rds.rb
CHANGED
@@ -172,24 +172,29 @@ class CheckRDS < Sensu::Plugin::Check::CLI
|
|
172
172
|
|
173
173
|
def memory_total_bytes(instance_class)
|
174
174
|
memory_total_gigabytes = {
|
175
|
-
'db.
|
175
|
+
'db.cr1.8xlarge' => 244.0,
|
176
176
|
'db.m1.small' => 1.7,
|
177
|
+
'db.m1.medium' => 3.75,
|
178
|
+
'db.m1.large' => 7.5,
|
179
|
+
'db.m1.xlarge' => 15.0,
|
180
|
+
'db.m2.xlarge' => 17.1,
|
181
|
+
'db.m2.2xlarge' => 34.2,
|
182
|
+
'db.m2.4xlarge' => 68.4,
|
177
183
|
'db.m3.medium' => 3.75,
|
178
184
|
'db.m3.large' => 7.5,
|
179
185
|
'db.m3.xlarge' => 15.0,
|
180
186
|
'db.m3.2xlarge' => 30.0,
|
187
|
+
'db.m4.large' => 8.0,
|
188
|
+
'db.m4.xlarge' => 16.0,
|
189
|
+
'db.m4.2xlarge' => 32.0,
|
190
|
+
'db.m4.4xlarge' => 64.0,
|
191
|
+
'db.m4.10xlarge' => 160.0,
|
181
192
|
'db.r3.large' => 15.0,
|
182
193
|
'db.r3.xlarge' => 30.5,
|
183
194
|
'db.r3.2xlarge' => 61.0,
|
184
195
|
'db.r3.4xlarge' => 122.0,
|
185
196
|
'db.r3.8xlarge' => 244.0,
|
186
|
-
'db.
|
187
|
-
'db.m2.2xlarge' => 34.2,
|
188
|
-
'db.m2.4xlarge' => 68.4,
|
189
|
-
'db.cr1.8xlarge' => 244.0,
|
190
|
-
'db.m1.medium' => 3.75,
|
191
|
-
'db.m1.large' => 7.5,
|
192
|
-
'db.m1.xlarge' => 15.0,
|
197
|
+
'db.t1.micro' => 0.615,
|
193
198
|
'db.t2.micro' => 1,
|
194
199
|
'db.t2.small' => 2,
|
195
200
|
'db.t2.medium' => 4,
|
data/bin/check-ses-limit.rb
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
# DEPENDENCIES:
|
17
17
|
# gem: aws-sdk
|
18
18
|
# gem: sensu-plugin
|
19
|
+
# gem: sensu-plugins-aws
|
19
20
|
#
|
20
21
|
# USAGE:
|
21
22
|
# #YELLOW
|
@@ -29,20 +30,20 @@
|
|
29
30
|
#
|
30
31
|
|
31
32
|
require 'sensu-plugin/check/cli'
|
32
|
-
require 'aws
|
33
|
+
require 'sensu-plugins-aws'
|
34
|
+
require 'aws-sdk'
|
33
35
|
|
34
36
|
class CheckSESLimit < Sensu::Plugin::Check::CLI
|
37
|
+
include Common
|
35
38
|
option :aws_access_key,
|
36
39
|
short: '-a AWS_ACCESS_KEY',
|
37
40
|
long: '--aws-access-key AWS_ACCESS_KEY',
|
38
|
-
description:
|
39
|
-
default: ENV['AWS_ACCESS_KEY']
|
41
|
+
description: 'AWS Access Key ID.'
|
40
42
|
|
41
43
|
option :aws_secret_access_key,
|
42
44
|
short: '-k AWS_SECRET_KEY',
|
43
45
|
long: '--aws-secret-access-key AWS_SECRET_KEY',
|
44
|
-
description:
|
45
|
-
default: ENV['AWS_SECRET_KEY']
|
46
|
+
description: 'AWS Secret Access Key.'
|
46
47
|
|
47
48
|
option :aws_region,
|
48
49
|
short: '-r AWS_REGION',
|
@@ -64,33 +65,25 @@ class CheckSESLimit < Sensu::Plugin::Check::CLI
|
|
64
65
|
default: 90,
|
65
66
|
proc: proc(&:to_i)
|
66
67
|
|
67
|
-
def aws_config
|
68
|
-
{ access_key_id: config[:aws_access_key],
|
69
|
-
secret_access_key: config[:aws_secret_access_key],
|
70
|
-
region: config[:aws_region]
|
71
|
-
}
|
72
|
-
end
|
73
|
-
|
74
68
|
def run
|
75
69
|
begin
|
76
|
-
ses =
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
critical "An issue occured while communicating with the AWS SES API: #{e.message}"
|
70
|
+
ses = Aws::SES::Client.new
|
71
|
+
response = ses.get_send_quota
|
72
|
+
rescue => e
|
73
|
+
unknown "An issue occured while communicating with the AWS SES API: #{e.message}"
|
81
74
|
end
|
82
75
|
|
83
|
-
|
84
|
-
|
85
|
-
|
76
|
+
unknown 'Empty response from AWS SES API' if response.empty? # Can this happen?
|
77
|
+
|
78
|
+
percent = (response.sent_last_24_hours.to_i / response.max_24_hour_send.to_i) * 100
|
79
|
+
message = "SES sending limit is at #{percent}%"
|
86
80
|
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
end
|
81
|
+
if config[:crit_percent] > 0 && config[:crit_percent] <= percent
|
82
|
+
critical message
|
83
|
+
elsif config[:warn_percent] > 0 && config[:warn_percent] <= percent
|
84
|
+
warning message
|
85
|
+
else
|
86
|
+
ok message
|
94
87
|
end
|
95
88
|
end
|
96
89
|
end
|
data/bin/handler-ec2_node.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
3
|
# CHANGELOG:
|
4
|
+
# * 0.7.0:
|
5
|
+
# - Update to new API event naming and simplifying ec2_node_should_be_deleted method and fixing
|
6
|
+
# match that will work with any user state defined.
|
4
7
|
# * 0.6.0:
|
5
8
|
# - Fixed ec2_node_should_be_deleted to account for an empty insances array
|
6
9
|
# * 0.5.0:
|
@@ -32,6 +35,22 @@
|
|
32
35
|
# to match any state reason `.*` Regardless, eventually a client will be
|
33
36
|
# deleted once AWS stops responding that the instance id exists.
|
34
37
|
#
|
38
|
+
# You could specify a ec2_states.json config file for the states like so:
|
39
|
+
#
|
40
|
+
# {
|
41
|
+
# "ec2_node": {
|
42
|
+
# "ec2_states": [
|
43
|
+
# "terminated",
|
44
|
+
# "stopping",
|
45
|
+
# "shutting-down",
|
46
|
+
# "stopped"
|
47
|
+
# ]
|
48
|
+
# }
|
49
|
+
# }
|
50
|
+
#
|
51
|
+
# And add that to your /etc/sensu/conf.d directory.
|
52
|
+
# If you do not specify any states the handler would not work
|
53
|
+
#
|
35
54
|
# NOTE: The implementation for correlating Sensu clients to EC2 instances may
|
36
55
|
# need to be modified to fit your organization. The current implementation
|
37
56
|
# assumes that Sensu clients' names are the same as their instance IDs in EC2.
|
@@ -81,7 +100,7 @@
|
|
81
100
|
# "name": "keepalive",
|
82
101
|
# "status": 2
|
83
102
|
# },
|
84
|
-
# "
|
103
|
+
# "occurrences": "eval: value > 2"
|
85
104
|
# }
|
86
105
|
# }
|
87
106
|
# },
|
@@ -114,7 +133,10 @@ class Ec2Node < Sensu::Handler
|
|
114
133
|
|
115
134
|
def filter; end
|
116
135
|
|
136
|
+
# Method handle
|
117
137
|
def handle
|
138
|
+
# Call ec2_node_should_be_deleted method and check for instance state and if valid delete from the sensu API otherwise
|
139
|
+
# instance is in invalid state
|
118
140
|
if ec2_node_should_be_deleted?
|
119
141
|
delete_sensu_client!
|
120
142
|
else
|
@@ -122,23 +144,46 @@ class Ec2Node < Sensu::Handler
|
|
122
144
|
end
|
123
145
|
end
|
124
146
|
|
147
|
+
# Method to delete client from sensu API
|
125
148
|
def delete_sensu_client!
|
126
149
|
response = api_request(:DELETE, '/clients/' + @event['client']['name']).code
|
127
150
|
deletion_status(response)
|
128
151
|
end
|
129
152
|
|
153
|
+
# Method to check if there is any insance and if instance is in a valid state that could be deleted
|
130
154
|
def ec2_node_should_be_deleted?
|
155
|
+
# Defining region for aws SDK object
|
131
156
|
ec2 = Aws::EC2::Client.new(region: region)
|
132
|
-
|
157
|
+
# Check if attributes or json objects are not defined
|
158
|
+
if @event['client']['ec2_states'].nil? && settings['ec2_node']['ec2_states'].nil?
|
159
|
+
puts 'ec2_states is not define, please add the attributes or create a json config file with valid states keys'
|
160
|
+
else
|
161
|
+
# Asigning valid states
|
162
|
+
instance_states = @event['client']['ec2_states'] || settings['ec2_node']['ec2_states'] || ['shutting-down', 'terminated', 'stopping', 'stopped']
|
163
|
+
end
|
164
|
+
|
133
165
|
begin
|
166
|
+
# Finding the instance
|
134
167
|
instances = ec2.describe_instances(instance_ids: [@event['client']['name']]).reservations[0]
|
168
|
+
# If instance is empty/nil instance id is not valid so client can be deleted
|
135
169
|
if instances.nil? || instances.empty?
|
136
170
|
true
|
137
171
|
else
|
138
|
-
instance
|
139
|
-
|
140
|
-
|
141
|
-
|
172
|
+
# Checking for instance state and reason, and if matches any of the user defined or default reasons then
|
173
|
+
# method returns True
|
174
|
+
|
175
|
+
# Returns Instance object
|
176
|
+
instance_obj = instances.instances[0]
|
177
|
+
# Returns instance state reason in AWS i.e: "Client.UserInitiatedShutdown"
|
178
|
+
instance_state_reason = instance_obj.state_reason.code
|
179
|
+
# Returns the instance state i.e: "terminated"
|
180
|
+
instance_state = instance_obj.state.name
|
181
|
+
# Defining the default reasons why an instance could be deleted or not
|
182
|
+
instance_default_reasons = %w(Client.UserInitiatedShutdown Server.SpotInstanceTermination Client.InstanceInitiatedShutdown)
|
183
|
+
# If user specified a reason use those otherwise use default
|
184
|
+
instance_reasons = @event['client']['ec2_state_reasons'] || settings['ec2_node']['ec2_state_reasons'] || instance_default_reasons
|
185
|
+
# Return true is instance state and instance reason is valid
|
186
|
+
instance_states.include?(instance_state) && instance_reasons.include?(instance_state_reason)
|
142
187
|
end
|
143
188
|
rescue Aws::EC2::Errors::InvalidInstanceIDNotFound
|
144
189
|
true
|
@@ -160,12 +205,6 @@ class Ec2Node < Sensu::Handler
|
|
160
205
|
end
|
161
206
|
end
|
162
207
|
|
163
|
-
def state_reasons
|
164
|
-
default_reasons = %w('UserInitiatedShutdown', 'SpotInstanceTermination', 'InstanceInitiatedShutdown')
|
165
|
-
reasons = @event['client']['ec2_state_reasons'] || settings['ec2_node']['ec2_state_reasons'] || default_reasons
|
166
|
-
@state_reasons ||= reasons.each { |reason| Regexp.new(reason) }
|
167
|
-
end
|
168
|
-
|
169
208
|
def deletion_status(code)
|
170
209
|
case code
|
171
210
|
when '202'
|
data/bin/handler-sns.rb
CHANGED
@@ -15,6 +15,7 @@
|
|
15
15
|
|
16
16
|
require 'sensu-handler'
|
17
17
|
require 'aws-sdk-v1'
|
18
|
+
require 'erubis'
|
18
19
|
|
19
20
|
class SnsNotifier < Sensu::Handler
|
20
21
|
def topic_arn
|
@@ -43,7 +44,19 @@ class SnsNotifier < Sensu::Handler
|
|
43
44
|
end
|
44
45
|
|
45
46
|
def message
|
46
|
-
|
47
|
+
if template_file && File.readable?(template_file)
|
48
|
+
template = File.read(template_file)
|
49
|
+
else
|
50
|
+
template = <<-BODY.gsub(/^\s+/, '')
|
51
|
+
<%= @event['check']['notification'] || @event['check']['output'] %>
|
52
|
+
BODY
|
53
|
+
end
|
54
|
+
eruby = Erubis::Eruby.new(template)
|
55
|
+
eruby.result(binding)
|
56
|
+
end
|
57
|
+
|
58
|
+
def template_file
|
59
|
+
settings['sns']['template_file']
|
47
60
|
end
|
48
61
|
|
49
62
|
def handle
|
data/bin/metrics-elasticache.rb
CHANGED
@@ -16,7 +16,8 @@
|
|
16
16
|
# gem: sensu-plugin
|
17
17
|
#
|
18
18
|
# USAGE:
|
19
|
-
#
|
19
|
+
# elasticache-metrics.rb -n rediscluster -c redis -a key -k secret
|
20
|
+
# elasticache-metrics.rb -n memcachedcluster -c memcached -a key -k secret
|
20
21
|
#
|
21
22
|
# NOTES:
|
22
23
|
# Redis: http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CacheMetrics.Redis.html
|
@@ -92,7 +93,7 @@ class ElastiCacheMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
92
93
|
|
93
94
|
def run
|
94
95
|
if config[:scheme] == ''
|
95
|
-
graphitepath = "
|
96
|
+
graphitepath = "elasticache.#{config[:cacheclusterid]}"
|
96
97
|
else
|
97
98
|
graphitepath = config[:scheme]
|
98
99
|
end
|
data/bin/metrics-elb-full.rb
CHANGED
@@ -116,16 +116,13 @@ class ELBMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
116
116
|
'end_time' => et.iso8601,
|
117
117
|
'period' => 60
|
118
118
|
}
|
119
|
-
|
120
|
-
result = {}
|
121
|
-
|
122
119
|
config[:elbname].split(',').each do |elbname|
|
123
120
|
if config[:scheme] == ''
|
124
121
|
graphitepath = "#{elbname}"
|
125
122
|
else
|
126
123
|
graphitepath = "#{config[:scheme]}.#{elbname}"
|
127
124
|
end
|
128
|
-
|
125
|
+
result = {}
|
129
126
|
statistic_type.each do |key, value|
|
130
127
|
options['metric_name'] = key
|
131
128
|
options['dimensions'][0]['value'] = elbname
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'aws-sdk'
|
2
|
+
|
3
|
+
module CloudwatchCommon
|
4
|
+
def client
|
5
|
+
Aws::CloudWatch::Client.new
|
6
|
+
end
|
7
|
+
|
8
|
+
def read_value(resp, stats)
|
9
|
+
resp.datapoints.first.send(stats.downcase)
|
10
|
+
end
|
11
|
+
|
12
|
+
def resp_has_no_data(resp, stats)
|
13
|
+
resp.datapoints.nil? || resp.datapoints.length == 0 || resp.datapoints.first.nil? || read_value(resp, stats).nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def compare(value, threshold, compare_method)
|
17
|
+
if compare_method == 'greater'
|
18
|
+
return value > threshold
|
19
|
+
elsif compare_method == 'less'
|
20
|
+
return value < threshold
|
21
|
+
elsif compare_method == 'not'
|
22
|
+
return value != threshold
|
23
|
+
else
|
24
|
+
return value == threshold
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def metrics_request(config)
|
29
|
+
{
|
30
|
+
namespace: config[:namespace],
|
31
|
+
metric_name: config[:metric_name],
|
32
|
+
dimensions: config[:dimensions],
|
33
|
+
start_time: Time.now - config[:period] * 10,
|
34
|
+
end_time: Time.now,
|
35
|
+
period: config[:period],
|
36
|
+
statistics: [config[:statistics]],
|
37
|
+
unit: config[:unit]
|
38
|
+
}
|
39
|
+
end
|
40
|
+
|
41
|
+
def check(config)
|
42
|
+
resp = client.get_metric_statistics(metrics_request(config))
|
43
|
+
|
44
|
+
no_data = resp_has_no_data(resp, config[:statistics])
|
45
|
+
if no_data && config[:no_data_ok]
|
46
|
+
ok "#{metric_desc} returned no data but that's ok"
|
47
|
+
elsif no_data && !config[:no_data_ok]
|
48
|
+
unknown "#{metric_desc} could not be retrieved"
|
49
|
+
end
|
50
|
+
|
51
|
+
value = read_value(resp, config[:statistics])
|
52
|
+
base_msg = "#{metric_desc} is #{value}: comparison=#{config[:compare]}"
|
53
|
+
|
54
|
+
if compare value, config[:critical], config[:compare]
|
55
|
+
critical "#{base_msg} threshold=#{config[:critical]}"
|
56
|
+
elsif config[:warning] && compare(value, config[:warning], config[:compare])
|
57
|
+
warning "#{base_msg} threshold=#{config[:warning]}"
|
58
|
+
else
|
59
|
+
ok "#{base_msg}, will alarm at #{!config[:warning].nil? ? config[:warning] : config[:critical]}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu-plugins-aws
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0
|
4
|
+
version: 2.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sensu-Plugins and contributors
|
@@ -30,7 +30,7 @@ cert_chain:
|
|
30
30
|
8sHuVruarogxxKPBzlL2is4EUb6oN/RdpGx2l4254+nyR+abg//Ed27Ym0PkB4lk
|
31
31
|
HP0m8WSjZmFr109pE/sVsM5jtOCvogyujQOjNVGN4gz1wwPr
|
32
32
|
-----END CERTIFICATE-----
|
33
|
-
date:
|
33
|
+
date: 2016-01-16 00:00:00.000000000 Z
|
34
34
|
dependencies:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: aws-sdk
|
@@ -102,6 +102,20 @@ dependencies:
|
|
102
102
|
- - '='
|
103
103
|
- !ruby/object:Gem::Version
|
104
104
|
version: 1.2.0
|
105
|
+
- !ruby/object:Gem::Dependency
|
106
|
+
name: erubis
|
107
|
+
requirement: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: 2.7.0
|
112
|
+
type: :runtime
|
113
|
+
prerelease: false
|
114
|
+
version_requirements: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - '='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: 2.7.0
|
105
119
|
- !ruby/object:Gem::Dependency
|
106
120
|
name: codeclimate-test-reporter
|
107
121
|
requirement: !ruby/object:Gem::Requirement
|
@@ -233,7 +247,7 @@ description: |-
|
|
233
247
|
for monitoring and metrics collection, including:
|
234
248
|
health and metrics for various AWS services, such
|
235
249
|
as EC2, RDS, ELB, and more, as well as handlers
|
236
|
-
for EC2, SES, and SNS
|
250
|
+
for EC2, SES, and SNS.
|
237
251
|
email: "<sensu-users@googlegroups.com>"
|
238
252
|
executables:
|
239
253
|
- metrics-sqs.rb
|
@@ -246,6 +260,7 @@ executables:
|
|
246
260
|
- handler-sns.rb
|
247
261
|
- handler-ses.rb
|
248
262
|
- handler-ec2_node.rb
|
263
|
+
- check_vpc_vpn.py
|
249
264
|
- check-vpc-vpn.rb
|
250
265
|
- check-vpc-nameservers.rb
|
251
266
|
- check-sqs-messages.rb
|
@@ -270,7 +285,10 @@ executables:
|
|
270
285
|
- check-ebs-snapshots.rb
|
271
286
|
- check-dynamodb-throttle.rb
|
272
287
|
- check-dynamodb-capacity.rb
|
288
|
+
- check-cloudwatch-metric.rb
|
273
289
|
- check-cloudwatch-alarm.rb
|
290
|
+
- check-certificate-expiry.rb
|
291
|
+
- check-beanstalk-elb-metric.rb
|
274
292
|
- check-autoscaling-cpucredits.rb
|
275
293
|
extensions: []
|
276
294
|
extra_rdoc_files: []
|
@@ -279,7 +297,10 @@ files:
|
|
279
297
|
- LICENSE
|
280
298
|
- README.md
|
281
299
|
- bin/check-autoscaling-cpucredits.rb
|
300
|
+
- bin/check-beanstalk-elb-metric.rb
|
301
|
+
- bin/check-certificate-expiry.rb
|
282
302
|
- bin/check-cloudwatch-alarm.rb
|
303
|
+
- bin/check-cloudwatch-metric.rb
|
283
304
|
- bin/check-dynamodb-capacity.rb
|
284
305
|
- bin/check-dynamodb-throttle.rb
|
285
306
|
- bin/check-ebs-snapshots.rb
|
@@ -316,6 +337,7 @@ files:
|
|
316
337
|
- bin/metrics-elb.rb
|
317
338
|
- bin/metrics-sqs.rb
|
318
339
|
- lib/sensu-plugins-aws.rb
|
340
|
+
- lib/sensu-plugins-aws/cloudwatch-common.rb
|
319
341
|
- lib/sensu-plugins-aws/common.rb
|
320
342
|
- lib/sensu-plugins-aws/filter.rb
|
321
343
|
- lib/sensu-plugins-aws/version.rb
|
metadata.gz.sig
CHANGED
Binary file
|