sensu-plugins-aws 2.1.1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YjA0M2U4MDE1M2U4N2Y3NGY0ODVjZDM3M2RlODNhYmY3MTFkZDI3YQ==
4
+ ZGMyOTMzMDljMzFjOTExZTdkZDhkOWNkOGUyN2I4ZjY1Yzk0MTRmNw==
5
5
  data.tar.gz: !binary |-
6
- Mjc2NDdjYzliYjNlMzM0NzMwZWM3OTVmZTc4MjdhMDY3MjJiYWQ2Yw==
6
+ YzAyNzdkM2EwOWM0M2YzOTdjZGViOTMyMWRmMjg1Zjc4NGQ1OTEwNA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ODU0NzhhNjQwODg2ZTdmMmRhYWFhNDIxZTFlNTQ1OTcxYmZlMTlhNjMxZTFl
10
- NzU2YjMyNmY3OGMzNTgyZjcwMmQzN2IzNzM1YTk0YTQxOTI4MjU0ZGY4OTcx
11
- YTBjMTU2NjE3MzIyZWNiZDIxZTEzZDA1ZDk1NjZkNGE4YjE5Mzg=
9
+ ZGJhNjQ5ODEwZDZiMTUxNmFkOWQxNzZjODJjZGI2YmNlMDk2NGY3Zjc2YmQ3
10
+ ZDA1ZDQwNWE0Y2IxZTBhNzUwZjYyZDdkYzk3NzMxMzhkOWNkOTY3MzNlYTI2
11
+ OWYwYzBhZTVmMTFkNjU1MzU5Y2UyMjdlOTNmMDExZjg2MzE4OTg=
12
12
  data.tar.gz: !binary |-
13
- M2MwMGNmZTBiYWUyYzAxMTkwMWI0ZGNjNmUzNDkxNTBjOTI1OGMzMjUxMzc0
14
- OTUwNTM2NDhhMzAxN2I1YTgyNTUzODEwNDUzMzIzYjMyM2UyM2NjZWExMDJl
15
- YzcyZTFjMWE4ODhkYTUzZTRmYzE2MmRlZjJiMjFkZDEyZDZkMWY=
13
+ NjE1NDA1Mzc0NjdlNDYxMWJjZWM5OWJjYzBlZDI4NGNjODMyOTI1OGQyYTFl
14
+ ZTllNzBkODViMWMyNzA0MzEyZDQwYjY4YjkzNTc4YTNmYTZlZTgwMWRkNTg4
15
+ ZjE1NjY2NmNhNThhZmU1YjIwODRhNjM0YzhjMDk3ODBlZGFhOTU=
data/CHANGELOG.md CHANGED
@@ -3,7 +3,19 @@ This project adheres to [Semantic Versioning](http://semver.org/).
3
3
 
4
4
  This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/)
5
5
 
6
- ## Unreleased
6
+ ## [Unreleased]
7
+
8
+ ## [2.2.0] - 2016-02-25
9
+ ### Added
10
+ - check-ebs-snapshots.rb: added -i flag to ignore volumes with an IGNORE_BACKUP tag
11
+ - check-sensu-client.rb Ensures that ec2 instances are registered with Sensu.
12
+ - check-trustedadvisor-service-limits.rb: New check for service limits based on Trusted Advisor API
13
+ - check-sqs-messages.rb,metrics-sqs.rb: Allow specifying queues by prefix with -p option
14
+ - check-rds-events.rb: Add option to check a specific RDS instance
15
+ - Add plugin check-elasticache-failover.rb that checks if an Elasticache node is in the primary state
16
+
17
+ ### Fixed
18
+ - metrics-elasticache.rb: Gather node metrics when requested
7
19
 
8
20
  ## [2.1.1] - 2016-02-05
9
21
  ### Added
@@ -124,8 +136,9 @@ WARNING: This release contains major breaking changes that will impact all user
124
136
  ### Added
125
137
  - initial release
126
138
 
127
- [unreleased]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.1.1...HEAD
128
- [2.1.1]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.1.0...2.1.1
139
+ [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.2.0...HEAD
140
+ [2.2.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/v2.1.1...2.2.0
141
+ [2.1.1]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.1.0...v2.1.1
129
142
  [2.1.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.0.1...2.1.0
130
143
  [2.0.1]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.0.0...2.0.1
131
144
  [2.0.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/1.2.0...2.0.0
data/README.md CHANGED
@@ -30,6 +30,8 @@
30
30
 
31
31
  **check-eip-allocation.rb**
32
32
 
33
+ **check-elasticache-failover.rb**
34
+
33
35
  **check-elb-certs.rb**
34
36
 
35
37
  **check-elb-health-fog.rb**
@@ -102,6 +104,7 @@
102
104
  * /bin/check-ebs-snapshots.rb
103
105
  * /bin/check-ec2-filter.rb
104
106
  * /bin/check-ec2-network.rb
107
+ * /bin/check-elasticache-failover.rb
105
108
  * /bin/check-elb-certs.rb
106
109
  * /bin/check-elb-health-fog.rb
107
110
  * /bin/check-elb-health-sdk.rb
@@ -18,8 +18,12 @@
18
18
  # USAGE:
19
19
  # ./check-ebs-snapshots.rb -r ${you_region}
20
20
  # ./check-ebs-snapshots.rb -r ${you_region} -p 1
21
+ # ./check-ebs-snapshots.rb -r ${you_region} -p -i
22
+ # ./check-ebs-snapshots.rb -r ${you_region} -i
21
23
  #
22
24
  # NOTES:
25
+ # When using -i flag any volume that has a tag-key of "IGNORE_BACKUP" will
26
+ # be ignored.
23
27
  #
24
28
  # LICENSE:
25
29
  # Shane Starcher <shane.starcher@gmail.com>
@@ -45,11 +49,18 @@ class CheckEbsSnapshots < Sensu::Plugin::Check::CLI
45
49
  description: 'AWS region',
46
50
  default: 'us-east-1'
47
51
 
52
+ option :check_ignored,
53
+ short: '-i',
54
+ long: '--ignore',
55
+ description: 'mark as true to ignore volumes with an IGNORE_BACKUP tag',
56
+ default: false,
57
+ boolean: true
58
+
48
59
  def run
49
60
  errors = []
50
- ec2 = Aws::EC2::Client.new
61
+ @ec2 = Aws::EC2::Client.new
51
62
 
52
- volumes = ec2.describe_volumes(
63
+ volumes = @ec2.describe_volumes(
53
64
  filters: [
54
65
  {
55
66
  name: 'attachment.status',
@@ -61,11 +72,10 @@ class CheckEbsSnapshots < Sensu::Plugin::Check::CLI
61
72
  }
62
73
  ]
63
74
  )
64
-
65
75
  volumes[:volumes].each do |volume|
66
76
  tags = volume[:tags].map { |a| Hash[*a] }.reduce(:merge) || {}
67
-
68
- snapshots = ec2.describe_snapshots(
77
+ next if config[:check_ignored] && tags.key?('IGNORE_BACKUP')
78
+ snapshots = @ec2.describe_snapshots(
69
79
  filters: [
70
80
  {
71
81
  name: 'volume-id',
@@ -0,0 +1,113 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # check-elasticache-failover.rb
4
+ #
5
+ # DESCRIPTION:
6
+ # Checks if specified ElastiCache node is `primary` state.
7
+ #
8
+ # OUTPUT:
9
+ # CheckElastiCacheFailover OK: Node `mynode-001` (in replication group `my-group-1`, node group `0001`) is `primary`.
10
+ # or
11
+ # CheckElastiCacheFailover CRITICAL: Node `mynode-001` (in replication group `my-group-1`, node group `0001`) is **not** `primary`.
12
+ #
13
+ # PLATFORMS:
14
+ # Linux, Windows, BSD, Solaris, etc
15
+ #
16
+ # DEPENDENCIES:
17
+ # gem: sensu-plugin
18
+ # gem: aws-sdk >= 2
19
+ #
20
+ # USAGE:
21
+ # check-elasticache-failover.rb --region <your region> --replication-group <yours> --node-group <yours> --primary-node <yours>
22
+ #
23
+ # NOTES:
24
+ #
25
+ # LICENSE:
26
+ # y13i <email@y13i.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
+ require 'sensu-plugins-aws/common'
34
+
35
+ class CheckElastiCacheFailover < Sensu::Plugin::Check::CLI
36
+ VERSION = '0.0.1'.freeze
37
+
38
+ option :profile,
39
+ description: 'Profile name of AWS shared credential file entry.',
40
+ long: '--profile PROFILE',
41
+ short: '-p PROFILE'
42
+
43
+ option :aws_region,
44
+ description: 'AWS region.',
45
+ short: '-r REGION',
46
+ long: '--region REGION'
47
+
48
+ option :severity,
49
+ description: 'Critical or Warning.',
50
+ short: '-s SEVERITY',
51
+ long: '--severity SEVERITY',
52
+ proc: :intern.to_proc,
53
+ default: :critical
54
+
55
+ option :replication_group,
56
+ description: 'Replication group to check.',
57
+ long: '--replication-group ID',
58
+ short: '-g ID'
59
+
60
+ option :node_group,
61
+ description: 'Node group to check.',
62
+ long: '--node-group ID',
63
+ short: '-n ID'
64
+
65
+ option :primary_node,
66
+ description: 'Cluster name that should be primary.',
67
+ long: '--primary-node NAME',
68
+ short: '-c NAME'
69
+
70
+ include Common
71
+
72
+ def run
73
+ replication_group = elasticache.client.describe_replication_groups.replication_groups.find do |g|
74
+ g.replication_group_id == config[:replication_group]
75
+ end
76
+
77
+ unknown 'Replication group not found.' if replication_group.nil?
78
+
79
+ node_group = replication_group.node_groups.find do |g|
80
+ g.node_group_id == config[:node_group]
81
+ end
82
+
83
+ unknown 'Node group not found.' if node_group.nil?
84
+
85
+ node = node_group.node_group_members.find do |n|
86
+ n.cache_cluster_id == config[:primary_node]
87
+ end
88
+
89
+ unknown 'Node not found.' if node.nil?
90
+
91
+ message = "Node `#{config[:primary_node]}` (in replication group `#{config[:replication_group]}`, node group `#{config[:node_group]}`) is "
92
+
93
+ if node.current_role == 'primary'
94
+ message += '`primary`.'
95
+ ok message
96
+ else
97
+ message += '**not** `primary`.'
98
+ send config[:severity], message
99
+ end
100
+ end
101
+
102
+ private
103
+
104
+ def elasticache
105
+ return @elasticache if @elasticache
106
+
107
+ c = {}
108
+ c.update aws_config
109
+ c.update(profile: config[:profile]) if config[:profile]
110
+
111
+ @elasticache = Aws::ElastiCache::Resource.new(c)
112
+ end
113
+ end
@@ -23,7 +23,14 @@
23
23
  # gem: sensu-plugin
24
24
  #
25
25
  # USAGE:
26
- # ./check-rds-events.rb -r ${your_region} -k ${your_aws_secret_access_key} -a ${your_aws_access_key}
26
+ # Check's a specific RDS instance in a specific region for critical events
27
+ # check-rds-events.rb -r ${your_region} -k ${your_aws_secret_access_key} -a ${your_aws_access_key} -i ${your_rds_instance_id_name}
28
+ #
29
+ # Checks all RDS instances in a specific region
30
+ # check-rds-events.rb -r ${your_region} -k ${your_aws_secret_access_key} -a ${your_aws_access_key}
31
+ #
32
+ # Checks all RDS instances in a specific region, should be using IAM role
33
+ # check-rds-events.rb -r ${your_region}
27
34
  #
28
35
  # NOTES:
29
36
  #
@@ -55,6 +62,11 @@ class CheckRDSEvents < Sensu::Plugin::Check::CLI
55
62
  description: 'AWS Region (defaults to us-east-1).',
56
63
  default: 'us-east-1'
57
64
 
65
+ option :db_instance_id,
66
+ short: '-i N',
67
+ long: '--db-instance-id NAME',
68
+ description: 'DB instance identifier'
69
+
58
70
  def aws_config
59
71
  { access_key_id: config[:aws_access_key],
60
72
  secret_access_key: config[:aws_secret_access_key],
@@ -75,8 +87,18 @@ class CheckRDSEvents < Sensu::Plugin::Check::CLI
75
87
  rds = AWS::RDS::Client.new aws_config
76
88
 
77
89
  begin
78
- # fetch all clusters identifiers
79
- clusters = rds.describe_db_instances[:db_instances].map { |db| db[:db_instance_identifier] }
90
+ if !config[:db_instance_id].nil? && !config[:db_instance_id].empty?
91
+ db_instance = rds.describe_db_instances(db_instance_identifier: config[:db_instance_id])
92
+ if db_instance.nil? || db_instance.empty?
93
+ unknown "#{config[:db_instance_id]} instance not found"
94
+ else
95
+ clusters = [config[:db_instance_id]]
96
+ end
97
+ else
98
+ # fetch all clusters identifiers
99
+ clusters = rds.describe_db_instances[:db_instances].map { |db| db[:db_instance_identifier] }
100
+ end
101
+
80
102
  maint_clusters = []
81
103
 
82
104
  # fetch the last 15 minutes of events for each cluster
@@ -96,6 +118,7 @@ class CheckRDSEvents < Sensu::Plugin::Check::CLI
96
118
  cluster_name_long = "#{cluster_name} (#{aws_config[:region]}) #{events_record[:events][-1][:message]}"
97
119
  maint_clusters.push(cluster_name_long)
98
120
  end
121
+
99
122
  rescue => e
100
123
  unknown "An error occurred processing AWS RDS API: #{e.message}"
101
124
  end
data/bin/check-rds.rb CHANGED
@@ -134,8 +134,8 @@ class CheckRDS < Sensu::Plugin::Check::CLI
134
134
  end
135
135
 
136
136
  def find_db_instance(id)
137
- db = rds.describe_db_instances.db_instances.select { |db_instance| db_instance.db_instance_identifier == id }
138
- unknown 'DB instance not found.' if db.empty?
137
+ db = rds.describe_db_instances.db_instances.detect { |db_instance| db_instance.db_instance_identifier == id }
138
+ unknown 'DB instance not found.' if db.nil?
139
139
  db
140
140
  end
141
141
 
@@ -146,7 +146,7 @@ class CheckRDS < Sensu::Plugin::Check::CLI
146
146
  dimensions: [
147
147
  {
148
148
  name: 'DBInstanceIdentifier',
149
- value: @db_instance.id
149
+ value: @db_instance.db_instance_identifier
150
150
  }
151
151
  ],
152
152
  start_time: config[:end_time] - config[:period],
@@ -240,8 +240,8 @@ class CheckRDS < Sensu::Plugin::Check::CLI
240
240
  end
241
241
 
242
242
  def check_connections(severity, expected_lower_than)
243
- @connections_metric ||= cloud_watch_metric 'DatabaseConnections'
244
- @connections_metric_value ||= latest_value @connections_metric, 'Count'
243
+ @connections_metric ||= cloud_watch_metric 'DatabaseConnections', 'Count'
244
+ @connections_metric_value ||= latest_value @connections_metric
245
245
  return if @connections_metric_value < expected_lower_than
246
246
  flag_alert severity, "; DatabaseConnections are #{sprintf '%d', @connections_metric_value} (expected lower than #{expected_lower_than})"
247
247
  end
@@ -0,0 +1,175 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # sensu-health-check
4
+ #
5
+ # DESCRIPTION:
6
+ # Finds a given tag set from EC2 and ensures sensu clients exist
7
+ #
8
+ # OUTPUT:
9
+ # plain-text
10
+ #
11
+ # PLATFORMS:
12
+ # Linux
13
+ #
14
+ # DEPENDENCIES:
15
+ # gem: aws-sdk
16
+ # gem: sensu-plugin
17
+ #
18
+ # USAGE:
19
+ # ./check-sensu-client.rb -w 20 -f "{name:tag-value,values:[infrastructure]}"
20
+ # ./check-sensu-client.rb -w 20 -f "{name:tag-value,values:[infrastructure]}" -e '{Name:[Ignore, Bad.*]}'
21
+ # ./check-sensu-client.rb -w 20 -f "{name:tag-value,values:[infrastructure]}" -e '{Name:[Ignore, Bad.*]} {Sensu: [Ignore]}'
22
+ #
23
+ # NOTES:
24
+ # Values provided for the exclusion filter are treated as regex's for evaluation purposes. Any matching value
25
+ # will result in the instance being excluded
26
+ #
27
+ # LICENSE:
28
+ # Justin McCarty (jmccarty3@gmail.com)
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
+ require 'net/http'
37
+ require 'json'
38
+
39
+ class CheckSensuClient < Sensu::Plugin::Check::CLI
40
+ include Filter
41
+ include Common
42
+ option :aws_region,
43
+ short: '-r AWS_REGION',
44
+ long: '--aws-region REGION',
45
+ description: 'AWS Region (such as us-east-1).',
46
+ default: 'us-east-1'
47
+
48
+ option :sensu_host,
49
+ short: '-h SENSU_HOST',
50
+ long: '--host SENSU_HOST',
51
+ description: 'Sensu host to query',
52
+ default: 'sensu'
53
+
54
+ option :sensu_port,
55
+ short: '-p SENSU_PORT',
56
+ long: '--port SENSU_PORT',
57
+ description: 'Sensu API port',
58
+ proc: proc(&:to_i),
59
+ default: 4567
60
+
61
+ option :warn,
62
+ short: '-w WARN',
63
+ description: 'Warn if instance has been up longer (Minutes)',
64
+ proc: proc(&:to_i),
65
+ default: 0
66
+
67
+ option :critical,
68
+ short: '-c CRITICAL',
69
+ description: 'Critical if instance has been up longer (Minutes)',
70
+ proc: proc(&:to_i)
71
+
72
+ option :min,
73
+ short: '-m MIN_TIME',
74
+ description: 'Minimum Time an instance must be running (Minutes)',
75
+ proc: proc(&:to_i),
76
+ default: 5
77
+
78
+ option :filter,
79
+ short: '-f FILTER',
80
+ description: 'Filter to use to find ec2 instances',
81
+ default: '{}'
82
+
83
+ option :exclude_tags,
84
+ short: '-e {<tag-key>:[VAL1, VAL2]} {<tag-key>:[VAL1, VAL2] }',
85
+ long: '--exclude_tags {<tag-key>:[VAL1, VAL2] } {<tag-key>:[VAL1, VAL2] }',
86
+ description: 'Tag Values to exclude by. Values treated as regex. Any matching value will result in exclusion.',
87
+ default: '{}'
88
+
89
+ def run
90
+ # Converting the string into a hash.
91
+ filter_list = config[:exclude_tags].split(/}\s?{/).map do |x|
92
+ x.gsub(/[{}]/, '')
93
+ end
94
+ filter_list = filter_list.map do |y|
95
+ h1, h2 = y.split(':')
96
+ { h1 => h2 }
97
+ end.reduce(:merge)
98
+ filter_list.delete(nil)
99
+ filter_list.each { |x, y| filter_list[x] = y.strip.gsub(/[\[\]]/, '') }
100
+ client = Aws::EC2::Client.new aws_config
101
+
102
+ parsed_filter = Filter.parse(config[:filter])
103
+
104
+ filter = if parsed_filter.empty?
105
+ {}
106
+ else
107
+ { filters: parsed_filter }
108
+ end
109
+
110
+ data = client.describe_instances(filter)
111
+
112
+ current_time = Time.now.utc
113
+ aws_instances = Set.new
114
+ data.reservations.each do |r|
115
+ r.instances.each do |i|
116
+ aws_instances << {
117
+ id: i[:instance_id],
118
+ up_time: (current_time - i[:launch_time]) / 60,
119
+ tags: i.tags
120
+ }
121
+ end
122
+ end
123
+
124
+ sensu_clients = client_check
125
+
126
+ missing = Set.new
127
+
128
+ aws_instances.delete_if do |instance|
129
+ instance[:tags].any? do |key|
130
+ filter_list.keys.include?(key.key) && filter_list[key.key].split(',').any? do |v|
131
+ key.value.match(/#{v.strip}/)
132
+ end
133
+ end
134
+ end
135
+
136
+ aws_instances.each do |i|
137
+ if sensu_clients.include?(i[:id]) == false
138
+ if i[:up_time] > config[:min]
139
+ missing << i
140
+ output "Missing instance #{i[:id]}. Uptime: #{i[:up_time]} Minutes"
141
+ end
142
+ end
143
+ end
144
+
145
+ warn_flag = false
146
+ crit_flag = false
147
+
148
+ missing.each do |m|
149
+ if (config[:critical].nil? == false) && (m[:up_time] > config[:critical])
150
+ crit_flag = true
151
+ elsif (config[:warn].nil? == false) && (m[:up_time] > config[:warn])
152
+ warn_flag = true
153
+ end
154
+ end
155
+
156
+ if crit_flag
157
+ critical
158
+ elsif warn_flag
159
+ warning
160
+ end
161
+ ok
162
+ end
163
+
164
+ def client_check
165
+ uri = URI("http://#{config[:sensu_host]}:#{config[:sensu_port]}/clients")
166
+ response = JSON.parse(Net::HTTP.get(uri))
167
+
168
+ clients = Set.new
169
+ response.each do |client|
170
+ clients << client['name']
171
+ end
172
+
173
+ clients
174
+ end
175
+ end
@@ -16,8 +16,8 @@
16
16
  # gem: sensu-plugin
17
17
  #
18
18
  # USAGE:
19
- # #YELLOW
20
- #
19
+ # check-sqs-messages -q my_queue -a key -k secret -w 500 -c 1000
20
+ # check-sqs-messages -p queue_prefix_ -a key -k secret -W 100 -C 50
21
21
  #
22
22
  # NOTES:
23
23
  #
@@ -56,7 +56,13 @@ class SQSMsgs < Sensu::Plugin::Check::CLI
56
56
  short: '-q SQS_QUEUE',
57
57
  long: '--queue SQS_QUEUE',
58
58
  description: 'The name of the SQS you want to check the number of messages for',
59
- required: true
59
+ default: ''
60
+
61
+ option :prefix,
62
+ short: '-p PREFIX',
63
+ long: '--prefix PREFIX',
64
+ description: 'The prefix of the queues you want to check the number of messages for',
65
+ default: ''
60
66
 
61
67
  option :warn_over,
62
68
  short: '-w WARN_OVER',
@@ -96,14 +102,46 @@ class SQSMsgs < Sensu::Plugin::Check::CLI
96
102
  def run
97
103
  AWS.config aws_config
98
104
  sqs = AWS::SQS.new
99
- messages = sqs.queues.named(config[:queue]).approximate_number_of_messages
100
105
 
101
- if (config[:crit_under] >= 0 && messages < config[:crit_under]) || (config[:crit_over] >= 0 && messages > config[:crit_over])
102
- critical "#{messages} message(s) in #{config[:queue]} queue"
103
- elsif (config[:warn_under] >= 0 && messages < config[:warn_under]) || (config[:warn_over] >= 0 && messages > config[:warn_over])
104
- warning "#{messages} message(s) in #{config[:queue]} queue"
106
+ if config[:prefix] == ''
107
+ if config[:queue] == ''
108
+ critical 'Error, either QUEUE or PREFIX must be specified'
109
+ end
110
+
111
+ messages = sqs.queues.named(config[:queue]).approximate_number_of_messages
112
+
113
+ if (config[:crit_under] >= 0 && messages < config[:crit_under]) || (config[:crit_over] >= 0 && messages > config[:crit_over])
114
+ critical "#{messages} message(s) in #{config[:queue]} queue"
115
+ elsif (config[:warn_under] >= 0 && messages < config[:warn_under]) || (config[:warn_over] >= 0 && messages > config[:warn_over])
116
+ warning "#{messages} message(s) in #{config[:queue]} queue"
117
+ else
118
+ ok "#{messages} messages in #{config[:queue]} queue"
119
+ end
105
120
  else
106
- ok "#{messages} messages in #{config[:queue]} queue"
121
+ warn = false
122
+ crit = false
123
+ queues = []
124
+
125
+ sqs.queues.with_prefix(config[:prefix]).each do |q|
126
+ queue_name = q.arn.split(':').last
127
+ messages = q.approximate_number_of_messages
128
+
129
+ if (config[:crit_under] >= 0 && messages < config[:crit_under]) || (config[:crit_over] >= 0 && messages > config[:crit_over])
130
+ crit = true
131
+ queues << "#{messages} message(s) in #{queue_name} queue"
132
+ elsif (config[:warn_under] >= 0 && messages < config[:warn_under]) || (config[:warn_over] >= 0 && messages > config[:warn_over])
133
+ warn = true
134
+ queues << "#{messages} message(s) in #{queue_name} queue"
135
+ end
136
+ end
137
+
138
+ if crit
139
+ critical queues.to_s
140
+ elsif warn
141
+ warning queues.to_s
142
+ else
143
+ ok "All queues matching prefix '#{config[:prefix]}' OK"
144
+ end
107
145
  end
108
146
  end
109
147
  end
@@ -0,0 +1,82 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # check-trustedadvisor-service-limits
4
+ #
5
+ #
6
+ # DESCRIPTION:
7
+ # This plugin uses Trusted Advisor API to perform check for
8
+ # service limits. Trigger 'critical' on sensu for services
9
+ # that are not 'Green'.
10
+ #
11
+ # IAM requires AWSSupportAccess policy enabled.
12
+ #
13
+ # https://aws.amazon.com/premiumsupport/ta-faqs/
14
+ #
15
+ #
16
+ # OUTPUT:
17
+ # plain-text
18
+ #
19
+ # PLATFORMS:
20
+ # Linux
21
+ #
22
+ # DEPENDENCIES:
23
+ # gem: aws-sdk-v1
24
+ # gem: sensu-plugin
25
+ #
26
+ # USAGE:
27
+ # ./check-trustedadvisor-service-limits.rb -l {en|ja}
28
+ #
29
+ # NOTES:
30
+ #
31
+ # LICENSE:
32
+ # Seandy Wibowo <swibowo@sugarcrm.com>
33
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
34
+ # for details.
35
+
36
+ require 'sensu-plugin/check/cli'
37
+ require 'sensu-plugins-aws'
38
+ require 'aws-sdk'
39
+
40
+ class CheckTrustedAdvisorServiceLimits < Sensu::Plugin::Check::CLI
41
+ include Common
42
+ option :aws_language,
43
+ short: '-l AWS_LANGUAGE',
44
+ long: '--aws-language AWS_LANGUAGE',
45
+ description: "ISO 639-1 language code to be used when querying Trusted Advisor API. Only 'en' and 'ja' supported for now",
46
+ default: 'en'
47
+
48
+ def run
49
+ # The Support endpoint seems to only available in us-east-1 region
50
+ # http://docs.aws.amazon.com/sdkforruby/api/Aws/Support.html
51
+ aws_support = Aws::Support::Client.new(region: 'us-east-1')
52
+
53
+ service_limit_msg = []
54
+
55
+ begin
56
+ # service limit check
57
+ # Perform a refresh to make sure the API result is not stale.
58
+ aws_support.refresh_trusted_advisor_check(check_id: 'eW7HH0l7J9')
59
+ sl = aws_support.describe_trusted_advisor_check_result(check_id: 'eW7HH0l7J9', language: config[:aws_language])
60
+
61
+ sl[:result][:flagged_resources].each do |slr|
62
+ # Data structure will be as follow
63
+ # ["<region>", "<service>", "<description>", "<limit>", "<usage>", "<status>"]
64
+ sl_region, sl_service, sl_description, sl_limit, sl_usage, sl_status = slr[:metadata]
65
+
66
+ next if sl_status == 'Green'
67
+ sl_usage = 0 if sl_usage.nil?
68
+
69
+ sl_msg = "#{sl_service} (#{sl_region}) #{sl_description} #{sl_usage} out of #{sl_limit}"
70
+ service_limit_msg.push(sl_msg)
71
+ end
72
+ rescue => e
73
+ unknown "An error occurred processing AWS TrustedAdvisor API: #{e.message}"
74
+ end
75
+
76
+ if service_limit_msg.empty?
77
+ ok
78
+ else
79
+ critical("Services hitting usage limit: #{service_limit_msg.join(', ')}")
80
+ end
81
+ end
82
+ end
@@ -98,6 +98,21 @@ class ElastiCacheMetrics < Sensu::Plugin::Metric::CLI::Graphite
98
98
  config[:scheme]
99
99
  end
100
100
 
101
+ dimensions = if config[:cachenodeid]
102
+ [{
103
+ 'name' => 'CacheClusterId',
104
+ 'value' => config[:cacheclusterid]
105
+ }, {
106
+ 'name' => 'CacheNodeId',
107
+ 'value' => config[:cachenodeid]
108
+ }]
109
+ else
110
+ [{
111
+ 'name' => 'CacheClusterId',
112
+ 'value' => config[:cacheclusterid]
113
+ }]
114
+ end
115
+
101
116
  statistic_type = {
102
117
  'redis' => {
103
118
  'CPUUtilization' => 'Percent',
@@ -168,9 +183,7 @@ class ElastiCacheMetrics < Sensu::Plugin::Metric::CLI::Graphite
168
183
  options = {
169
184
  'namespace' => 'AWS/ElastiCache',
170
185
  'metric_name' => config[:metric],
171
- 'dimensions' => [
172
- { 'name' => 'CacheClusterId', 'value' => config[:cacheclusterid] }
173
- ],
186
+ 'dimensions' => dimensions,
174
187
  'start_time' => st.iso8601,
175
188
  'end_time' => et.iso8601,
176
189
  'period' => 60,
data/bin/metrics-sqs.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  #! /usr/bin/env ruby
2
2
  #
3
- # sqs-metrics
3
+ # metrics-sqs
4
4
  #
5
5
  # DESCRIPTION:
6
6
  # Fetch SQS metrics
@@ -16,7 +16,8 @@
16
16
  # gem: sensu-plugin
17
17
  #
18
18
  # USAGE:
19
- # sqs-metrics -q my_queue -a key -k secret
19
+ # metrics-sqs -q my_queue -a key -k secret
20
+ # metrics-sqs -p queue_prefix_ -a key -k secret
20
21
  #
21
22
  # NOTES:
22
23
  #
@@ -34,7 +35,13 @@ class SQSMetrics < Sensu::Plugin::Metric::CLI::Graphite
34
35
  description: 'Name of the queue',
35
36
  short: '-q QUEUE',
36
37
  long: '--queue QUEUE',
37
- required: true
38
+ default: ''
39
+
40
+ option :prefix,
41
+ description: 'Queue name prefix',
42
+ short: '-p PREFIX',
43
+ long: '--prefix PREFIX',
44
+ default: ''
38
45
 
39
46
  option :scheme,
40
47
  description: 'Metric naming scheme, text to prepend to metric',
@@ -67,19 +74,33 @@ class SQSMetrics < Sensu::Plugin::Metric::CLI::Graphite
67
74
  }
68
75
  end
69
76
 
70
- def run
71
- scheme = if config[:scheme] == ''
72
- "aws.sqs.queue.#{config[:queue].tr('-', '_')}.message_count"
73
- else
74
- config[:scheme]
75
- end
77
+ def scheme(queue_name)
78
+ "aws.sqs.queue.#{queue_name.tr('-', '_')}.message_count"
79
+ end
76
80
 
81
+ def run
77
82
  begin
78
83
  sqs = AWS::SQS.new aws_config
79
84
 
80
- messages = sqs.queues.named(config[:queue]).approximate_number_of_messages
81
- output scheme, messages
85
+ if config[:prefix] == ''
86
+ if config[:queue] == ''
87
+ critical 'Error, either QUEUE or PREFIX must be specified'
88
+ end
89
+
90
+ scheme = if config[:scheme] == ''
91
+ scheme config[:queue]
92
+ else
93
+ config[:scheme]
94
+ end
82
95
 
96
+ messages = sqs.queues.named(config[:queue]).approximate_number_of_messages
97
+ output scheme, messages
98
+ else
99
+ sqs.queues.with_prefix(config[:prefix]).each do |q|
100
+ queue_name = q.arn.split(':').last
101
+ output scheme(queue_name), q.approximate_number_of_messages
102
+ end
103
+ end
83
104
  rescue => e
84
105
  critical "Error fetching SQS queue metrics: #{e.message}"
85
106
  end
@@ -1,8 +1,8 @@
1
1
  module SensuPluginsAWS
2
2
  module Version
3
3
  MAJOR = 2
4
- MINOR = 1
5
- PATCH = 1
4
+ MINOR = 2
5
+ PATCH = 0
6
6
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
7
7
  end
8
8
  end
metadata CHANGED
@@ -1,45 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sensu-Plugins and contributors
8
8
  autorequire:
9
9
  bindir: bin
10
- cert_chain:
11
- - !binary |-
12
- LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURuakNDQW9hZ0F3SUJB
13
- Z0lCQVRBTkJna3Foa2lHOXcwQkFRVUZBREJLTVJVd0V3WURWUVFEREF4elpX
14
- NXoKZFMxd2JIVm5hVzR4SFRBYkJnb0praWFKay9Jc1pBRVpGZzF6Wlc1emRT
15
- MXdiSFZuYVc1ek1SSXdFQVlLQ1pJbQppWlB5TEdRQkdSWUNhVzh3SGhjTk1U
16
- WXdNakEwTWpNeU1qRTNXaGNOTVRjd01qQXpNak15TWpFM1dqQktNUlV3CkV3
17
- WURWUVFEREF4elpXNXpkUzF3YkhWbmFXNHhIVEFiQmdvSmtpYUprL0lzWkFF
18
- WkZnMXpaVzV6ZFMxd2JIVm4KYVc1ek1SSXdFQVlLQ1pJbWlaUHlMR1FCR1JZ
19
- Q2FXOHdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBdwpnZ0VLQW9J
20
- QkFRQy9VUzNmdEkyUmQrOWQzS3JIQUw0bERsOGxhN2s2ZHA3K1RPY210VHd3
21
- YzRiMUwzV0NyeEFoClpDWms1Q3k2aUpvWUd4VHVoNittSDJZZ3ExbHZGRE4v
22
- NTh5YVRHTVFINzNRYVJjZjVnak9IMkJSQTlkUWRzWUgKYTNZYnMrbGxwVlYv
23
- ZC9kMklaYyt2RU9tc21rTFpVeEhzZFdQSTZsWTBuYXJwU2RxNHNML0lXWWZP
24
- aW1ocFFTWgpTV0t5WHg5cjM4UFpZZ0Q3djIydjloNTZkcUpQZFFPY29OODhF
25
- NkE4YTdQWTcvL1RweWdTREtuSldudkFwS1JxCjNCN0xMaFNkOTRQMHdRcGow
26
- MS9sb05Nd0FCMytGQjRRQ0UrdG1QeFYxZ1Q2ZWE4VW1SNjQrcGZKTFN0NGl5
27
- N0gKVGc5OTdCZFZqaURJdG5SYzhCSXNjVFl4S2JRai9wTEhBZ01CQUFHamdZ
28
- NHdnWXN3Q1FZRFZSMFRCQUl3QURBTApCZ05WSFE4RUJBTUNCTEF3SFFZRFZS
29
- ME9CQllFRk5McjBmZ1BmdnlWK0VneEVGRHhVcVFhU2xScE1DZ0dBMVVkCkVR
30
- UWhNQitCSFhObGJuTjFMWEJzZFdkcGJrQnpaVzV6ZFMxd2JIVm5hVzV6TG1s
31
- dk1DZ0dBMVVkRWdRaE1CK0IKSFhObGJuTjFMWEJzZFdkcGJrQnpaVzV6ZFMx
32
- d2JIVm5hVzV6TG1sdk1BMEdDU3FHU0liM0RRRUJCUVVBQTRJQgpBUUNQZTZ0
33
- RUJ0NS9uQzk1aFhvS2VLRmhrWVc5bTE2aU5YdWRKeEorZGRYcnpDc2tEMXk2
34
- ajZjQXY0a1FlUDFmClBIbDE4aDVrOWtKeElQU1IrcUkrK2JJbDE3ZUVPU096
35
- YXNMbXdzdGFNU25NN3U1UWZMcFdFWTJldVZXQkRzdGQKMmhrcG80VSswSzVT
36
- d3ptZEphMFdLQXRmS3ZkdENROGk5MllJUCtIODNFdXZDU0xwZ29aaDYzRXJx
37
- dVFVY25lbgphZmg1bHVUQkExaTFjcUJHNEFNSjBmTFdHeU9xSmFYOFA5WnN4
38
- RERXUEVCbk5TaVd2WGIrSUttSkFWTzF1VzRrClFOODNielZXU1d1bFk4Qlk2
39
- a1grSVFNd1lhelpBbEIvMTNkN2E4VTBoN0NyYjM2Sm5TUGF0aHVSemU0cUtY
40
- RlEKM2YzVFVaV3d2UmZ0Y1N1K3Z0Y0JSa00wCi0tLS0tRU5EIENFUlRJRklD
41
- QVRFLS0tLS0K
42
- date: 2016-02-07 00:00:00.000000000 Z
10
+ cert_chain: []
11
+ date: 2016-02-25 00:00:00.000000000 Z
43
12
  dependencies:
44
13
  - !ruby/object:Gem::Dependency
45
14
  name: aws-sdk
@@ -270,6 +239,7 @@ executables:
270
239
  - check-ec2-filter.rb
271
240
  - check-ec2-network.rb
272
241
  - check-eip-allocation.rb
242
+ - check-elasticache-failover.rb
273
243
  - check-elb-certs.rb
274
244
  - check-elb-health-fog.rb
275
245
  - check-elb-health-sdk.rb
@@ -285,11 +255,12 @@ executables:
285
255
  - check-redshift-events.rb
286
256
  - check-s3-bucket.rb
287
257
  - check-s3-object.rb
258
+ - check-sensu-client.rb
288
259
  - check-ses-limit.rb
289
260
  - check-sqs-messages.rb
261
+ - check-trustedadvisor-service-limits.rb
290
262
  - check-vpc-nameservers.rb
291
263
  - check-vpc-vpn.rb
292
- - check_vpc_vpn.py
293
264
  - handler-ec2_node.rb
294
265
  - handler-ses.rb
295
266
  - handler-sns.rb
@@ -318,6 +289,7 @@ files:
318
289
  - bin/check-ec2-filter.rb
319
290
  - bin/check-ec2-network.rb
320
291
  - bin/check-eip-allocation.rb
292
+ - bin/check-elasticache-failover.rb
321
293
  - bin/check-elb-certs.rb
322
294
  - bin/check-elb-health-fog.rb
323
295
  - bin/check-elb-health-sdk.rb
@@ -333,8 +305,10 @@ files:
333
305
  - bin/check-redshift-events.rb
334
306
  - bin/check-s3-bucket.rb
335
307
  - bin/check-s3-object.rb
308
+ - bin/check-sensu-client.rb
336
309
  - bin/check-ses-limit.rb
337
310
  - bin/check-sqs-messages.rb
311
+ - bin/check-trustedadvisor-service-limits.rb
338
312
  - bin/check-vpc-nameservers.rb
339
313
  - bin/check-vpc-vpn.rb
340
314
  - bin/check_vpc_vpn.py
checksums.yaml.gz.sig DELETED
Binary file
data.tar.gz.sig DELETED
Binary file
metadata.gz.sig DELETED
Binary file