sensu-plugins-aws 3.1.0 → 3.2.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 CHANGED
@@ -1,15 +1,7 @@
1
1
  ---
2
- !binary "U0hBMQ==":
3
- metadata.gz: !binary |-
4
- NWI2YzJmMzQ4ZWVkZTI4YjI0N2EzMTA5YWMwZjU4ODcxNTFkMTAyMA==
5
- data.tar.gz: !binary |-
6
- ZjY3ZTk3ODIzODhhNzUwODI1ZmUzM2YzYWUxNDUzMzJlMDUzNWYyNQ==
2
+ SHA1:
3
+ metadata.gz: 65a658312741eaa7884c4c1c12cad191fa918902
4
+ data.tar.gz: 79db3d111315f8eeb145ddfefb975851f0c6e3b7
7
5
  SHA512:
8
- metadata.gz: !binary |-
9
- NDQyYzk2ZDQ3OGQwOWVmY2Q3Njk3M2FlNzgxYTQzNjBjZjIzYTc5YjI0MTMz
10
- YWI5NjM0MmZiODU5YTI0NTBlMDA5NWM0Y2I0NzQ1N2FkNzMzZTUzNDgyMDVk
11
- MGU2MzJkOGUzMThmODZmYjNlZTg2OTA2M2U3N2EwODQzMjg3MTk=
12
- data.tar.gz: !binary |-
13
- ZDk3YmU4ZmM4OWEyOTRjMmVmNTI1MTc3Mzc4YTAwYTgzMzU4NzM4Y2VmZTQy
14
- ZTc3YjNiYjQ3N2JmNGNjMDM4OTNmZmI4ODZlNWUxMzQ1ZWFiMzg4ODM4OTIy
15
- MmJiYTg5MTU3MTZlNzA0ODhmNTFjNmE4NzIwMDlhYzlhYmE1MGY=
6
+ metadata.gz: 72da4039f685bf1ec8f5a95f8fccd88c827a0a0e225089224627334bbf0646cd2c290aee3b3ed5947dac99ecc76aac1bfcaaeab7a2318170540c4908337064fb
7
+ data.tar.gz: 04324188dc9b85f734b8928c845d6bb4acad5c66e9e8932697395a99d6361f937968f12c66fd06e596f69a64e3efcf75aab3d606b84b318a4efd2aa92fde5a50
@@ -5,6 +5,33 @@ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachang
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [3.2.0] - 2016-08-03
9
+ ### Fixed
10
+ - metrics-emr-steps.rb: fixed typo in variable name (@babsher)
11
+ - metrics-sqs.rb: --scheme option now works with --prefix (@mool)
12
+ - check-ecs-service-health.rb:
13
+ - `service_list` retrieves all records when services not provided through options (@marckysharky)
14
+ - `service_details` - handles scenario whereby services array is greater than aws limit (10) (@marckysharky)
15
+ - exit code for tests did not respect rspec exit codes due to autorun feature. (#133 @zbintliff)
16
+ - syntax error in check-sensu-clients (@sstarcher)
17
+ - check-rds-pending: Fix uninitialized constant (@obazoud)
18
+
19
+ ### Added
20
+ - check-rds.rb: Add support for assuming a role in another account (@oba11)
21
+ - check-instance-events.rb: Add instance_id option (@Jeppesen-io)
22
+ - check-sensu-clients.rb: SSL support (@sstarcher)
23
+ - common.rb: adding support for environment variable AWS_REGION when region is specified as an empty string (@sstarcher)
24
+ - metrics-sqs.rb: Add support for recording additional per-queue SQS metrics (counts of not-visible and delayed messages) (@paddycarey)
25
+ - check-subnet-ip-consumption.rb: to check consumption of IP addresses in subnets and alert if consumption exceeds a threshold (@nickjacques)
26
+ - check-beanstalk-health.rb: Add optional region support
27
+ - check-rds-events.rb: Added '-r all' region support (@swibowo)
28
+ - check-instance-events.rb: Added '-r all' region support and description of the event. Minor change to output message (@swibowo)
29
+ - check-elb-health-sdk.rb: Updated available regions fetch (@swibowo)
30
+ - handler-ec2_node.rb: Add region support (@runningman84)
31
+
32
+ ### Changed
33
+ - Update `aws-sdk` dependency pin to ~> 2.3 (@sstarcher)
34
+
8
35
  ## [3.1.0] - 2016-05-15
9
36
  ### Fixed
10
37
  - check-instance-events.rb: Ignore completed instance-stop ec2 events
@@ -26,6 +53,7 @@ This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachang
26
53
 
27
54
  ### Added
28
55
  - Support for Ruby 2.3
56
+ - check-elb-health-sdk.rb: Added multi-region support and specify instance tag to display on check output
29
57
  - check-rds.rb: Added check for IOPS
30
58
 
31
59
  ## [2.4.3] - 2016-04-13
@@ -198,7 +226,8 @@ WARNING: This release contains major breaking changes that will impact all user
198
226
  ### Added
199
227
  - initial release
200
228
 
201
- [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/3.1.0...HEAD
229
+ [Unreleased]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/3.2.0...HEAD
230
+ [3.2.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/3.1.0...3.2.0
202
231
  [3.1.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/3.0.0...3.1.0
203
232
  [3.0.0]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.4.3...3.0.0
204
233
  [2.4.3]: https://github.com/sensu-plugins/sensu-plugins-aws/compare/2.4.2...2.4.3
data/README.md CHANGED
@@ -82,6 +82,8 @@
82
82
 
83
83
  **check-sqs-messages.rb**
84
84
 
85
+ **check-subnet-ip-consumption**
86
+
85
87
  **check-vpc-nameservers**
86
88
 
87
89
  **check_vpc_vpn.py**
@@ -151,6 +153,7 @@
151
153
  * /bin/check-ses-limit.rb
152
154
  * /bin/check-ses-statistics.rb
153
155
  * /bin/check-sqs-messages.rb
156
+ * /bin/check-subnet-ip-consumption.rb
154
157
  * /bin/check-vpc-nameservers.rb
155
158
  * /bin/check_vpc_vpn.py
156
159
  * /bin/check_vpc_vpn.rb
@@ -45,6 +45,11 @@ class BeanstalkHealth < Sensu::Plugin::Check::CLI
45
45
  boolean: true,
46
46
  default: true
47
47
 
48
+ option :aws_region,
49
+ short: '-r AWS_REGION',
50
+ long: '--aws-region REGION',
51
+ description: 'Optional parameter to specify AWS Region.'
52
+
48
53
  def env_health
49
54
  @env_health ||= beanstalk_client
50
55
  .describe_environment_health(
@@ -54,7 +59,13 @@ class BeanstalkHealth < Sensu::Plugin::Check::CLI
54
59
  end
55
60
 
56
61
  def beanstalk_client
57
- @beanstalk_client ||= Aws::ElasticBeanstalk::Client.new
62
+ @beanstalk_client ||= if config[:aws_region]
63
+ Aws::ElasticBeanstalk::Client.new(
64
+ region: config[:aws_region]
65
+ )
66
+ else
67
+ Aws::ElasticBeanstalk::Client.new
68
+ end
58
69
  end
59
70
 
60
71
  def instances_health
@@ -78,7 +78,7 @@ class EC2Filter < Sensu::Plugin::Check::CLI
78
78
  option :compare,
79
79
  description: 'Comparision operator for threshold: equal, not, greater, less',
80
80
  short: '-o OPERATION',
81
- long: '--opertor OPERATION',
81
+ long: '--operator OPERATION',
82
82
  default: 'equal'
83
83
 
84
84
  def aws_config
@@ -68,11 +68,20 @@ class CheckEcsServiceHealth < Sensu::Plugin::Check::CLI
68
68
  # List of requested services or all services registered to the cluster
69
69
  def service_list(cluster = 'default', services = nil)
70
70
  return services.split ',' if services
71
- ecs_client.list_services(cluster: cluster)['service_arns']
71
+ collect_services(cluster)
72
+ end
73
+
74
+ def collect_services(cluster = 'default', token: nil)
75
+ response = ecs_client.list_services(cluster: cluster, next_token: token)
76
+ services = response.service_arns
77
+ services.push(*collect_services(cluster, token: response.next_token)) if response.next_token
78
+ services
72
79
  end
73
80
 
74
81
  def service_details(cluster = 'default', services = nil)
75
- ecs_client.describe_services(cluster: cluster, services: service_list(cluster, services))['services']
82
+ service_list(cluster, services).each_slice(10).to_a.map do |s|
83
+ ecs_client.describe_services(cluster: cluster, services: s)['services']
84
+ end.flatten
76
85
  end
77
86
 
78
87
  def bucket_service(running_count, desired_count)
@@ -26,8 +26,6 @@
26
26
  # for details.
27
27
 
28
28
  require 'sensu-plugin/check/cli'
29
- require 'net/http'
30
- require 'uri'
31
29
  require 'aws-sdk-v1'
32
30
 
33
31
  class ELBHealth < Sensu::Plugin::Check::CLI
@@ -54,6 +52,11 @@ class ELBHealth < Sensu::Plugin::Check::CLI
54
52
  long: '--elb-name ELB_NAME',
55
53
  description: 'The Elastic Load Balancer name of which you want to check the health'
56
54
 
55
+ option :instance_tag,
56
+ short: '-t',
57
+ long: '--instance-tag INSTANCE_TAG',
58
+ description: "Specify instance tag to be included in the check output. E.g. 'Name' tag"
59
+
57
60
  option :instances,
58
61
  short: '-i INSTANCES',
59
62
  long: '--instances INSTANCES',
@@ -79,11 +82,21 @@ class ELBHealth < Sensu::Plugin::Check::CLI
79
82
  end
80
83
 
81
84
  def elb
82
- @elb ||= AWS::ELB.new aws_config
85
+ @elb = AWS::ELB.new aws_config
86
+ end
87
+
88
+ def ec2
89
+ @ec2 = AWS::EC2::Client.new aws_config
90
+ end
91
+
92
+ def ec2_regions
93
+ # This is for SDK v2
94
+ # Aws.partition('aws').regions.map(&:name)
95
+
96
+ AWS::EC2.regions.map(&:name)
83
97
  end
84
98
 
85
99
  def elbs
86
- return @elbs if @elbs
87
100
  @elbs = elb.load_balancers.to_a
88
101
  @elbs.select! { |elb| config[:elb_name].include? elb.name } if config[:elb_name]
89
102
  @elbs
@@ -98,7 +111,18 @@ class ELBHealth < Sensu::Plugin::Check::CLI
98
111
  end
99
112
  instance_health_hash.each do |instance_health|
100
113
  if instance_health[:state] != 'InService'
101
- unhealthy_instances[instance_health[:instance].id] = instance_health[:state]
114
+ instance_id = instance_health[:instance].id
115
+ state_message = instance_health[:state]
116
+
117
+ if config[:instance_tag]
118
+ instance = ec2.describe_instances(instance_ids: [instance_id])
119
+ selected_tag = instance[:reservation_index][instance_id][:instances_set][0][:tag_set].select { |tag| tag[:key] == config[:instance_tag] }
120
+ unless selected_tag.empty?
121
+ state_message = "#{selected_tag[0][:value]}::#{instance_health[:state]}"
122
+ end
123
+ end
124
+
125
+ unhealthy_instances[instance_id] = state_message
102
126
  end
103
127
  end
104
128
  if unhealthy_instances.empty?
@@ -109,17 +133,37 @@ class ELBHealth < Sensu::Plugin::Check::CLI
109
133
  end
110
134
 
111
135
  def run
112
- @message = (elbs.size > 1 ? config[:aws_region] + ': ' : '')
136
+ aws_regions = ec2_regions
137
+ @message = ''
113
138
  critical = false
114
- elbs.each do |elb|
115
- result = check_health elb
116
- if result != 'OK'
117
- @message += "#{elb.name} unhealthy => #{result.map { |id, state| '[' + id + '::' + state + ']' }.join(' ')}. "
118
- critical = true
139
+
140
+ unless config[:aws_region].casecmp('all') == 0
141
+ if aws_regions.include? config[:aws_region]
142
+ aws_regions.clear.push(config[:aws_region])
119
143
  else
120
- @message += "#{elb.name} => healthy. "
144
+ critical 'Invalid region specified!'
121
145
  end
122
146
  end
147
+
148
+ aws_regions.each do |r| # Iterate each possible region
149
+ config[:aws_region] = r
150
+ region_critical = false
151
+ @message += (elbs.size > 1 ? config[:aws_region] + ': ' : '')
152
+ elbs.each do |elb|
153
+ result = check_health elb
154
+ if result != 'OK'
155
+ @message += "#{elb.name} unhealthy => #{result.map { |id, state| '[' + id + '::' + state + ']' }.join(' ')}. "
156
+ critical = true
157
+ region_critical = true
158
+ else
159
+ @message += "#{elb.name} => healthy. " unless config[:verbose] == false
160
+ end
161
+ end
162
+ if elbs.size > 1 && config[:verbose] != true && region_critical == false
163
+ @message += 'OK. '
164
+ end
165
+ end
166
+
123
167
  if critical
124
168
  if config[:warn_only]
125
169
  warning @message
@@ -54,6 +54,13 @@ class CheckInstanceEvents < Sensu::Plugin::Check::CLI
54
54
  long: '--use-iam',
55
55
  description: 'Use IAM role authenticiation. Instance must have IAM role assigned for this to work'
56
56
 
57
+ option :instance_id,
58
+ short: '-i INSTANCE_IDS',
59
+ long: '--instances INSTANCES_IDS',
60
+ description: 'Comma separated list of instances ids to check. Defaults to all instances in the region',
61
+ proc: proc { |a| a.split(',') },
62
+ default: []
63
+
57
64
  option :include_name,
58
65
  short: '-n',
59
66
  long: '--include-name',
@@ -66,59 +73,78 @@ class CheckInstanceEvents < Sensu::Plugin::Check::CLI
66
73
  region: config[:aws_region] }
67
74
  end
68
75
 
76
+ def ec2_regions
77
+ # This is for SDK v2
78
+ # Aws.partition('aws').regions.map(&:name)
79
+
80
+ AWS::EC2.regions.map(&:name)
81
+ end
82
+
69
83
  def run
70
84
  event_instances = []
71
85
  aws_config = {}
72
86
 
87
+ aws_regions = ec2_regions
88
+
89
+ unless config[:aws_region].casecmp('all') == 0
90
+ if aws_regions.include? config[:aws_region]
91
+ aws_regions.clear.push(config[:aws_region])
92
+ else
93
+ critical 'Invalid region specified!'
94
+ end
95
+ end
96
+
73
97
  if config[:use_iam_role].nil?
74
98
  aws_config[:access_key_id] = config[:aws_access_key]
75
99
  aws_config[:secret_access_key] = config[:aws_secret_access_key]
76
100
  end
77
101
 
78
- ec2 = AWS::EC2::Client.new(aws_config.merge!(region: config[:aws_region]))
79
- begin
80
- ec2.describe_instance_status[:instance_status_set].each do |i|
81
- next if i[:events_set].empty?
82
-
83
- # Exclude completed reboots since the events API appearently returns these even after they have been completed:
84
- # Example:
85
- # "events_set": [
86
- # {
87
- # "code": "system-reboot",
88
- # "description": "[Completed] Scheduled reboot",
89
- # "not_before": "2015-01-05 12:00:00 UTC",
90
- # "not_after": "2015-01-05 18:00:00 UTC"
91
- # }
92
- # ]
93
- useful_events =
94
- i[:events_set].reject { |x| (x[:code] == 'system-reboot' || x[:code] == 'instance-stop' || x[:code] == 'system-maintenance') && (x[:description] =~ /\[Completed\]/ || x[:description] =~ /\[Canceled\]/) }
95
- unless useful_events.empty?
96
- event_instances << i[:instance_id]
102
+ aws_regions.each do |r| # Iterate each possible region
103
+ ec2 = AWS::EC2::Client.new(aws_config.merge!(region: r))
104
+ begin
105
+ describe_instance_options = {}
106
+ if config[:instance_id].any?
107
+ describe_instance_options = describe_instance_options.merge(instance_ids: config[:instance_id])
97
108
  end
98
- end
99
- rescue => e
100
- unknown "An error occurred processing AWS EC2 API: #{e.message}"
101
- end
102
109
 
103
- if config[:include_name]
104
- event_instances_with_names = []
105
- event_instances.each do |id|
106
- name = ''
107
- begin
108
- instance = ec2.describe_instances(instance_ids: [id])
109
- # Harvests the 'Name' tag for the instance
110
- name = instance[:reservation_index][id][:instances_set][0][:tag_set].select { |tag| tag[:key] == 'Name' }[0][:value]
111
- rescue => e
112
- puts "Issue getting instance details for #{id}. Exception = #{e}"
110
+ ec2.describe_instance_status(describe_instance_options)[:instance_status_set].each do |i|
111
+ next if i[:events_set].empty?
112
+
113
+ # Exclude completed reboots since the events API appearently returns these even after they have been completed:
114
+ # Example:
115
+ # "events_set": [
116
+ # {
117
+ # "code": "system-reboot",
118
+ # "description": "[Completed] Scheduled reboot",
119
+ # "not_before": "2015-01-05 12:00:00 UTC",
120
+ # "not_after": "2015-01-05 18:00:00 UTC"
121
+ # }
122
+ # ]
123
+ useful_events =
124
+ i[:events_set].reject { |x| (x[:code] =~ /system-reboot|instance-stop|system-maintenance/) && (x[:description] =~ /\[Completed\]|\[Canceled\]/) }
125
+
126
+ unless useful_events.empty?
127
+ if config[:include_name]
128
+ name = ''
129
+ begin
130
+ instance_desc = ec2.describe_instances(instance_ids: [i[:instance_id]])
131
+ name = instance_desc[:reservation_index][i[:instance_id]][:instances_set][0][:tag_set].select { |tag| tag[:key] == 'Name' }[0][:value]
132
+ rescue => e
133
+ puts "Issue getting instance details for #{i[:instance_id]} (#{r}). Exception = #{e}"
134
+ end
135
+ event_instances << "#{name} (#{i[:instance_id]} #{r}) (#{i[:events_set][0][:code]}) #{i[:events_set][0][:description]}"
136
+ else
137
+ event_instances << "#{i[:instance_id]} (#{r}) (#{i[:events_set][0][:code]}) #{i[:events_set][0][:description]}"
138
+ end
139
+ end
113
140
  end
114
- # Pushes 'name(i-xxx)' if the Name tag was found, else it just pushes the id
115
- event_instances_with_names << (name == '' ? id : "#{name}(#{id})")
141
+ rescue => e
142
+ unknown "An error occurred processing AWS EC2 API (#{r}): #{e.message}"
116
143
  end
117
- event_instances = event_instances_with_names
118
144
  end
119
145
 
120
146
  if event_instances.count > 0
121
- critical("#{event_instances.count} instances #{event_instances.count > 1 ? 'have' : 'has'} upcoming scheduled events: #{event_instances.join(',')}")
147
+ critical("#{event_instances.count} instance#{event_instances.count > 1 ? 's have' : ' has'} upcoming scheduled events: #{event_instances.join(',')}")
122
148
  else
123
149
  ok
124
150
  end
@@ -73,6 +73,13 @@ class CheckRDSEvents < Sensu::Plugin::Check::CLI
73
73
  region: config[:aws_region] }
74
74
  end
75
75
 
76
+ def rds_regions
77
+ # This is for SDK v2
78
+ # Aws.partition('aws').regions.map(&:name)
79
+
80
+ AWS::RDS.regions.map(&:name)
81
+ end
82
+
76
83
  def run
77
84
  clusters = maint_clusters
78
85
  if clusters.empty?
@@ -83,44 +90,56 @@ class CheckRDSEvents < Sensu::Plugin::Check::CLI
83
90
  end
84
91
 
85
92
  def maint_clusters
86
- rds = AWS::RDS::Client.new aws_config
93
+ maint_clusters = []
94
+ aws_regions = rds_regions
87
95
 
88
- begin
89
- if !config[:db_instance_id].nil? && !config[:db_instance_id].empty?
90
- db_instance = rds.describe_db_instances(db_instance_identifier: config[:db_instance_id])
91
- if db_instance.nil? || db_instance.empty?
92
- unknown "#{config[:db_instance_id]} instance not found"
93
- else
94
- clusters = [config[:db_instance_id]]
95
- end
96
+ unless config[:aws_region].casecmp('all') == 0
97
+ if aws_regions.include? config[:aws_region]
98
+ aws_regions.clear.push(config[:aws_region])
96
99
  else
97
- # fetch all clusters identifiers
98
- clusters = rds.describe_db_instances[:db_instances].map { |db| db[:db_instance_identifier] }
100
+ critical 'Invalid region specified!'
99
101
  end
102
+ end
100
103
 
101
- maint_clusters = []
104
+ aws_regions.each do |r|
105
+ rds = AWS::RDS::Client.new aws_config.merge!(region: r)
102
106
 
103
- # fetch the last 15 minutes of events for each cluster
104
- # that way, we're only spammed with persistent notifications that we'd care about.
105
- clusters.each do |cluster_name|
106
- events_record = rds.describe_events(start_time: (Time.now - 900).iso8601, source_type: 'db-instance', source_identifier: cluster_name)
107
- next if events_record[:events].empty?
107
+ begin
108
+ if !config[:db_instance_id].nil? && !config[:db_instance_id].empty?
109
+ db_instance = rds.describe_db_instances(db_instance_identifier: config[:db_instance_id])
110
+ if db_instance.nil? || db_instance.empty?
111
+ unknown "#{config[:db_instance_id]} instance not found"
112
+ else
113
+ clusters = [config[:db_instance_id]]
114
+ end
115
+ else
116
+ # fetch all clusters identifiers
117
+ clusters = rds.describe_db_instances[:db_instances].map { |db| db[:db_instance_identifier] }
118
+ end
108
119
 
109
- # we will need to filter out non-disruptive/basic operation events.
110
- # ie. the regular backup operations
111
- next if events_record[:events][-1][:message] =~ /Backing up DB instance|Finished DB Instance backup|Restored from snapshot/
112
- # ie. Replication resumed
113
- next if events_record[:events][-1][:message] =~ /Replication for the Read Replica resumed/
114
- # you can add more filters to skip more events.
120
+ # fetch the last 15 minutes of events for each cluster
121
+ # that way, we're only spammed with persistent notifications that we'd care about.
122
+ clusters.each do |cluster_name|
123
+ events_record = rds.describe_events(start_time: (Time.now - 900).iso8601, source_type: 'db-instance', source_identifier: cluster_name)
124
+ next if events_record[:events].empty?
115
125
 
116
- # draft the messages
117
- cluster_name_long = "#{cluster_name} (#{aws_config[:region]}) #{events_record[:events][-1][:message]}"
118
- maint_clusters.push(cluster_name_long)
119
- end
126
+ # we will need to filter out non-disruptive/basic operation events.
127
+ # ie. the regular backup operations
128
+ next if events_record[:events][-1][:message] =~ /Backing up DB instance|Finished DB Instance backup|Restored from snapshot/
129
+ # ie. Replication resumed
130
+ next if events_record[:events][-1][:message] =~ /Replication for the Read Replica resumed/
131
+ # you can add more filters to skip more events.
132
+
133
+ # draft the messages
134
+ cluster_name_long = "#{cluster_name} (#{r}) #{events_record[:events][-1][:message]}"
135
+ maint_clusters.push(cluster_name_long)
136
+ end
120
137
 
121
- rescue => e
122
- unknown "An error occurred processing AWS RDS API: #{e.message}"
138
+ rescue => e
139
+ unknown "An error occurred processing AWS RDS API (#{r}): #{e.message}"
140
+ end
123
141
  end
142
+
124
143
  maint_clusters
125
144
  end
126
145
  end
@@ -1,13 +1,10 @@
1
1
  #! /usr/bin/env ruby
2
2
  #
3
- # check-rds-events
3
+ # check-rds-pending
4
4
  #
5
5
  #
6
6
  # DESCRIPTION:
7
- # This plugin checks rds clusters for critical events.
8
- # Due to the number of events types on RDS clusters the check searches for
9
- # events containing the text string 'has started' or 'is being'. These events all have
10
- # accompanying completiion events and are impacting events
7
+ # This plugin checks rds clusters for pending maintenance action.
11
8
  #
12
9
  # OUTPUT:
13
10
  # plain-text
@@ -20,7 +17,7 @@
20
17
  # gem: sensu-plugin
21
18
  #
22
19
  # USAGE:
23
- # ./check-rds-events.rb -r ${you_region}
20
+ # ./check-rds-pending.rb -r ${you_region}
24
21
  #
25
22
  # NOTES:
26
23
  #
@@ -31,6 +28,7 @@
31
28
  #
32
29
 
33
30
  require 'sensu-plugin/check/cli'
31
+ require 'sensu-plugins-aws'
34
32
  require 'aws-sdk'
35
33
 
36
34
  class CheckRDSEvents < Sensu::Plugin::Check::CLI
@@ -70,6 +70,11 @@ class CheckRDS < Sensu::Plugin::Check::CLI
70
70
  description: "AWS Secret Access Key. Either set ENV['AWS_SECRET_KEY'] or provide it as an option",
71
71
  default: ENV['AWS_SECRET_KEY']
72
72
 
73
+ option :role_arn,
74
+ long: '--role-arn ROLE_ARN',
75
+ description: 'AWS role arn of the role of the third party account to switch to',
76
+ default: false
77
+
73
78
  option :aws_region,
74
79
  short: '-r AWS_REGION',
75
80
  long: '--aws-region REGION',
@@ -127,12 +132,20 @@ class CheckRDS < Sensu::Plugin::Check::CLI
127
132
  region: config[:aws_region] }
128
133
  end
129
134
 
135
+ def role_credentials
136
+ @role_credentials = Aws::AssumeRoleCredentials.new(
137
+ client: Aws::STS::Client.new(aws_config),
138
+ role_arn: config[:role_arn],
139
+ role_session_name: "role@#{Time.now.to_i}"
140
+ )
141
+ end
142
+
130
143
  def rds
131
- @rds ||= Aws::RDS::Client.new aws_config
144
+ @rds ||= config[:role_arn] ? Aws::RDS::Client.new(credentials: role_credentials, region: aws_config[:region]) : Aws::RDS::Client.new(aws_config)
132
145
  end
133
146
 
134
147
  def cloud_watch
135
- @cloud_watch ||= Aws::CloudWatch::Client.new aws_config
148
+ @cloud_watch ||= config[:role_arn] ? Aws::CloudWatch::Client.new(credentials: role_credentials, region: aws_config[:region]) : Aws::CloudWatch::Client.new(aws_config)
136
149
  end
137
150
 
138
151
  def find_db_instance(id)
@@ -33,7 +33,7 @@
33
33
  require 'sensu-plugins-aws'
34
34
  require 'sensu-plugin/check/cli'
35
35
  require 'aws-sdk'
36
- require 'net/http'
36
+ require 'rest-client'
37
37
  require 'json'
38
38
 
39
39
  class CheckSensuClient < Sensu::Plugin::Check::CLI
@@ -51,6 +51,12 @@ class CheckSensuClient < Sensu::Plugin::Check::CLI
51
51
  description: 'Sensu host to query',
52
52
  default: 'sensu'
53
53
 
54
+ option :insecure,
55
+ short: '-k',
56
+ boolean: true,
57
+ description: 'Enabling insecure connections',
58
+ default: false
59
+
54
60
  option :sensu_port,
55
61
  short: '-p SENSU_PORT',
56
62
  long: '--port SENSU_PORT',
@@ -97,7 +103,7 @@ class CheckSensuClient < Sensu::Plugin::Check::CLI
97
103
  end.reduce(:merge)
98
104
  filter_list.delete(nil)
99
105
  filter_list.each { |x, y| filter_list[x] = y.strip.gsub(/[\[\]]/, '') }
100
- client = Aws::EC2::Client.new aws_config
106
+ client = Aws::EC2::Client.new
101
107
 
102
108
  parsed_filter = Filter.parse(config[:filter])
103
109
 
@@ -162,8 +168,11 @@ class CheckSensuClient < Sensu::Plugin::Check::CLI
162
168
  end
163
169
 
164
170
  def client_check
165
- uri = URI("http://#{config[:sensu_host]}:#{config[:sensu_port]}/clients")
166
- response = JSON.parse(Net::HTTP.get(uri))
171
+ verify_mode = OpenSSL::SSL::VERIFY_PEER
172
+ verify_mode = OpenSSL::SSL::VERIFY_NONE if config[:insecure]
173
+ request = RestClient::Resource.new("#{config[:sensu_host]}:#{config[:sensu_port]}/clients",
174
+ verify_ssl: verify_mode)
175
+ response = JSON.parse(request.get)
167
176
 
168
177
  clients = Set.new
169
178
  response.each do |client|
@@ -0,0 +1,229 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # check-subnet-ip-consumption
4
+ #
5
+ #
6
+ # DESCRIPTION:
7
+ # This plugin uses the EC2 API to determine if any subnet in a given region
8
+ # has consumed IP addresses such that the consumption exceeds a user-specified threshold.
9
+ # This plugin additionally uses the IAM API to resolve the account alias,
10
+ # if the user uses the -s/--show-account-alias flag.
11
+ #
12
+ # OUTPUT:
13
+ # plain-text
14
+ #
15
+ # PLATFORMS:
16
+ # Linux
17
+ #
18
+ # DEPENDENCIES:
19
+ # gem: aws-sdk
20
+ # gem: sensu-plugin
21
+ # gem: sensu-plugins-aws
22
+ #
23
+ # USAGE:
24
+ # ./check-subnet-ip-consumption.rb -a <access key> -k <secret key> -r <region> -t <integer percentage>
25
+ #
26
+ # NOTES:
27
+ # Special thanks to Garrett Kuchta and Antonio Beyah for their assistance.
28
+ #
29
+ # LICENSE:
30
+ # Nick Jacques <Nick.Jacques@target.com>
31
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
32
+ # for details.
33
+
34
+ require 'sensu-plugin/check/cli'
35
+ require 'sensu-plugins-aws'
36
+ require 'aws-sdk'
37
+
38
+ class CheckSubnetIpConsumption < Sensu::Plugin::Check::CLI
39
+ include Common
40
+
41
+ option :aws_region,
42
+ short: '-r AWS_REGION',
43
+ long: '--aws-region REGION',
44
+ description: 'AWS Region (defaults to us-east-1).',
45
+ default: 'us-east-1'
46
+
47
+ option :alert_threshold,
48
+ short: '-t <threshold percentage>',
49
+ long: '--threshold <threshold percentage>',
50
+ proc: proc { |a| a.to_i },
51
+ default: 85,
52
+ in: (0..100).to_a,
53
+ description: 'Threshold (in percent) of consumed IP addresses (per subnet) to alert on'
54
+
55
+ option :show_friendly_names,
56
+ short: '-f',
57
+ long: '--show-friendly-names',
58
+ boolean: true,
59
+ default: false,
60
+ description: 'Show friendly names (using the Name tag) for AWS objects such as subnets or VPCs'
61
+
62
+ option :show_account_alias,
63
+ short: '-s',
64
+ long: '--show-account-alias',
65
+ boolean: true,
66
+ default: false,
67
+ description: 'Show the account alias in the alert output. Requires IAM read privileges.'
68
+
69
+ option :verbosity,
70
+ short: '-v <level>',
71
+ long: '--verbosity <level>',
72
+ proc: proc { |a| a.to_i },
73
+ in: (0..2).to_a,
74
+ default: 0,
75
+ description: 'Manipulate the verbosity of the alert output. Valid options are 0, 1, and 2 (from least to most verbose). Default is 0.'
76
+
77
+ def iam_client
78
+ @iam_client ||= Aws::IAM::Client.new
79
+ end
80
+
81
+ def ec2_client
82
+ @ec2_client ||= Aws::EC2::Client.new
83
+ end
84
+
85
+ # Returns the alias of the AWS account (if there is one), "<no name>" (if there is not), or nil if -s/--show-account-alias is not used.
86
+ def account_alias
87
+ # Do not execute IAM API call unless the -s/--show_account_alias flag is specified
88
+ # (to prevent excess API calls *and* errors if IAM rights are not allowed)
89
+ return nil unless config[:show_account_alias]
90
+
91
+ begin
92
+ iam_account_alias = iam_client.list_account_aliases[:account_aliases].first
93
+
94
+ return '<no alias>' if iam_account_alias.empty? || iam_account_alias.nil?
95
+ return iam_account_alias
96
+ rescue => e
97
+ unknown "An error occured while using AWS IAM to collect the account alias: #{e.message}"
98
+ end
99
+ end
100
+
101
+ # Returns the value of the Name tag (if there is one) or "<no name>" (if there is not). Used with VPC and subnet objects.
102
+ def extract_name_tag(tags)
103
+ # Find the 'Name' key in the tags object and extract it. If the key isn't found, we get nil instead.
104
+ name_tag = tags.find { |tag| tag.key == 'Name' }
105
+ # If extracting the key/value was successful...
106
+ if name_tag
107
+ # ...extract the value (if there is one), or return <no name>
108
+ !name_tag[:value].empty? ? name_tag[:value] : '<no name>'
109
+ else
110
+ # Otherwise, there's not a Name key, and thus the object has no name.
111
+ '<no name>'
112
+ end
113
+ end
114
+
115
+ # Returns the subnet's friendly name if -f/--show-friendly-names is used, otherwise returns the ID
116
+ def display_subnet(alert)
117
+ return alert[:subnet_name] if config[:show_friendly_names]
118
+ alert[:subnet_id]
119
+ end
120
+
121
+ # Returns the VPC's friendly name if -f/--show-friendly-names is used, otherwise returns the ID
122
+ def display_vpc(alert)
123
+ return alert[:vpc_friendly_name] if config[:show_friendly_names]
124
+ alert[:subnet_vpc_id]
125
+ end
126
+
127
+ def run
128
+ # Subnets that meet the threshold criteria will store info hashes in this array
129
+ consumption_alert = []
130
+
131
+ begin
132
+ subnets = ec2_client.describe_subnets[:subnets]
133
+
134
+ subnets.each do |subnet|
135
+ # subnet.cidr_block contains '0.0.0.0/0' notation. We want the mask number after the slash.
136
+ subnet_netblock = subnet.cidr_block.split('/')[1].to_i
137
+ # Subtract the mask number from 32 and use the result as the exponent of 2 to get the number of possible addresses in the netblock.
138
+ # Then, subtract 5 from that number. Rationale: http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_Subnets.html#VPC_Sizing
139
+ # AWS reserves the first four addresses and the last address in any netblock.
140
+ subnet_total_capacity = (2**(32 - subnet_netblock)) - 5
141
+ # Determine how many IP addresses have been consumed
142
+ subnet_consumed_capacity = (subnet_total_capacity - subnet.available_ip_address_count)
143
+ # Divide consumed IPs by total IPs to get percentage. Multiply by 100 and round to get integer percents.
144
+ subnet_consumed_pct = ((subnet_consumed_capacity.to_f / subnet_total_capacity.to_f) * 100).round(0)
145
+
146
+ # Get the subnet's friendly name
147
+ subnet_name_tag = extract_name_tag subnet[:tags]
148
+ # Only get the VPC friendly names if explicitly asked for (otherwise this is a useless API hit)
149
+ if config[:show_friendly_names]
150
+ vpc = ec2_client.describe_vpcs(vpc_ids: [subnet.vpc_id])[:vpcs].first
151
+ vpc_friendly_name = extract_name_tag vpc[:tags]
152
+ end
153
+
154
+ # Test if the subnet consumption % meets or exceeds the threshold %
155
+ if subnet_consumed_pct >= config[:alert_threshold]
156
+ # Add a hash containing subnet info to the consumption_alert array
157
+ consumption_alert.push(subnet_id: subnet.subnet_id,
158
+ subnet_name: subnet_name_tag,
159
+ subnet_consumed_pct: subnet_consumed_pct,
160
+ subnet_vpc_id: subnet.vpc_id,
161
+ subnet_consumed_capacity: subnet_consumed_capacity,
162
+ subnet_total_capacity: subnet_total_capacity,
163
+ subnet_az: subnet[:availability_zone],
164
+ cidr_block: subnet[:cidr_block],
165
+ vpc_friendly_name: vpc_friendly_name)
166
+ end
167
+ end
168
+ rescue => e
169
+ unknown "An error occurred processing AWS EC2: #{e.message}"
170
+ end
171
+
172
+ # Process any alerts that might've been generated.
173
+ if consumption_alert.empty?
174
+ ok
175
+ else
176
+ # Compose alert messages at the configured verbosity
177
+ alert_msg = []
178
+
179
+ verbosity0 = '%{subnet} at %{percent}%% [%{vpc}]'
180
+ verbosity1 = '%{subnet} at %{percent}%% (%{consumed}/%{total}) [%{vpc}]'
181
+ verbosity2 = '%{subnet} (%{cidr} in %{az}) at %{percent}%% (%{consumed}/%{total}) [%{vpc}]'
182
+
183
+ case config[:verbosity]
184
+ when 0
185
+ consumption_alert.each do |alert|
186
+ alert_msg.push(verbosity0 % { subnet: (display_subnet alert).to_s,
187
+ percent: alert[:subnet_consumed_pct],
188
+ vpc: (display_vpc alert).to_s })
189
+ end
190
+ when 1
191
+ consumption_alert.each do |alert|
192
+ alert_msg.push(verbosity1 % { subnet: (display_subnet alert).to_s,
193
+ percent: alert[:subnet_consumed_pct],
194
+ consumed: alert[:subnet_consumed_capacity],
195
+ total: alert[:subnet_total_capacity],
196
+ vpc: (display_vpc alert).to_s })
197
+ end
198
+ when 2
199
+ consumption_alert.each do |alert|
200
+ alert_msg.push(verbosity2 % { subnet: (display_subnet alert).to_s,
201
+ cidr: alert[:cidr_block],
202
+ az: alert[:subnet_az],
203
+ percent: alert[:subnet_consumed_pct],
204
+ consumed: alert[:subnet_consumed_capacity],
205
+ total: alert[:subnet_total_capacity],
206
+ vpc: (display_vpc alert).to_s })
207
+ end
208
+ end
209
+
210
+ # Throw critical alert with optional account alias display
211
+ alert_prefix = '%{count} subnets in %{region} exceeding %{threshold}%% IP consumption threshold: %{alerts}'
212
+ alert_prefix_with_alias = '%{count} subnets in %{alias} (%{region}) exceeding %{threshold}%% IP consumption threshold: %{alerts}'
213
+
214
+ case config[:show_account_alias]
215
+ when true
216
+ critical(alert_prefix_with_alias % { count: alert_msg.length,
217
+ alias: account_alias,
218
+ region: config[:aws_region],
219
+ threshold: config[:alert_threshold],
220
+ alerts: alert_msg.join(', ') })
221
+ when false
222
+ critical(alert_prefix % { count: alert_msg.length,
223
+ region: config[:aws_region],
224
+ threshold: config[:alert_threshold],
225
+ alerts: alert_msg.join(', ') })
226
+ end
227
+ end
228
+ end
229
+ end
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
3
  # CHANGELOG:
4
+ # * 0.8.0:
5
+ # - Added support to use ec2_region from client definition
4
6
  # * 0.7.0:
5
7
  # - Added method instance_id to check in client config section
6
- # ['client']['aws']['instance_id'] first.
7
- # - Update to new API event naming and simplifying ec2_node_should_be_deleted method and fixing
8
+ # - Update to new API event naming and simplifying ec2_node_should_be_deleted method and fixing
8
9
  # match that will work with any user state defined.
9
10
  # * 0.6.0:
10
11
  # - Fixed ec2_node_should_be_deleted to account for an empty insances array
@@ -61,7 +62,28 @@
61
62
  # handler to suit your needs.
62
63
  #
63
64
  #
64
- # Optional a Sensu configuration snippet:
65
+ # A Sensu Client configuration using the ec2_region attribute:
66
+ # {
67
+ # "client": {
68
+ # "name": "i-424242",
69
+ # "address": "127.0.0.1",
70
+ # "ec2_region": "eu-west-1",
71
+ # "subscriptions": ["all"]
72
+ # }
73
+ # }
74
+ # or embeded in the ec2 block
75
+ # {
76
+ # "client": {
77
+ # "name": "i-424242",
78
+ # "address": "127.0.0.1",
79
+ # "ec2" : {
80
+ # "region": "eu-west-1"
81
+ # },
82
+ # "subscriptions": ["all"]
83
+ # }
84
+ # }
85
+ #
86
+ # Or a Sensu Server configuration snippet:
65
87
  # {
66
88
  # "aws": {
67
89
  # "access_key": "adsafdafda",
@@ -78,7 +100,7 @@
78
100
  # If none of the settings are found it will then attempt to
79
101
  # generate temporary credentials from the IAM instance profile
80
102
  #
81
- # If region is not specified in either of the above 2 mechanisms
103
+ # If region is not specified in either of the above 3 mechanisms
82
104
  # we will make a request for the EC2 instances current region.
83
105
  #
84
106
  # To use, you can set it as the keepalive handler for a client:
@@ -153,14 +175,6 @@ class Ec2Node < Sensu::Handler
153
175
  end
154
176
 
155
177
  def instance_id
156
- if @event['client'].key?('aws') && @event['client']['aws'].key?('instance_id')
157
- @event['client']['aws']['instance_id']
158
- else
159
- @event['client']['name']
160
- end
161
- end
162
-
163
- def instance_name
164
178
  @event['client']['name']
165
179
  end
166
180
 
@@ -198,7 +212,9 @@ class Ec2Node < Sensu::Handler
198
212
  def region
199
213
  @region ||= begin
200
214
  region_check = ENV['EC2_REGION']
201
- region_check = settings['aws']['region'] if settings.key? 'aws'
215
+ region_check = settings['aws']['region'] if settings.key?('aws')
216
+ region_check = @event['client']['ec2_region'] if @event['client'].key?('ec2_region')
217
+ region_check = @event['client']['ec2']['region'] if @event['client'].key?('ec2') && @event['client']['ec2'].key?('region')
202
218
  if region_check.nil? || region_check.empty?
203
219
  region_check = Net::HTTP.get(URI('http://169.254.169.254/latest/meta-data/placement/availability-zone'))
204
220
  matches = /(\w+\-\w+\-\d+)/.match(region_check)
@@ -74,7 +74,7 @@ class EMRStepMetrics < Sensu::Plugin::Metric::CLI::Graphite
74
74
  STATUS.each_entry { |status| data[status] = 0 }
75
75
  cluster_steps(emr, cluster.id, data)
76
76
  safe_name = config[:cluster_name].tr(' ', '_')
77
- output config[:scheme] + '.' + safe_name + '.id.' + cluster_id
77
+ output config[:scheme] + '.' + safe_name + '.id.' + cluster.id
78
78
  STATUS.each_entry { |status| output config[:scheme] + '.' + safe_name + '.step.' + status, data[status] }
79
79
  end
80
80
  ok
@@ -74,7 +74,14 @@ class SQSMetrics < Sensu::Plugin::Metric::CLI::Graphite
74
74
  end
75
75
 
76
76
  def scheme(queue_name)
77
- "aws.sqs.queue.#{queue_name.tr('-', '_')}.message_count"
77
+ scheme = config[:scheme].empty? ? 'aws.sqs.queue' : config[:scheme]
78
+ "#{scheme}.#{queue_name.tr('-', '_')}.message_count"
79
+ end
80
+
81
+ def record_queue_metrics(q_name, q)
82
+ output scheme(q_name), q.approximate_number_of_messages
83
+ output "#{scheme(q_name)}.delayed", q.approximate_number_of_messages_delayed
84
+ output "#{scheme(q_name)}.not_visible", q.approximate_number_of_messages_not_visible
78
85
  end
79
86
 
80
87
  def run
@@ -86,18 +93,10 @@ class SQSMetrics < Sensu::Plugin::Metric::CLI::Graphite
86
93
  critical 'Error, either QUEUE or PREFIX must be specified'
87
94
  end
88
95
 
89
- scheme = if config[:scheme] == ''
90
- scheme config[:queue]
91
- else
92
- config[:scheme]
93
- end
94
-
95
- messages = sqs.queues.named(config[:queue]).approximate_number_of_messages
96
- output scheme, messages
96
+ record_queue_metrics(config[:queue], sqs.queues.named(config[:queue]))
97
97
  else
98
98
  sqs.queues.with_prefix(config[:prefix]).each do |q|
99
- queue_name = q.arn.split(':').last
100
- output scheme(queue_name), q.approximate_number_of_messages
99
+ record_queue_metrics(q.arn.split(':').last, q)
101
100
  end
102
101
  end
103
102
  rescue => e
@@ -27,6 +27,6 @@ module Common
27
27
 
28
28
  Aws.config.update(
29
29
  region: config[:aws_region]
30
- )
30
+ ) if config.key?(:aws_region)
31
31
  end
32
32
  end
@@ -1,7 +1,7 @@
1
1
  module SensuPluginsAWS
2
2
  module Version
3
3
  MAJOR = 3
4
- MINOR = 1
4
+ MINOR = 2
5
5
  PATCH = 0
6
6
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
7
7
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-aws
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.0
4
+ version: 3.2.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: 2016-05-15 00:00:00.000000000 Z
11
+ date: 2016-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: 2.2.28
19
+ version: '2.3'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: 2.2.28
26
+ version: '2.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: aws-sdk-v1
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -70,16 +70,16 @@ dependencies:
70
70
  name: sensu-plugin
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ~>
73
+ - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '1.2'
75
+ version: '1.3'
76
76
  type: :runtime
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ~>
80
+ - - "~>"
81
81
  - !ruby/object:Gem::Version
82
- version: '1.2'
82
+ version: '1.3'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: erubis
85
85
  requirement: !ruby/object:Gem::Requirement
@@ -94,138 +94,153 @@ dependencies:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
96
  version: 2.7.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: rest-client
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 1.8.0
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 1.8.0
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: bundler
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ~>
115
+ - - "~>"
102
116
  - !ruby/object:Gem::Version
103
117
  version: '1.7'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ~>
122
+ - - "~>"
109
123
  - !ruby/object:Gem::Version
110
124
  version: '1.7'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: codeclimate-test-reporter
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
- - - ~>
129
+ - - "~>"
116
130
  - !ruby/object:Gem::Version
117
131
  version: '0.4'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
- - - ~>
136
+ - - "~>"
123
137
  - !ruby/object:Gem::Version
124
138
  version: '0.4'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: github-markup
127
141
  requirement: !ruby/object:Gem::Requirement
128
142
  requirements:
129
- - - ~>
143
+ - - "~>"
130
144
  - !ruby/object:Gem::Version
131
145
  version: '1.3'
132
146
  type: :development
133
147
  prerelease: false
134
148
  version_requirements: !ruby/object:Gem::Requirement
135
149
  requirements:
136
- - - ~>
150
+ - - "~>"
137
151
  - !ruby/object:Gem::Version
138
152
  version: '1.3'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: pry
141
155
  requirement: !ruby/object:Gem::Requirement
142
156
  requirements:
143
- - - ~>
157
+ - - "~>"
144
158
  - !ruby/object:Gem::Version
145
159
  version: '0.10'
146
160
  type: :development
147
161
  prerelease: false
148
162
  version_requirements: !ruby/object:Gem::Requirement
149
163
  requirements:
150
- - - ~>
164
+ - - "~>"
151
165
  - !ruby/object:Gem::Version
152
166
  version: '0.10'
153
167
  - !ruby/object:Gem::Dependency
154
168
  name: rake
155
169
  requirement: !ruby/object:Gem::Requirement
156
170
  requirements:
157
- - - ~>
171
+ - - "~>"
158
172
  - !ruby/object:Gem::Version
159
173
  version: '10.5'
160
174
  type: :development
161
175
  prerelease: false
162
176
  version_requirements: !ruby/object:Gem::Requirement
163
177
  requirements:
164
- - - ~>
178
+ - - "~>"
165
179
  - !ruby/object:Gem::Version
166
180
  version: '10.5'
167
181
  - !ruby/object:Gem::Dependency
168
182
  name: redcarpet
169
183
  requirement: !ruby/object:Gem::Requirement
170
184
  requirements:
171
- - - ~>
185
+ - - "~>"
172
186
  - !ruby/object:Gem::Version
173
187
  version: '3.2'
174
188
  type: :development
175
189
  prerelease: false
176
190
  version_requirements: !ruby/object:Gem::Requirement
177
191
  requirements:
178
- - - ~>
192
+ - - "~>"
179
193
  - !ruby/object:Gem::Version
180
194
  version: '3.2'
181
195
  - !ruby/object:Gem::Dependency
182
196
  name: rubocop
183
197
  requirement: !ruby/object:Gem::Requirement
184
198
  requirements:
185
- - - ~>
199
+ - - "~>"
186
200
  - !ruby/object:Gem::Version
187
201
  version: 0.40.0
188
202
  type: :development
189
203
  prerelease: false
190
204
  version_requirements: !ruby/object:Gem::Requirement
191
205
  requirements:
192
- - - ~>
206
+ - - "~>"
193
207
  - !ruby/object:Gem::Version
194
208
  version: 0.40.0
195
209
  - !ruby/object:Gem::Dependency
196
210
  name: rspec
197
211
  requirement: !ruby/object:Gem::Requirement
198
212
  requirements:
199
- - - ~>
213
+ - - "~>"
200
214
  - !ruby/object:Gem::Version
201
215
  version: '3.4'
202
216
  type: :development
203
217
  prerelease: false
204
218
  version_requirements: !ruby/object:Gem::Requirement
205
219
  requirements:
206
- - - ~>
220
+ - - "~>"
207
221
  - !ruby/object:Gem::Version
208
222
  version: '3.4'
209
223
  - !ruby/object:Gem::Dependency
210
224
  name: yard
211
225
  requirement: !ruby/object:Gem::Requirement
212
226
  requirements:
213
- - - ~>
227
+ - - "~>"
214
228
  - !ruby/object:Gem::Version
215
229
  version: '0.8'
216
230
  type: :development
217
231
  prerelease: false
218
232
  version_requirements: !ruby/object:Gem::Requirement
219
233
  requirements:
220
- - - ~>
234
+ - - "~>"
221
235
  - !ruby/object:Gem::Version
222
236
  version: '0.8'
223
- description: ! "This plugin provides native AWS instrumentation\n for
224
- monitoring and metrics collection, including:\n health
225
- and metrics for various AWS services, such\n as EC2,
226
- RDS, ELB, and more, as well as handlers\n for EC2,
227
- SES, and SNS."
228
- email: <sensu-users@googlegroups.com>
237
+ description: |-
238
+ This plugin provides native AWS instrumentation
239
+ for monitoring and metrics collection, including:
240
+ health and metrics for various AWS services, such
241
+ as EC2, RDS, ELB, and more, as well as handlers
242
+ for EC2, SES, and SNS.
243
+ email: "<sensu-users@googlegroups.com>"
229
244
  executables:
230
245
  - check-autoscaling-cpucredits.rb
231
246
  - check-beanstalk-elb-metric.rb
@@ -270,6 +285,7 @@ executables:
270
285
  - check-ses-statistics.rb
271
286
  - check-sns-subscriptions.rb
272
287
  - check-sqs-messages.rb
288
+ - check-subnet-ip-consumption.rb
273
289
  - check-trustedadvisor-service-limits.rb
274
290
  - check-vpc-nameservers.rb
275
291
  - check-vpc-vpn.rb
@@ -336,6 +352,7 @@ files:
336
352
  - bin/check-ses-statistics.rb
337
353
  - bin/check-sns-subscriptions.rb
338
354
  - bin/check-sqs-messages.rb
355
+ - bin/check-subnet-ip-consumption.rb
339
356
  - bin/check-trustedadvisor-service-limits.rb
340
357
  - bin/check-vpc-nameservers.rb
341
358
  - bin/check-vpc-vpn.rb
@@ -375,17 +392,17 @@ require_paths:
375
392
  - lib
376
393
  required_ruby_version: !ruby/object:Gem::Requirement
377
394
  requirements:
378
- - - ! '>='
395
+ - - ">="
379
396
  - !ruby/object:Gem::Version
380
397
  version: 2.1.0
381
398
  required_rubygems_version: !ruby/object:Gem::Requirement
382
399
  requirements:
383
- - - ! '>='
400
+ - - ">="
384
401
  - !ruby/object:Gem::Version
385
402
  version: '0'
386
403
  requirements: []
387
404
  rubyforge_project:
388
- rubygems_version: 2.4.5
405
+ rubygems_version: 2.5.1
389
406
  signing_key:
390
407
  specification_version: 4
391
408
  summary: Sensu plugins for working with an AWS environment