sensu-plugins-aws 4.0.0 → 4.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
- data/CHANGELOG.md +16 -1
- data/README.md +6 -0
- data/bin/check-cloudwatch-composite-metric.rb +132 -0
- data/bin/check-sns-subscriptions.rb +2 -2
- data/bin/check-sqs-messages.rb +23 -10
- data/bin/metrics-elasticache.rb +1 -1
- data/lib/sensu-plugins-aws/cloudwatch-common.rb +44 -1
- data/lib/sensu-plugins-aws/version.rb +1 -1
- metadata +4 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ffd1f6a42abd1a5201a34df72564a7774a7f3c29
|
4
|
+
data.tar.gz: 38cf5c5cc6c757dcef503d825c50938ef02f2158
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c56ed6c76d340f357509aae2676c0b0a1aac1ebff884aa71d50b3332207887c70102255885ea4359a320fbd7dc8bec463e0002baa23aaa35e6894e93a2176d72
|
7
|
+
data.tar.gz: ca41201cc25e0ba58658c5bdedf4717c6d8150fdcd5fd8f0d790ce4f8f4dacfe3f7fd6eea3cbb8996347cdb754be8104ae95ab6842c5212af3f2ec5e25bf10f4
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,20 @@ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachang
|
|
5
5
|
|
6
6
|
## [Unreleased]
|
7
7
|
|
8
|
+
## [4.1.0] - 2017-05-01
|
9
|
+
### Added
|
10
|
+
- check-cloudwatch-composite-metric.rb: Allow calculation of percentage for cloudwatch metrics by composing two metrics (@cornelf) (numerator_metric/denominator_metric * 100) as a percentage. This is useful to skip pushing such metrics to graphite in order to get the percentage metric computed.
|
11
|
+
- check-cloudwatch-composite-metric.rb: protect against zero division errors (@cornelf)
|
12
|
+
- check-sqs-messages.rb now supports specifying multiple queues wihtout a prefix (@majormoses)
|
13
|
+
- check-asg-instances-created.rb is a new check that allows looking at the number od instances created in the last hour (@phoppe93)
|
14
|
+
|
15
|
+
### Changed
|
16
|
+
- check-sns-subscriptions.rb improved error messages (@obazoud)
|
17
|
+
|
18
|
+
### Fixed
|
19
|
+
- lib/sensu-plugins-aws/cloudwatch-common.rb use the most recent datapoint (@mivok)
|
20
|
+
|
21
|
+
|
8
22
|
## [4.0.0] - 2016-12-27
|
9
23
|
### Breaking Changes
|
10
24
|
- `check-sqs-messages.rb`, `check-vpc-vpn.rb`, and `metrics-elb.rb` were updated to aws-sdk v2 and no longer take `aws_access_key` and `aws_secret_access_key` options.
|
@@ -275,7 +289,8 @@ WARNING: This release contains major breaking changes that will impact all user
|
|
275
289
|
### Added
|
276
290
|
- initial release
|
277
291
|
|
278
|
-
[Unreleased]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/4.
|
292
|
+
[Unreleased]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/4.1.0...HEAD
|
293
|
+
[4.1.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/4.1.0...4.0.0
|
279
294
|
[4.0.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/3.2.1...4.0.0
|
280
295
|
[3.2.1]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/3.2.0...3.2.1
|
281
296
|
[3.2.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/3.1.0...3.2.0
|
data/README.md
CHANGED
@@ -20,6 +20,10 @@
|
|
20
20
|
|
21
21
|
**check-cloudwatch-alarm**
|
22
22
|
|
23
|
+
**check-cloudwatch-metric**
|
24
|
+
|
25
|
+
**check-cloudwatch-composite-metric**
|
26
|
+
|
23
27
|
**check-cloudfront-tag**
|
24
28
|
|
25
29
|
**check-configservice-rules**
|
@@ -153,6 +157,8 @@
|
|
153
157
|
* /bin/check-configservice-rules.rb
|
154
158
|
* /bin/check-cloudfront-tag.rb
|
155
159
|
* /bin/check-cloudwatch-alarm.rb
|
160
|
+
* /bin/check-cloudwatch-metric.rb
|
161
|
+
* /bin/check-cloudwatch-composite-metric.rb
|
156
162
|
* /bin/check-dynamodb-capacity.rb
|
157
163
|
* /bin/check-dynamodb-throttle.rb
|
158
164
|
* /bin/check-ebs-burst-limit.rb
|
@@ -0,0 +1,132 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# check-cloudwatch-composite-metric
|
4
|
+
#
|
5
|
+
# DESCRIPTION:
|
6
|
+
# This plugin retrieves a couple of values of two cloudwatch metrics,
|
7
|
+
# computes a percentage value based on the numerator metric and the denomicator metric
|
8
|
+
# and triggers alarms based on the thresholds specified.
|
9
|
+
# This plugin is an extension to the Andrew Matheny's check-cloudwatch-metric plugin
|
10
|
+
# and uses the CloudwatchCommon lib, extended as well.
|
11
|
+
#
|
12
|
+
# OUTPUT:
|
13
|
+
# plain-text
|
14
|
+
#
|
15
|
+
# PLATFORMS:
|
16
|
+
# Linux
|
17
|
+
#
|
18
|
+
# DEPENDENCIES:
|
19
|
+
# gem: aws-sdk
|
20
|
+
# gem: sensu-plugin
|
21
|
+
#
|
22
|
+
# USAGE:
|
23
|
+
# ./check-cloudwatch-composite-metric.rb --namespace AWS/ELB -N HTTPCode_Backend_4XX -D RequestCount --dimensions LoadBalancerName=test-elb --period 60 --statistics Maximum --operator equal --critical 0
|
24
|
+
#
|
25
|
+
# NOTES:
|
26
|
+
#
|
27
|
+
# LICENSE:
|
28
|
+
# Cornel Foltea
|
29
|
+
# Released under the same terms as Sensu (the MIT license); see LICENSE
|
30
|
+
# for details.
|
31
|
+
#
|
32
|
+
|
33
|
+
require 'sensu-plugins-aws'
|
34
|
+
require 'sensu-plugin/check/cli'
|
35
|
+
require 'aws-sdk'
|
36
|
+
|
37
|
+
class CloudWatchCompositeMetricCheck < Sensu::Plugin::Check::CLI
|
38
|
+
option :aws_region,
|
39
|
+
short: '-r AWS_REGION',
|
40
|
+
long: '--aws-region REGION',
|
41
|
+
description: 'AWS Region (defaults to us-east-1).',
|
42
|
+
default: 'us-east-1'
|
43
|
+
|
44
|
+
option :namespace,
|
45
|
+
description: 'CloudWatch namespace for metric',
|
46
|
+
short: '-n NAME',
|
47
|
+
long: '--namespace NAME',
|
48
|
+
default: 'AWS/EC2'
|
49
|
+
|
50
|
+
option :numerator_metric_name,
|
51
|
+
description: 'Numerator metric name',
|
52
|
+
short: '-N NAME',
|
53
|
+
long: '--numerator-metric NAME',
|
54
|
+
required: true
|
55
|
+
|
56
|
+
option :denominator_metric_name,
|
57
|
+
description: 'Denominator metric name',
|
58
|
+
short: '-D NAME',
|
59
|
+
long: '--denominator-metric NAME',
|
60
|
+
required: true
|
61
|
+
|
62
|
+
option :dimensions,
|
63
|
+
description: 'Comma delimited list of DimName=Value',
|
64
|
+
short: '-d DIMENSIONS',
|
65
|
+
long: '--dimensions DIMENSIONS',
|
66
|
+
proc: proc { |d| CloudWatchCompositeMetricCheck.parse_dimensions d },
|
67
|
+
default: ''
|
68
|
+
|
69
|
+
option :period,
|
70
|
+
description: 'CloudWatch metric statistics period. Must be a multiple of 60',
|
71
|
+
short: '-p N',
|
72
|
+
long: '--period SECONDS',
|
73
|
+
default: 60,
|
74
|
+
proc: proc(&:to_i)
|
75
|
+
|
76
|
+
option :statistics,
|
77
|
+
short: '-s N',
|
78
|
+
long: '--statistics NAME',
|
79
|
+
default: 'Average',
|
80
|
+
description: 'CloudWatch statistics method'
|
81
|
+
|
82
|
+
option :unit,
|
83
|
+
short: '-u UNIT',
|
84
|
+
long: '--unit UNIT',
|
85
|
+
description: 'CloudWatch metric unit'
|
86
|
+
|
87
|
+
option :critical,
|
88
|
+
description: 'Trigger a critical when value is over VALUE',
|
89
|
+
short: '-c VALUE',
|
90
|
+
long: '--critical VALUE',
|
91
|
+
proc: proc(&:to_f),
|
92
|
+
required: true
|
93
|
+
|
94
|
+
option :warning,
|
95
|
+
description: 'Trigger a critical when value is over VALUE',
|
96
|
+
short: '-w VALUE',
|
97
|
+
long: '--warning VALUE',
|
98
|
+
proc: proc(&:to_f)
|
99
|
+
|
100
|
+
option :compare,
|
101
|
+
description: 'Comparision operator for threshold: equal, not, greater, less',
|
102
|
+
short: '-o OPERATION',
|
103
|
+
long: '--operator OPERATION',
|
104
|
+
default: 'greater'
|
105
|
+
|
106
|
+
option :no_data_ok,
|
107
|
+
short: '-O',
|
108
|
+
long: '--allow-no-data',
|
109
|
+
description: 'Returns ok if no data is returned from the metric',
|
110
|
+
boolean: true,
|
111
|
+
default: false
|
112
|
+
|
113
|
+
include CloudwatchCommon
|
114
|
+
|
115
|
+
def self.parse_dimensions(dimension_string)
|
116
|
+
dimension_string.split(',')
|
117
|
+
.collect { |d| d.split '=' }
|
118
|
+
.collect { |a| { name: a[0], value: a[1] } }
|
119
|
+
end
|
120
|
+
|
121
|
+
def dimension_string
|
122
|
+
config[:dimensions].map { |d| "#{d[:name]}=#{d[:value]}" }.join('&')
|
123
|
+
end
|
124
|
+
|
125
|
+
def metric_desc
|
126
|
+
"#{config[:namespace]}-#{config[:numerator_metric_name]}/#{config[:denominator_metric_name]}(#{dimension_string})"
|
127
|
+
end
|
128
|
+
|
129
|
+
def run
|
130
|
+
composite_check config
|
131
|
+
end
|
132
|
+
end
|
@@ -44,9 +44,9 @@ class CheckSNSSubscriptions < Sensu::Plugin::Check::CLI
|
|
44
44
|
|
45
45
|
subscriptions = sns.list_subscriptions.subscriptions
|
46
46
|
|
47
|
-
pending_confirmations = subscriptions.select { |subscription| subscription.subscription_arn == 'PendingConfirmation' }
|
47
|
+
pending_confirmations = subscriptions.select { |subscription| subscription.subscription_arn == 'PendingConfirmation' }.map(&:topic_arn)
|
48
48
|
|
49
|
-
critical "#{pending_confirmations.size} pending confirmations" unless pending_confirmations.empty?
|
49
|
+
critical "#{pending_confirmations.size} pending confirmations (#{pending_confirmations})" unless pending_confirmations.empty?
|
50
50
|
ok
|
51
51
|
end
|
52
52
|
end
|
data/bin/check-sqs-messages.rb
CHANGED
@@ -46,7 +46,7 @@ class SQSMsgs < Sensu::Plugin::Check::CLI
|
|
46
46
|
option :queue,
|
47
47
|
short: '-q SQS_QUEUE',
|
48
48
|
long: '--queue SQS_QUEUE',
|
49
|
-
description: '
|
49
|
+
description: 'A comma seperated list of the SQS queue(s) you want to check the number of messages for',
|
50
50
|
default: ''
|
51
51
|
|
52
52
|
option :prefix,
|
@@ -99,20 +99,33 @@ class SQSMsgs < Sensu::Plugin::Check::CLI
|
|
99
99
|
Aws.config.update(aws_config)
|
100
100
|
sqs = Aws::SQS::Resource.new
|
101
101
|
|
102
|
-
if config[:prefix]
|
103
|
-
if config[:queue]
|
102
|
+
if config[:prefix].empty?
|
103
|
+
if config[:queue].empty?
|
104
104
|
critical 'Error, either QUEUE or PREFIX must be specified'
|
105
105
|
end
|
106
106
|
|
107
|
-
|
108
|
-
|
107
|
+
warnings = []
|
108
|
+
crits = []
|
109
|
+
passing = []
|
110
|
+
queues = config[:queue].split(',')
|
111
|
+
queues.each do |q|
|
112
|
+
url = sqs.get_queue_by_name(queue_name: q).url
|
113
|
+
messages = sqs.client.get_queue_attributes(queue_url: url, attribute_names: ['All']).attributes[config[:metric]].to_i
|
109
114
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
115
|
+
if (config[:crit_under] >= 0 && messages < config[:crit_under]) || (config[:crit_over] >= 0 && messages > config[:crit_over])
|
116
|
+
crits << "#{messages} message(s) in #{q}"
|
117
|
+
elsif (config[:warn_under] >= 0 && messages < config[:warn_under]) || (config[:warn_over] >= 0 && messages > config[:warn_over])
|
118
|
+
warnings << "#{messages} message(s) in #{q}"
|
119
|
+
else
|
120
|
+
passing << "#{messages} message(s) in #{q}"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
if crits.any?
|
124
|
+
critical crits.join(', ').to_s
|
125
|
+
elsif warnings.any?
|
126
|
+
warning warnings.join(', ').to_s
|
114
127
|
else
|
115
|
-
ok "
|
128
|
+
ok "all queue(s): #{queues} are OK"
|
116
129
|
end
|
117
130
|
else
|
118
131
|
warn = false
|
data/bin/metrics-elasticache.rb
CHANGED
@@ -100,7 +100,7 @@ class ElasticMetrics < Sensu::Plugin::Metric::CLI::Graphite
|
|
100
100
|
r = cloud_watch_metric(key, static, cache_cluster_id)
|
101
101
|
result['elasticache.' + cache_cluster_id + '.' + key] = r[:datapoints][0] unless r[:datapoints][0].nil?
|
102
102
|
end
|
103
|
-
return
|
103
|
+
return if result.nil?
|
104
104
|
result.each do |key, value|
|
105
105
|
output key.downcase.to_s, value.average, value[:timestamp].to_i
|
106
106
|
end
|
@@ -7,7 +7,7 @@ module CloudwatchCommon
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def read_value(resp, stats)
|
10
|
-
resp.datapoints.
|
10
|
+
resp.datapoints.sort_by(&:timestamp).last.send(stats.downcase)
|
11
11
|
end
|
12
12
|
|
13
13
|
def resp_has_no_data(resp, stats)
|
@@ -40,6 +40,49 @@ module CloudwatchCommon
|
|
40
40
|
}
|
41
41
|
end
|
42
42
|
|
43
|
+
def composite_metrics_request(config, metric, fixed_time_now = Time.now)
|
44
|
+
{
|
45
|
+
namespace: config[:namespace],
|
46
|
+
metric_name: config[metric],
|
47
|
+
dimensions: config[:dimensions],
|
48
|
+
start_time: fixed_time_now - config[:period] * 10,
|
49
|
+
end_time: fixed_time_now,
|
50
|
+
period: config[:period],
|
51
|
+
statistics: [config[:statistics]],
|
52
|
+
unit: config[:unit]
|
53
|
+
}
|
54
|
+
end
|
55
|
+
|
56
|
+
def composite_check(config)
|
57
|
+
fixed_time_now = Time.now
|
58
|
+
numerator_metric_resp = client.get_metric_statistics(composite_metrics_request(config, :numerator_metric_name, fixed_time_now))
|
59
|
+
denominator_metric_resp = client.get_metric_statistics(composite_metrics_request(config, :denominator_metric_name, fixed_time_now))
|
60
|
+
|
61
|
+
no_data = resp_has_no_data(numerator_metric_resp, config[:statistics]) || \
|
62
|
+
resp_has_no_data(denominator_metric_resp, config[:statistics])
|
63
|
+
if no_data && config[:no_data_ok]
|
64
|
+
ok "#{metric_desc} returned no data but that's ok"
|
65
|
+
elsif no_data && !config[:no_data_ok]
|
66
|
+
unknown "#{metric_desc} could not be retrieved"
|
67
|
+
end
|
68
|
+
|
69
|
+
denominator_value = read_value(denominator_metric_resp, config[:statistics]).to_f
|
70
|
+
if denominator_value.zero?
|
71
|
+
ok "#{metric_desc} denominator value is zero but that's ok"
|
72
|
+
end
|
73
|
+
numerator_value = read_value(numerator_metric_resp, config[:statistics]).to_f
|
74
|
+
value = (numerator_value / denominator_value * 100).to_i
|
75
|
+
base_msg = "#{metric_desc} is #{value}: comparison=#{config[:compare]}"
|
76
|
+
|
77
|
+
if compare(value, config[:critical], config[:compare])
|
78
|
+
critical "#{base_msg} threshold=#{config[:critical]}"
|
79
|
+
elsif config[:warning] && compare(value, config[:warning], config[:compare])
|
80
|
+
warning "#{base_msg} threshold=#{config[:warning]}"
|
81
|
+
else
|
82
|
+
ok "#{base_msg}, will alarm at #{!config[:warning].nil? ? config[:warning] : config[:critical]}"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
43
86
|
def check(config)
|
44
87
|
resp = client.get_metric_statistics(metrics_request(config))
|
45
88
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu-plugins-aws
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sensu-Plugins and contributors
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-05-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk
|
@@ -164,20 +164,6 @@ dependencies:
|
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0.10'
|
167
|
-
- !ruby/object:Gem::Dependency
|
168
|
-
name: rainbow
|
169
|
-
requirement: !ruby/object:Gem::Requirement
|
170
|
-
requirements:
|
171
|
-
- - "<"
|
172
|
-
- !ruby/object:Gem::Version
|
173
|
-
version: 2.2.0
|
174
|
-
type: :development
|
175
|
-
prerelease: false
|
176
|
-
version_requirements: !ruby/object:Gem::Requirement
|
177
|
-
requirements:
|
178
|
-
- - "<"
|
179
|
-
- !ruby/object:Gem::Version
|
180
|
-
version: 2.2.0
|
181
167
|
- !ruby/object:Gem::Dependency
|
182
168
|
name: rake
|
183
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -264,6 +250,7 @@ executables:
|
|
264
250
|
- check-certificate-expiry.rb
|
265
251
|
- check-cloudfront-tag.rb
|
266
252
|
- check-cloudwatch-alarm.rb
|
253
|
+
- check-cloudwatch-composite-metric.rb
|
267
254
|
- check-cloudwatch-metric.rb
|
268
255
|
- check-configservice-rules.rb
|
269
256
|
- check-dynamodb-capacity.rb
|
@@ -342,6 +329,7 @@ files:
|
|
342
329
|
- bin/check-certificate-expiry.rb
|
343
330
|
- bin/check-cloudfront-tag.rb
|
344
331
|
- bin/check-cloudwatch-alarm.rb
|
332
|
+
- bin/check-cloudwatch-composite-metric.rb
|
345
333
|
- bin/check-cloudwatch-metric.rb
|
346
334
|
- bin/check-configservice-rules.rb
|
347
335
|
- bin/check-dynamodb-capacity.rb
|