sensu-plugins-aws 3.2.1 → 4.0.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.
@@ -0,0 +1,70 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # check-s3-tag
4
+ #
5
+ # DESCRIPTION:
6
+ # This plugin checks if buckets have a set of tags.
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-s3-tag.rb --aws-region eu-west-1 --tag-keys xxx
20
+ #
21
+ # NOTES:
22
+ #
23
+ # LICENSE:
24
+ # Copyright (c) 2016, Olivier Bazoud, olivier.bazoud@gmail.com
25
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
26
+ # for details.
27
+ #
28
+
29
+ require 'sensu-plugin/check/cli'
30
+ require 'sensu-plugins-aws/common'
31
+ require 'aws-sdk'
32
+
33
+ class CheckS3Tag < Sensu::Plugin::Check::CLI
34
+ include Common
35
+
36
+ option :aws_region,
37
+ short: '-r AWS_REGION',
38
+ long: '--aws-region REGION',
39
+ description: 'AWS Region (defaults to us-east-1).',
40
+ default: 'us-east-1'
41
+
42
+ option :tag_keys,
43
+ short: '-t TAG_KEYS',
44
+ long: '--tag-keys TAG_KEYS',
45
+ description: 'Tag keys'
46
+
47
+ def run
48
+ tags = config[:tag_keys].split(',')
49
+ s3 = Aws::S3::Client.new
50
+ missing_tags = []
51
+ s3.list_buckets.buckets.each do |bucket|
52
+ begin
53
+ keys = s3.get_bucket_tagging(bucket: bucket.name).tag_set.map(&:key)
54
+ if keys.sort & tags.sort != tags.sort
55
+ missing_tags.push bucket.name
56
+ end
57
+ rescue => _
58
+ missing_tags.push bucket.name
59
+ end
60
+ end
61
+
62
+ if missing_tags.empty?
63
+ ok
64
+ else
65
+ critical("Missing tags in #{missing_tags}")
66
+ end
67
+ rescue => e
68
+ critical "Error: #{e.message} - #{e.backtrace}"
69
+ end
70
+ end
@@ -75,7 +75,7 @@ class CheckSESLimit < Sensu::Plugin::Check::CLI
75
75
 
76
76
  unknown 'Empty response from AWS SES API' if response.empty? # Can this happen?
77
77
 
78
- percent = (response.sent_last_24_hours.to_i / response.max_24_hour_send.to_i) * 100
78
+ percent = ((response.sent_last_24_hours.to_f / response.max_24_hour_send.to_f) * 100).to_i
79
79
  message = "SES sending limit is at #{percent}%"
80
80
 
81
81
  if config[:crit_percent] > 0 && config[:crit_percent] <= percent
@@ -28,23 +28,14 @@
28
28
  #
29
29
 
30
30
  require 'sensu-plugin/check/cli'
31
- require 'aws-sdk-v1'
31
+ require 'sensu-plugins-aws'
32
+ require 'aws-sdk'
32
33
 
33
34
  #
34
35
  # Check SQS Messages
35
36
  #
36
37
  class SQSMsgs < Sensu::Plugin::Check::CLI
37
- option :aws_access_key,
38
- short: '-a AWS_ACCESS_KEY',
39
- long: '--aws-access-key AWS_ACCESS_KEY',
40
- description: "AWS Access Key. Either set ENV['AWS_ACCESS_KEY'] or provide it as an option",
41
- default: ENV['AWS_ACCESS_KEY']
42
-
43
- option :aws_secret_access_key,
44
- short: '-k AWS_SECRET_KEY',
45
- long: '--aws-secret-access-key AWS_SECRET_KEY',
46
- description: "AWS Secret Access Key. Either set ENV['AWS_SECRET_KEY'] or provide it as an option",
47
- default: ENV['AWS_SECRET_KEY']
38
+ include Common
48
39
 
49
40
  option :aws_region,
50
41
  short: '-r AWS_REGION',
@@ -64,6 +55,12 @@ class SQSMsgs < Sensu::Plugin::Check::CLI
64
55
  description: 'The prefix of the queues you want to check the number of messages for',
65
56
  default: ''
66
57
 
58
+ option :metric,
59
+ short: '-m METTIC',
60
+ long: '--metric METRIC',
61
+ description: 'The metric of the queues you want to check the number of messages for',
62
+ default: 'ApproximateNumberOfMessages'
63
+
67
64
  option :warn_over,
68
65
  short: '-w WARN_OVER',
69
66
  long: '--warnnum WARN_OVER',
@@ -99,15 +96,16 @@ class SQSMsgs < Sensu::Plugin::Check::CLI
99
96
  end
100
97
 
101
98
  def run
102
- AWS.config aws_config
103
- sqs = AWS::SQS.new
99
+ Aws.config.update(aws_config)
100
+ sqs = Aws::SQS::Resource.new
104
101
 
105
102
  if config[:prefix] == ''
106
103
  if config[:queue] == ''
107
104
  critical 'Error, either QUEUE or PREFIX must be specified'
108
105
  end
109
106
 
110
- messages = sqs.queues.named(config[:queue]).approximate_number_of_messages
107
+ url = sqs.get_queue_by_name(queue_name: config[:queue]).url
108
+ messages = sqs.client.get_queue_attributes(queue_url: url, attribute_names: ['All']).attributes[config[:metric]].to_i
111
109
 
112
110
  if (config[:crit_under] >= 0 && messages < config[:crit_under]) || (config[:crit_over] >= 0 && messages > config[:crit_over])
113
111
  critical "#{messages} message(s) in #{config[:queue]} queue"
@@ -121,9 +119,9 @@ class SQSMsgs < Sensu::Plugin::Check::CLI
121
119
  crit = false
122
120
  queues = []
123
121
 
124
- sqs.queues.with_prefix(config[:prefix]).each do |q|
125
- queue_name = q.arn.split(':').last
126
- messages = q.approximate_number_of_messages
122
+ sqs.queues(queue_name_prefix: config[:prefix]).each do |q|
123
+ messages = sqs.client.get_queue_attributes(queue_url: q.url, attribute_names: ['All']).attributes[config[:metric]].to_i
124
+ queue_name = q.attributes['QueueArn'].split(':').last
127
125
 
128
126
  if (config[:crit_under] >= 0 && messages < config[:crit_under]) || (config[:crit_over] >= 0 && messages > config[:crit_over])
129
127
  crit = true
data/bin/check-vpc-vpn.rb CHANGED
@@ -13,7 +13,8 @@
13
13
  #
14
14
  # DEPENDENCIES:
15
15
  # gem: sensu-plugin
16
- # gem: aws-sdk-v1
16
+ # gem: aws-sdk
17
+ # gem: sensu-plugins-aws
17
18
  #
18
19
  # USAGE:
19
20
  # ./check-vpc-vpn.rb --aws-region us-east-1 --vpn-connection-id vpn-abc1234
@@ -25,61 +26,50 @@
25
26
  # John Dyer johntdyer@gmail.com
26
27
  # Released under the same terms as Sensu (the MIT license); see LICENSE
27
28
  # for details.
29
+ # Updated by Peter Hoppe <peter.hoppe.extern@bertelsmann.de> to aws-sdk-v2
28
30
  #
29
31
 
32
+ require 'sensu-plugins-aws'
30
33
  require 'sensu-plugin/check/cli'
31
- require 'aws-sdk-v1'
34
+ require 'aws-sdk'
32
35
 
33
36
  class CheckAwsVpcVpnConnections < Sensu::Plugin::Check::CLI
34
- @aws_config = {}
35
- # rubocop:disable Style/AlignParameters
36
- option :access_key,
37
- short: '-a AWS_ACCESS_KEY',
38
- long: '--aws-access-key AWS_ACCESS_KEY',
39
- description: 'AWS Access Key',
40
- default: ENV['AWS_ACCESS_KEY_ID']
41
-
42
- option :secret_key,
43
- short: '-s AWS_SECRET_ACCESS_KEY',
44
- long: '--aws-secret-access-key AWS_SECRET_ACCESS_KEY',
45
- description: 'AWS Secret Access Key.',
46
- default: ENV['AWS_SECRET_ACCESS_KEY']
47
-
48
- option :use_iam_role,
49
- short: '-u',
50
- long: '--use-iam',
51
- description: 'Use IAM authentication'
52
-
37
+ include Common
53
38
  option :vpn_id,
54
- short: '-v VPN_ID',
55
- long: '--vpn-connection-id VPN_ID',
56
- required: true,
57
- description: 'VPN connection ID'
39
+ short: '-v VPN_ID',
40
+ long: '--vpn-connection-id VPN_ID',
41
+ required: true,
42
+ description: 'VPN connection ID'
58
43
 
59
44
  option :aws_region,
60
- short: '-r AWS_REGION',
61
- long: '--aws-region REGION',
62
- description: 'AWS Region (such as eu-west-1).',
63
- default: 'us-east-1'
45
+ short: '-r AWS_REGION',
46
+ long: '--aws-region REGION',
47
+ description: 'AWS Region (defaults to us-east-1).',
48
+ default: ENV['AWS_REGION']
64
49
 
65
- def aws_config
66
- aws_connection_config = { region: config[:aws_region] }
67
- if config[:use_iam_role].nil?
68
- aws_connection_config[:access_key_id] = config[:access_key]
69
- aws_connection_config[:secret_access_key] = config[:secret_key]
70
- end
71
- aws_connection_config
72
- end
50
+ option :warn_count,
51
+ short: '-W WARN_COUNT',
52
+ long: '--warn_count WARN_COUNT',
53
+ description: 'Warn when the count of down tunnels is at or above this number',
54
+ default: 1,
55
+ proc: proc(&:to_i)
56
+
57
+ option :crit_count,
58
+ short: '-C CRIT_COUNT',
59
+ long: '--crit_count CRIT_COUNT',
60
+ description: 'Critical when the count of down tunnels is at or above this number',
61
+ default: 2,
62
+ proc: proc(&:to_i)
73
63
 
74
64
  def fetch_connection_data
75
65
  begin
76
- ec2 = AWS::EC2::Client.new(aws_config)
77
- vpn_info = ec2.describe_vpn_connections(vpn_connection_ids: [config[:vpn_id]]).vpn_connection_set
66
+ ec2 = Aws::EC2::Client.new
67
+ vpn_info = ec2.describe_vpn_connections(vpn_connection_ids: [config[:vpn_id]]).vpn_connections
78
68
  down_connections = vpn_info.first.vgw_telemetry.select { |x| x.status != 'UP' }
79
69
  results = { down_count: down_connections.count }
80
- results[:down_connection_status] = down_connections.map { |x| "#{x.outside_ip_address} => #{x.status_message.nil? ? 'none' : x.status_message}" }
81
- results[:connection_name] = vpn_info[0].tag_set.find { |x| x.key == 'Name' }.value
82
- rescue AWS::EC2::Errors::InvalidVpnConnectionID::NotFound
70
+ results[:down_connection_status] = down_connections.map { |x| "#{x.outside_ip_address} => #{x.status_message.empty? ? 'none' : x.status_message}" }
71
+ results[:connection_name] = vpn_info[0].tags.find { |x| x.key == 'Name' }.value
72
+ rescue Aws::EC2::Errors::ServiceError
83
73
  warning "The vpnConnection ID '#{config[:vpn_id]}' does not exist"
84
74
  rescue => e
85
75
  warning e.backtrace.join(' ')
@@ -92,12 +82,17 @@ class CheckAwsVpcVpnConnections < Sensu::Plugin::Check::CLI
92
82
  msg = data[:down_connection_status].join(' | ')
93
83
  name = data[:connection_name]
94
84
  case data[:down_count]
95
- when 2 then critical "'#{name}' shows both tunnels as DOWN - [ #{msg} ]"
96
- when 1 then warning "'#{name}' shows 1 of 2 tunnels as DOWN - [ #{msg} ]"
97
- when 0 then ok "'#{name}' shows 2 of 2 tunnels as UP"
85
+ when 2 then message = "'#{name}' shows both tunnels as DOWN - [ #{msg} ]"
86
+ when 1 then message = "'#{name}' shows 1 of 2 tunnels as DOWN - [ #{msg} ]"
87
+ end
88
+
89
+ if data[:down_count] >= config[:crit_count]
90
+ critical message
91
+ elsif data[:down_count] >= config[:warn_count]
92
+ warning message
98
93
  else
99
- # Not sure this could ever happen
100
- unknown "Unknown connection count - #{data[:down_count]}"
94
+ up_count = 2 - data[:down_count]
95
+ ok "'#{name}' shows #{up_count} of 2 tunnels as UP"
101
96
  end
102
97
  end
103
98
  end
@@ -0,0 +1,156 @@
1
+ #! /usr/bin/env ruby
2
+ #
3
+ # asg-metrics
4
+ #
5
+ # DESCRIPTION:
6
+ # Gets latency metrics from CloudWatch and puts them in Graphite for longer term storage
7
+ #
8
+ # OUTPUT:
9
+ # metric-data
10
+ #
11
+ # PLATFORMS:
12
+ # Linux
13
+ #
14
+ # DEPENDENCIES:
15
+ # gem: aws-sdk
16
+ # gem: sensu-plugin
17
+ # gem: sensu-plugin-aws
18
+ # gem: time
19
+ #
20
+ # USAGE:
21
+ #
22
+ #
23
+ # NOTES:
24
+ # Returns latency statistics by default. You can specify any valid ASG metric type, see
25
+ # http://http://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/as-metricscollected.html
26
+ #
27
+ # LICENSE:
28
+ # Peter Hoppe <peter.hoppe.extern@bertelsmann.de>
29
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
30
+ # for details.
31
+ #
32
+
33
+ require 'sensu-plugin/metric/cli'
34
+ require 'aws-sdk'
35
+ require 'sensu-plugins-aws'
36
+ require 'time'
37
+
38
+ class ASGMetrics < Sensu::Plugin::Metric::CLI::Graphite
39
+ include Common
40
+ option :asgname,
41
+ description: 'Name of the Auto Scaling Group',
42
+ short: '-n ASG_NAME',
43
+ long: '--name ASG_NAME'
44
+
45
+ option :scheme,
46
+ description: 'Metric naming scheme, text to prepend to metric',
47
+ short: '-s SCHEME',
48
+ long: '--scheme SCHEME',
49
+ default: ''
50
+
51
+ option :fetch_age,
52
+ description: 'How long ago to fetch metrics for',
53
+ short: '-f AGE',
54
+ long: '--fetch_age',
55
+ default: 60,
56
+ proc: proc(&:to_i)
57
+
58
+ option :metric,
59
+ description: 'Metric to fetch',
60
+ short: '-m METRIC',
61
+ long: '--metric',
62
+ default: 'GroupInServiceInstances'
63
+
64
+ option :statistic,
65
+ description: 'Statistics type',
66
+ short: '-t STATISTIC',
67
+ long: '--statistic',
68
+ default: ''
69
+
70
+ option :aws_region,
71
+ short: '-r AWS_REGION',
72
+ long: '--aws-region REGION',
73
+ description: 'AWS Region (defaults to us-east-1).',
74
+ default: ENV['AWS_REGION']
75
+
76
+ option :end_time,
77
+ short: '-t T',
78
+ long: '--end-time TIME',
79
+ default: Time.now,
80
+ proc: proc { |a| Time.parse a },
81
+ description: 'CloudWatch metric statistics end time'
82
+
83
+ option :period,
84
+ short: '-p N',
85
+ long: '--period SECONDS',
86
+ default: 60,
87
+ proc: proc(&:to_i),
88
+ description: 'CloudWatch metric statistics period'
89
+
90
+ def cloud_watch
91
+ @cloud_watch = Aws::CloudWatch::Client.new
92
+ end
93
+
94
+ def asg
95
+ @asg = Aws::AutoScaling::Client.new
96
+ end
97
+
98
+ def cloud_watch_metric(metric_name, value, asg_name)
99
+ cloud_watch.get_metric_statistics(
100
+ namespace: 'AWS/AutoScaling',
101
+ metric_name: metric_name,
102
+ dimensions: [
103
+ {
104
+ name: 'AutoScaling',
105
+ value: asg_name
106
+ }
107
+ ],
108
+ statistics: [value],
109
+ start_time: config[:end_time] - config[:period],
110
+ end_time: config[:end_time],
111
+ period: config[:period]
112
+ )
113
+ end
114
+
115
+ def print_statistics(asg_name, statistics)
116
+ result = {}
117
+ static_value = {}
118
+ statistics.each do |key, static|
119
+ r = cloud_watch_metric(key, static, asg_name)
120
+ static_value['AutoScalingGroup.' + asg_name + '.' + key + '.' + static] = static
121
+ result['AutoScalingGroup.' + asg_name + '.' + key + '.' + static] = r[:datapoints][0] unless r[:datapoints][0].nil?
122
+ end
123
+ result.each do |key, value|
124
+ output key.downcase.to_s, value[static_value[key].downcase], value[:timestamp].to_i
125
+ end
126
+ end
127
+
128
+ def run
129
+ if config[:statistic] == ''
130
+ default_statistic_per_metric = {
131
+ 'GroupMinSize' => 'Sum',
132
+ 'GroupMaxSize' => 'Sum',
133
+ 'GroupDesiredCapacity' => 'Sum',
134
+ 'GroupInServiceInstances' => 'Sum',
135
+ 'GroupPendingInstances' => 'Sum',
136
+ 'GroupStandbyInstances' => 'Sum',
137
+ 'GroupTerminatingInstances' => 'Sum',
138
+ 'GroupTotalInstances' => 'Sum'
139
+ }
140
+ statistic = default_statistic_per_metric
141
+ else
142
+ statistic = config[:statistic]
143
+ end
144
+
145
+ begin
146
+ if config[:asgname].nil?
147
+ asg.describe_auto_scaling_groups.auto_scaling_groups.each do |autoascalinggroup|
148
+ print_statistics(autoascalinggroup.auto_scaling_group_name, statistic)
149
+ end
150
+ else
151
+ print_statistics(config[:asgname], statistic)
152
+ end
153
+ ok
154
+ end
155
+ end
156
+ end
@@ -27,14 +27,14 @@
27
27
  #
28
28
 
29
29
  require 'sensu-plugin/metric/cli'
30
- require 'aws-sdk-v1'
30
+ require 'aws-sdk'
31
31
 
32
32
  class AutoScalingInstanceCountMetrics < Sensu::Plugin::Metric::CLI::Graphite
33
33
  option :groupname,
34
34
  description: 'Name of the AutoScaling group',
35
35
  short: '-g GROUP_NAME',
36
36
  long: '--autoscaling-group GROUP_NAME',
37
- required: true
37
+ default: false
38
38
 
39
39
  option :scheme,
40
40
  description: 'Metric naming scheme, text to prepend to metric',
@@ -60,22 +60,38 @@ class AutoScalingInstanceCountMetrics < Sensu::Plugin::Metric::CLI::Graphite
60
60
  description: 'AWS Region (defaults to us-east-1).',
61
61
  default: 'us-east-1'
62
62
 
63
+ option :include_name,
64
+ short: '-n',
65
+ long: '--include-name',
66
+ description: "Includes any offending instance's 'Name' tag in the metric output",
67
+ default: false
68
+
63
69
  def aws_config
64
70
  { access_key_id: config[:aws_access_key],
65
71
  secret_access_key: config[:aws_secret_access_key],
66
72
  region: config[:aws_region] }
67
73
  end
68
74
 
75
+ def autoscaling_groups
76
+ client = Aws::AutoScaling::Client.new(aws_config)
77
+ client.describe_auto_scaling_groups[:auto_scaling_groups].map(&:auto_scaling_group_name)
78
+ end
79
+
69
80
  def run
70
- graphitepath = if config[:scheme] == ''
71
- "#{config[:groupname]}.autoscaling.instance_count"
72
- else
73
- config[:scheme]
74
- end
75
81
  begin
76
- as = AWS::AutoScaling.new aws_config
77
- count = as.groups[config[:groupname]].auto_scaling_instances.map(&:lifecycle_state).count('InService')
78
- output graphitepath, count
82
+ groupnames ||= config[:groupname] ? [config[:groupname]] : autoscaling_groups
83
+ groupnames.each do |g|
84
+ as = Aws::AutoScaling::AutoScalingGroup.new aws_config.merge!(name: g)
85
+ count = as.instances.map(&:lifecycle_state).count('InService')
86
+ scheme_name ||= config[:include_name] ? as.data[:tags].select { |tag| tag[:key] == 'Name' }[0][:value] : g
87
+ graphitepath =
88
+ if config[:scheme] == ''
89
+ "#{scheme_name}.autoscaling.instance_count"
90
+ else
91
+ "#{config[:scheme]}.#{scheme_name}.instance_count"
92
+ end
93
+ output graphitepath, count
94
+ end
79
95
  rescue => e
80
96
  puts "Error: exception: #{e}"
81
97
  critical