sensu-plugins-aws 2.0.1 → 2.1.0
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 +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
|