riemann-tools 1.1.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +2 -0
  3. data/.gitignore +2 -0
  4. data/.rubocop.yml +8 -0
  5. data/.ruby-version +1 -0
  6. data/CHANGELOG.md +55 -2
  7. data/Rakefile +17 -3
  8. data/bin/riemann-apache-status +1 -106
  9. data/bin/riemann-bench +2 -70
  10. data/bin/riemann-cloudant +1 -56
  11. data/bin/riemann-consul +1 -106
  12. data/bin/riemann-dir-files-count +1 -55
  13. data/bin/riemann-dir-space +1 -55
  14. data/bin/riemann-diskstats +1 -92
  15. data/bin/riemann-fd +2 -81
  16. data/bin/riemann-freeswitch +2 -119
  17. data/bin/riemann-haproxy +1 -58
  18. data/bin/riemann-health +0 -2
  19. data/bin/riemann-kvminstance +2 -22
  20. data/bin/riemann-md +8 -0
  21. data/bin/riemann-memcached +1 -37
  22. data/bin/riemann-net +0 -2
  23. data/bin/riemann-nginx-status +1 -85
  24. data/bin/riemann-ntp +0 -2
  25. data/bin/riemann-portcheck +1 -44
  26. data/bin/riemann-proc +1 -108
  27. data/bin/riemann-varnish +1 -54
  28. data/bin/riemann-wrapper +113 -0
  29. data/bin/riemann-zookeeper +1 -39
  30. data/bin/riemann-zpool +8 -0
  31. data/lib/riemann/tools/apache_status.rb +107 -0
  32. data/lib/riemann/tools/bench.rb +72 -0
  33. data/lib/riemann/tools/cloudant.rb +57 -0
  34. data/lib/riemann/tools/consul_health.rb +107 -0
  35. data/lib/riemann/tools/dir_files_count.rb +56 -0
  36. data/lib/riemann/tools/dir_space.rb +56 -0
  37. data/lib/riemann/tools/diskstats.rb +94 -0
  38. data/lib/riemann/tools/fd.rb +81 -0
  39. data/lib/riemann/tools/freeswitch.rb +119 -0
  40. data/lib/riemann/tools/haproxy.rb +59 -0
  41. data/lib/riemann/tools/health.rb +150 -19
  42. data/lib/riemann/tools/kvm.rb +23 -0
  43. data/lib/riemann/tools/md.rb +35 -0
  44. data/lib/riemann/tools/mdstat_parser.tab.rb +340 -0
  45. data/lib/riemann/tools/memcached.rb +38 -0
  46. data/lib/riemann/tools/net.rb +2 -1
  47. data/lib/riemann/tools/nginx_status.rb +86 -0
  48. data/lib/riemann/tools/ntp.rb +1 -0
  49. data/lib/riemann/tools/portcheck.rb +45 -0
  50. data/lib/riemann/tools/proc.rb +109 -0
  51. data/lib/riemann/tools/riemann_client_wrapper.rb +43 -0
  52. data/lib/riemann/tools/uptime_parser.tab.rb +323 -0
  53. data/lib/riemann/tools/varnish.rb +55 -0
  54. data/lib/riemann/tools/version.rb +1 -1
  55. data/lib/riemann/tools/zookeeper.rb +40 -0
  56. data/lib/riemann/tools/zpool.rb +29 -0
  57. data/lib/riemann/tools.rb +2 -20
  58. data/riemann-tools.gemspec +10 -1
  59. data/tools/riemann-aws/Rakefile +6 -9
  60. data/tools/riemann-aws/bin/riemann-aws-billing +2 -87
  61. data/tools/riemann-aws/bin/riemann-aws-rds-status +2 -62
  62. data/tools/riemann-aws/bin/riemann-aws-sqs-status +2 -44
  63. data/tools/riemann-aws/bin/riemann-aws-status +2 -77
  64. data/tools/riemann-aws/bin/riemann-elb-metrics +2 -162
  65. data/tools/riemann-aws/bin/riemann-s3-list +2 -81
  66. data/tools/riemann-aws/bin/riemann-s3-status +2 -96
  67. data/tools/riemann-aws/lib/riemann/tools/aws/billing.rb +87 -0
  68. data/tools/riemann-aws/lib/riemann/tools/aws/elb_metrics.rb +163 -0
  69. data/tools/riemann-aws/lib/riemann/tools/aws/rds_status.rb +63 -0
  70. data/tools/riemann-aws/lib/riemann/tools/aws/s3_list.rb +82 -0
  71. data/tools/riemann-aws/lib/riemann/tools/aws/s3_status.rb +97 -0
  72. data/tools/riemann-aws/lib/riemann/tools/aws/sqs_status.rb +45 -0
  73. data/tools/riemann-aws/lib/riemann/tools/aws/status.rb +74 -0
  74. data/tools/riemann-chronos/Rakefile +6 -9
  75. data/tools/riemann-chronos/bin/riemann-chronos +1 -154
  76. data/tools/riemann-chronos/lib/riemann/tools/chronos.rb +157 -0
  77. data/tools/riemann-docker/Rakefile +5 -8
  78. data/tools/riemann-docker/bin/riemann-docker +2 -200
  79. data/tools/riemann-docker/lib/riemann/tools/docker.rb +200 -0
  80. data/tools/riemann-elasticsearch/Rakefile +6 -9
  81. data/tools/riemann-elasticsearch/bin/riemann-elasticsearch +1 -167
  82. data/tools/riemann-elasticsearch/lib/riemann/tools/elasticsearch.rb +170 -0
  83. data/tools/riemann-marathon/Rakefile +6 -9
  84. data/tools/riemann-marathon/bin/riemann-marathon +1 -156
  85. data/tools/riemann-marathon/lib/riemann/tools/marathon.rb +159 -0
  86. data/tools/riemann-mesos/Rakefile +6 -9
  87. data/tools/riemann-mesos/bin/riemann-mesos +1 -139
  88. data/tools/riemann-mesos/lib/riemann/tools/mesos.rb +142 -0
  89. data/tools/riemann-munin/Rakefile +5 -8
  90. data/tools/riemann-munin/bin/riemann-munin +1 -36
  91. data/tools/riemann-munin/lib/riemann/tools/munin.rb +37 -0
  92. data/tools/riemann-rabbitmq/Rakefile +6 -9
  93. data/tools/riemann-rabbitmq/bin/riemann-rabbitmq +1 -266
  94. data/tools/riemann-rabbitmq/lib/riemann/tools/rabbitmq.rb +269 -0
  95. data/tools/riemann-riak/Rakefile +5 -8
  96. data/tools/riemann-riak/bin/riemann-riak +1 -316
  97. data/tools/riemann-riak/bin/riemann-riak-keys +0 -1
  98. data/tools/riemann-riak/bin/riemann-riak-ring +0 -1
  99. data/tools/riemann-riak/lib/riemann/tools/riak.rb +317 -0
  100. metadata +61 -7
  101. data/.travis.yml +0 -31
  102. data/tools/riemann-riak/riak_status/key_count.erl +0 -13
  103. data/tools/riemann-riak/riak_status/riak_status.rb +0 -152
  104. data/tools/riemann-riak/riak_status/ringready.erl +0 -9
@@ -3,166 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- require 'riemann/tools'
6
+ require 'riemann/tools/aws/elb_metrics'
7
7
 
8
- $0 = __FILE__
9
-
10
- module Riemann
11
- module Tools
12
- class ELBMetrics
13
- include Riemann::Tools
14
- require 'fog'
15
- require 'time'
16
-
17
- opt :fog_credentials_file, 'Fog credentials file', type: String
18
- opt :fog_credential, 'Fog credentials to use', type: String
19
- opt :aws_access, 'AWS Access Key', type: String
20
- opt :aws_secret, 'AWS Secret Key', type: String
21
- opt :aws_region, 'AWS Region', type: String, default: 'eu-west-1'
22
- opt :aws_azs, 'List of AZs to aggregate against', type: :strings, default: ['all_az']
23
- opt :elbs, 'List of ELBs to pull metrics from', type: :strings, required: true
24
-
25
- def standard_metrics
26
- # ELB metric types, from:
27
- # http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html#elb-metricscollected
28
- {
29
- 'Latency' => {
30
- 'Unit' => 'Seconds',
31
- 'Statistics' => %w[Maximum Minimum Average],
32
- },
33
- 'RequestCount' => {
34
- 'Unit' => 'Count',
35
- 'Statistics' => ['Sum'],
36
- },
37
- 'HealthyHostCount' => {
38
- 'Units' => 'Count',
39
- 'Statistics' => %w[Minimum Maximum Average],
40
- },
41
- 'UnHealthyHostCount' => {
42
- 'Units' => 'Count',
43
- 'Statistics' => %w[Minimum Maximum Average],
44
- },
45
- 'HTTPCode_ELB_4XX' => {
46
- 'Units' => 'Count',
47
- 'Statistics' => ['Sum'],
48
- },
49
- 'HTTPCode_ELB_5XX' => {
50
- 'Units' => 'Count',
51
- 'Statistics' => ['Sum'],
52
- },
53
- 'HTTPCode_Backend_2XX' => {
54
- 'Units' => 'Count',
55
- 'Statistics' => ['Sum'],
56
- },
57
- 'HTTPCode_Backend_3XX' => {
58
- 'Units' => 'Count',
59
- 'Statistics' => ['Sum'],
60
- },
61
- 'HTTPCode_Backend_4XX' => {
62
- 'Units' => 'Count',
63
- 'Statistics' => ['Sum'],
64
- },
65
- 'HTTPCode_Backend_5XX' => {
66
- 'Units' => 'Count',
67
- 'Statistics' => ['Sum'],
68
- },
69
- }
70
- end
71
-
72
- def base_metrics
73
- # get last 60 seconds
74
- start_time = (Time.now.utc - 60).iso8601
75
- end_time = Time.now.utc.iso8601
76
-
77
- # The base query that all metrics would get
78
- {
79
- 'Namespace' => 'AWS/ELB',
80
- 'StartTime' => start_time,
81
- 'EndTime' => end_time,
82
- 'Period' => 60,
83
- }
84
- end
85
-
86
- def tick
87
- if options[:fog_credentials_file]
88
- Fog.credentials_path = options[:fog_credentials_file]
89
- Fog.credential = options[:fog_credential].to_sym
90
- connection = Fog::AWS::CloudWatch.new
91
- else
92
- connection = if options[:aws_access] && options[:aws_secret]
93
- Fog::AWS::CloudWatch.new({
94
- aws_access_key_id: options[:aws_access],
95
- aws_secret_access_key: options[:aws_secret],
96
- region: options[:aws_region],
97
- })
98
- else
99
- Fog::AWS::CloudWatch.new({
100
- use_iam_profile: true,
101
- region: options[:aws_region],
102
- })
103
- end
104
- end
105
-
106
- options[:elbs].each do |lb|
107
- metric_options = standard_metrics
108
- metric_base_options = base_metrics
109
-
110
- options[:aws_azs].each do |az|
111
- metric_options.keys.sort.each do |metric_type|
112
- merged_options = metric_base_options.merge(metric_options[metric_type])
113
- merged_options['MetricName'] = metric_type
114
- merged_options['Dimensions'] = if az == 'all_az'
115
- [{ 'Name' => 'LoadBalancerName', 'Value' => lb }]
116
- else
117
- [
118
- { 'Name' => 'LoadBalancerName', 'Value' => lb },
119
- { 'Name' => 'AvailabilityZone', 'Value' => az },
120
- ]
121
- end
122
-
123
- result = connection.get_metric_statistics(merged_options)
124
-
125
- # "If no response codes in the category 2XX-5XX range are sent to clients within
126
- # the given time period, values for these metrics will not be recorded in CloudWatch"
127
- # next if result.body["GetMetricStatisticsResult"]["Datapoints"].empty? && metric_type =~ /[2345]XX/
128
- #
129
- if result.body['GetMetricStatisticsResult']['Datapoints'].empty?
130
- standard_metrics[metric_type]['Statistics'].each do |stat_type|
131
- event = event(lb, az, metric_type, stat_type, 0.0)
132
- report(event)
133
- end
134
- next
135
- end
136
-
137
- # We should only ever have a single data point
138
- result.body['GetMetricStatisticsResult']['Datapoints'][0].keys.sort.each do |stat_type|
139
- next if stat_type == 'Unit'
140
- next if stat_type == 'Timestamp'
141
-
142
- unit = result.body['GetMetricStatisticsResult']['Datapoints'][0]['Unit']
143
- metric = result.body['GetMetricStatisticsResult']['Datapoints'][0][stat_type]
144
- event = event(lb, az, metric_type, stat_type, metric, unit)
145
- report(event)
146
- end
147
- end
148
- end
149
- end
150
- end
151
-
152
- private
153
-
154
- def event(lb, az, metric_type, stat_type, metric, unit = nil)
155
- {
156
- host: lb,
157
- service: "elb.#{az}.#{metric_type}.#{stat_type}",
158
- ttl: 60,
159
- description: "#{lb} #{metric_type} #{stat_type} (#{unit})",
160
- tags: ['elb_metrics'],
161
- metric: metric,
162
- }
163
- end
164
- end
165
- end
166
- end
167
-
168
- Riemann::Tools::ELBMetrics.run
8
+ Riemann::Tools::Aws::ElbMetrics.run
@@ -3,85 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- require 'riemann/tools'
6
+ require 'riemann/tools/aws/s3_list'
7
7
 
8
- $0 = __FILE__
9
-
10
- module Riemann
11
- module Tools
12
- class S3Metrics
13
- include Riemann::Tools
14
- require 'fog'
15
- require 'time'
16
-
17
- opt :fog_credentials_file, 'Fog credentials file', type: String
18
- opt :fog_credential, 'Fog credentials to use', type: String
19
- opt :aws_access, 'AWS Access Key', type: String
20
- opt :aws_secret, 'AWS Secret Key', type: String
21
- opt :aws_region, 'AWS Region', type: String, default: 'eu-west-1'
22
- opt :buckets, 'Buckets to pull metrics from, multi=true, can have a prefix like mybucket/prefix', type: String,
23
- multi: true, required: true
24
- opt :max_objects, 'Max number of objects to list before stopping to save bandwidth', default: -1
25
-
26
- def tick
27
- if options[:fog_credentials_file]
28
- Fog.credentials_path = options[:fog_credentials_file]
29
- Fog.credential = options[:fog_credential].to_sym
30
- connection = Fog::Storage.new
31
- else
32
- connection = if options[:aws_access] && options[:aws_secret]
33
- Fog::Storage.new({
34
- provider: 'AWS',
35
- aws_access_key_id: options[:aws_access],
36
- aws_secret_access_key: options[:aws_secret],
37
- region: options[:aws_region],
38
- })
39
- else
40
- Fog::Storage.new({
41
- provider: 'AWS',
42
- use_iam_profile: true,
43
- region: options[:aws_region],
44
- })
45
- end
46
- end
47
-
48
- options[:buckets].each do |url|
49
- split = url.split('/')
50
- bucket = split[0]
51
- prefix = ''
52
- prefix = url[(split[0].length + 1)..] if split[1]
53
- count = 0
54
- connection.directories.get(bucket, prefix: prefix).files.map do |_file|
55
- count += 1
56
- break if options[:max_objects].positive? && count > options[:max_objects]
57
- end
58
- event = if options[:max_objects].positive? && count > options[:max_objects]
59
- event(
60
- url, 'objectCount', count, "count was bigger than threshold #{options[:max_objects]}",
61
- 'warning',
62
- )
63
- else
64
- event(url, 'objectCount', count, "All objects counted, threshold=#{options[:max_objects]}", 'ok')
65
- end
66
- report(event)
67
- end
68
- end
69
-
70
- private
71
-
72
- def event(bucket, label, metric, description, severity)
73
- {
74
- host: "bucket_#{bucket}",
75
- service: "s3.#{label}",
76
- ttl: 300,
77
- description: "#{bucket} #{description}",
78
- tags: ['s3_metrics'],
79
- metric: metric,
80
- state: severity,
81
- }
82
- end
83
- end
84
- end
85
- end
86
-
87
- Riemann::Tools::S3Metrics.run
8
+ Riemann::Tools::Aws::S3List.run
@@ -3,100 +3,6 @@
3
3
 
4
4
  Process.setproctitle($PROGRAM_NAME)
5
5
 
6
- require 'riemann/tools'
6
+ require 'riemann/tools/aws/s3_status'
7
7
 
8
- $0 = __FILE__
9
-
10
- module Riemann
11
- module Tools
12
- class S3Metrics
13
- include Riemann::Tools
14
- require 'fog'
15
- require 'time'
16
-
17
- opt :fog_credentials_file, 'Fog credentials file', type: String
18
- opt :fog_credential, 'Fog credentials to use', type: String
19
- opt :aws_access, 'AWS Access Key', type: String
20
- opt :aws_secret, 'AWS Secret Key', type: String
21
- opt :aws_region, 'AWS Region', type: String, default: 'eu-west-1'
22
- opt :buckets, 'Buckets to pull metrics from, multi=true', type: String, multi: true, required: true
23
- opt :statistic, 'Statistic to retrieve, multi=true, e.g. --statistic=Average --statistic=Maximum', type: String,
24
- multi: true, required: true
25
-
26
- def base_metrics
27
- # get last 60 seconds
28
- start_time = (Time.now.utc - 3600 * 24 * 1).iso8601
29
- end_time = Time.now.utc.iso8601
30
-
31
- # The base query that all metrics would get
32
- {
33
- 'Namespace' => 'AWS/S3',
34
- 'StartTime' => start_time,
35
- 'EndTime' => end_time,
36
- 'Period' => 3600,
37
- 'MetricName' => 'NumberOfObjects',
38
- }
39
- end
40
-
41
- def tick
42
- if options[:fog_credentials_file]
43
- Fog.credentials_path = options[:fog_credentials_file]
44
- Fog.credential = options[:fog_credential].to_sym
45
- connection = Fog::AWS::CloudWatch.new
46
- else
47
- connection = if options[:aws_access] && options[:aws_secret]
48
- Fog::AWS::CloudWatch.new({
49
- aws_access_key_id: options[:aws_access],
50
- aws_secret_access_key: options[:aws_secret],
51
- region: options[:aws_region],
52
- })
53
- else
54
- Fog::AWS::CloudWatch.new({
55
- use_iam_profile: true,
56
- region: options[:aws_region],
57
- })
58
- end
59
- end
60
-
61
- options[:statistic].each do |statistic|
62
- options[:buckets].each do |bucket|
63
- metric_base_options = base_metrics
64
- metric_base_options['Statistics'] = statistic
65
- metric_base_options['Dimensions'] = [
66
- { 'Name' => 'BucketName', 'Value' => bucket },
67
- { 'Name' => 'StorageType', 'Value' => 'AllStorageTypes' },
68
- ]
69
-
70
- result = connection.get_metric_statistics(metric_base_options)
71
- next if result.body['GetMetricStatisticsResult']['Datapoints'].empty?
72
-
73
- result.body['GetMetricStatisticsResult']['Datapoints'][0].keys.sort.each do |stat_type|
74
- next if stat_type == 'Unit'
75
- next if stat_type == 'Timestamp'
76
-
77
- unit = result.body['GetMetricStatisticsResult']['Datapoints'][0]['Unit']
78
- metric = result.body['GetMetricStatisticsResult']['Datapoints'][0][stat_type]
79
- event = event(bucket, result.body['GetMetricStatisticsResult']['Label'], stat_type, unit, metric)
80
- report(event)
81
- end
82
- end
83
- end
84
- end
85
-
86
- private
87
-
88
- def event(bucket, label, metric_type, stat_type, metric, unit = nil)
89
- {
90
- host: "bucket_#{bucket}",
91
- service: "s3.#{label}.#{metric_type}.#{stat_type}",
92
- ttl: 300,
93
- description: "#{bucket} #{metric_type} #{stat_type} (#{unit})",
94
- tags: ['s3_metrics'],
95
- metric: metric,
96
- }
97
- end
98
- end
99
- end
100
- end
101
-
102
- Riemann::Tools::S3Metrics.run
8
+ Riemann::Tools::Aws::S3Status.run
@@ -0,0 +1,87 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'riemann/tools'
4
+
5
+ module Riemann
6
+ module Tools
7
+ module Aws
8
+ class Billing
9
+ include Riemann::Tools
10
+ require 'fog/aws'
11
+
12
+ opt :fog_credentials_file, 'Fog credentials file', type: String
13
+ opt :fog_credential, 'Fog credentials to use', type: String
14
+
15
+ opt :access_key, 'AWS access key', type: String
16
+ opt :secret_key, 'Secret access key', type: String
17
+ opt :services, 'AWS services: AmazonEC2 AmazonS3 AWSDataTransfer', type: :strings, multi: true,
18
+ default: %w[AmazonEC2 AmazonS3 AWSDataTransfer]
19
+
20
+ opt :time_start, 'Start time in seconds of the metrics period (2hrs ago default)', type: Integer, default: 7200
21
+ opt :time_end, 'End time in seconds of the metrics period ', type: Integer, default: 60
22
+
23
+ def initialize
24
+ if options[:fog_credentials_file]
25
+ Fog.credentials_path = opts[:fog_credentials_file]
26
+ Fog.credential = opts[:fog_credential].to_sym
27
+ @cloudwatch = Fog::AWS::CloudWatch.new
28
+ else
29
+ creds = if opts.key?('secret_key') && opts.key?('access_key')
30
+ {
31
+ aws_secret_access_key: opts[:secret_key],
32
+ aws_access_key_id: opts[:access_key],
33
+ }
34
+ else
35
+ { use_iam_profile: true }
36
+ end
37
+ @cloudwatch = Fog::AWS::CloudWatch.new(creds)
38
+ end
39
+ @start_time = (Time.now.utc - opts[:time_start]).iso8601
40
+ @end_time = (Time.now.utc - opts[:time_end]).iso8601
41
+ end
42
+
43
+ def tick
44
+ opts[:services].each do |service|
45
+ data = @cloudwatch.get_metric_statistics({
46
+ 'Statistics' => ['Maximum'],
47
+ 'StartTime' => @start_time,
48
+ 'EndTime' => @end_time,
49
+ 'Period' => 3600,
50
+ 'Unit' => 'None',
51
+ 'MetricName' => 'EstimatedCharges',
52
+ 'Namespace' => 'AWS/Billing',
53
+ 'Dimensions' => [
54
+ {
55
+ 'Name' => 'ServiceName',
56
+ 'Value' => service,
57
+ },
58
+ {
59
+ 'Name' => 'Currency',
60
+ 'Value' => 'USD',
61
+ },
62
+ ],
63
+ }).body['GetMetricStatisticsResult']['Datapoints']
64
+
65
+ data.each do |metrics|
66
+ name = "AWScloudwatch.Billing.#{service}"
67
+ value = metrics['Maximum']
68
+ timestamp = metrics['Timestamp'].to_i
69
+
70
+ event = {
71
+ host: nil,
72
+ service: name,
73
+ time: timestamp,
74
+ description: "AWS Estimate Charges for #{service}",
75
+ tags: ['aws_billing'],
76
+ state: 'ok',
77
+ metric: value,
78
+ }
79
+
80
+ report event
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,163 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'riemann/tools'
4
+
5
+ module Riemann
6
+ module Tools
7
+ module Aws
8
+ class ElbMetrics
9
+ include Riemann::Tools
10
+ require 'fog/aws'
11
+ require 'time'
12
+
13
+ opt :fog_credentials_file, 'Fog credentials file', type: String
14
+ opt :fog_credential, 'Fog credentials to use', type: String
15
+ opt :access_key, 'AWS Access Key', type: String
16
+ opt :secret_key, 'AWS Secret Key', type: String
17
+ opt :region, 'AWS Region', type: String, default: 'eu-west-1'
18
+ opt :azs, 'List of AZs to aggregate against', type: :strings, default: ['all_az']
19
+ opt :elbs, 'List of ELBs to pull metrics from', type: :strings, required: true
20
+
21
+ def standard_metrics
22
+ # ELB metric types, from:
23
+ # http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html#elb-metricscollected
24
+ {
25
+ 'Latency' => {
26
+ 'Unit' => 'Seconds',
27
+ 'Statistics' => %w[Maximum Minimum Average],
28
+ },
29
+ 'RequestCount' => {
30
+ 'Unit' => 'Count',
31
+ 'Statistics' => ['Sum'],
32
+ },
33
+ 'HealthyHostCount' => {
34
+ 'Units' => 'Count',
35
+ 'Statistics' => %w[Minimum Maximum Average],
36
+ },
37
+ 'UnHealthyHostCount' => {
38
+ 'Units' => 'Count',
39
+ 'Statistics' => %w[Minimum Maximum Average],
40
+ },
41
+ 'HTTPCode_ELB_4XX' => {
42
+ 'Units' => 'Count',
43
+ 'Statistics' => ['Sum'],
44
+ },
45
+ 'HTTPCode_ELB_5XX' => {
46
+ 'Units' => 'Count',
47
+ 'Statistics' => ['Sum'],
48
+ },
49
+ 'HTTPCode_Backend_2XX' => {
50
+ 'Units' => 'Count',
51
+ 'Statistics' => ['Sum'],
52
+ },
53
+ 'HTTPCode_Backend_3XX' => {
54
+ 'Units' => 'Count',
55
+ 'Statistics' => ['Sum'],
56
+ },
57
+ 'HTTPCode_Backend_4XX' => {
58
+ 'Units' => 'Count',
59
+ 'Statistics' => ['Sum'],
60
+ },
61
+ 'HTTPCode_Backend_5XX' => {
62
+ 'Units' => 'Count',
63
+ 'Statistics' => ['Sum'],
64
+ },
65
+ }
66
+ end
67
+
68
+ def base_metrics
69
+ # get last 60 seconds
70
+ start_time = (Time.now.utc - 60).iso8601
71
+ end_time = Time.now.utc.iso8601
72
+
73
+ # The base query that all metrics would get
74
+ {
75
+ 'Namespace' => 'AWS/ELB',
76
+ 'StartTime' => start_time,
77
+ 'EndTime' => end_time,
78
+ 'Period' => 60,
79
+ }
80
+ end
81
+
82
+ def tick
83
+ if options[:fog_credentials_file]
84
+ Fog.credentials_path = options[:fog_credentials_file]
85
+ Fog.credential = options[:fog_credential].to_sym
86
+ connection = Fog::AWS::CloudWatch.new
87
+ else
88
+ connection = if options[:access_key] && options[:secret_key]
89
+ Fog::AWS::CloudWatch.new({
90
+ aws_access_key_id: options[:access_key],
91
+ aws_secret_access_key: options[:secret_key],
92
+ region: options[:region],
93
+ })
94
+ else
95
+ Fog::AWS::CloudWatch.new({
96
+ use_iam_profile: true,
97
+ region: options[:region],
98
+ })
99
+ end
100
+ end
101
+
102
+ options[:elbs].each do |lb|
103
+ metric_options = standard_metrics
104
+ metric_base_options = base_metrics
105
+
106
+ options[:azs].each do |az|
107
+ metric_options.keys.sort.each do |metric_type|
108
+ merged_options = metric_base_options.merge(metric_options[metric_type])
109
+ merged_options['MetricName'] = metric_type
110
+ merged_options['Dimensions'] = if az == 'all_az'
111
+ [{ 'Name' => 'LoadBalancerName', 'Value' => lb }]
112
+ else
113
+ [
114
+ { 'Name' => 'LoadBalancerName', 'Value' => lb },
115
+ { 'Name' => 'AvailabilityZone', 'Value' => az },
116
+ ]
117
+ end
118
+
119
+ result = connection.get_metric_statistics(merged_options)
120
+
121
+ # "If no response codes in the category 2XX-5XX range are sent to clients within
122
+ # the given time period, values for these metrics will not be recorded in CloudWatch"
123
+ # next if result.body["GetMetricStatisticsResult"]["Datapoints"].empty? && metric_type =~ /[2345]XX/
124
+ #
125
+ if result.body['GetMetricStatisticsResult']['Datapoints'].empty?
126
+ standard_metrics[metric_type]['Statistics'].each do |stat_type|
127
+ event = event(lb, az, metric_type, stat_type, 0.0)
128
+ report(event)
129
+ end
130
+ next
131
+ end
132
+
133
+ # We should only ever have a single data point
134
+ result.body['GetMetricStatisticsResult']['Datapoints'][0].keys.sort.each do |stat_type|
135
+ next if stat_type == 'Unit'
136
+ next if stat_type == 'Timestamp'
137
+
138
+ unit = result.body['GetMetricStatisticsResult']['Datapoints'][0]['Unit']
139
+ metric = result.body['GetMetricStatisticsResult']['Datapoints'][0][stat_type]
140
+ event = event(lb, az, metric_type, stat_type, metric, unit)
141
+ report(event)
142
+ end
143
+ end
144
+ end
145
+ end
146
+ end
147
+
148
+ private
149
+
150
+ def event(lb, az, metric_type, stat_type, metric, unit = nil)
151
+ {
152
+ host: lb,
153
+ service: "elb.#{az}.#{metric_type}.#{stat_type}",
154
+ ttl: 60,
155
+ description: "#{lb} #{metric_type} #{stat_type} (#{unit})",
156
+ tags: ['elb_metrics'],
157
+ metric: metric,
158
+ }
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'riemann/tools'
4
+
5
+ module Riemann
6
+ module Tools
7
+ module Aws
8
+ class RdsStatus
9
+ include Riemann::Tools
10
+ require 'fog/aws'
11
+ require 'date'
12
+ require 'time'
13
+ require 'json'
14
+
15
+ opt :access_key, 'AWS access key', type: String
16
+ opt :secret_key, 'Secret access key', type: String
17
+ opt :region, 'AWS region', type: String, default: 'eu-west-1'
18
+ opt :dbinstance_identifier, 'DBInstanceIdentifier', type: String
19
+ def initialize
20
+ abort 'FATAL: specify a DB instance name, see --help for usage' unless opts[:dbinstance_identifier]
21
+ creds = if opts[:access_key] && opts[:secret_key]
22
+ {
23
+ aws_access_key_id: opts[:access_key],
24
+ aws_secret_access_key: opts[:secret_key],
25
+ }
26
+ else
27
+ { use_iam_profile: true }
28
+ end
29
+ creds['region'] = opts[:region]
30
+ @cloudwatch = Fog::AWS::CloudWatch.new(creds)
31
+ end
32
+
33
+ def tick
34
+ time = Time.new
35
+ %w[DatabaseConnections FreeableMemory FreeStorageSpace NetworkReceiveThroughput
36
+ NetworkTransmitThroughput ReadThroughput CPUUtilization].each do |metric|
37
+ result = @cloudwatch.get_metric_statistics(
38
+ 'Namespace' => 'AWS/RDS',
39
+ 'MetricName' => metric.to_s,
40
+ 'Statistics' => 'Average',
41
+ 'Dimensions' => [{ 'Name' => 'DBInstanceIdentifier', 'Value' => opts[:dbinstance_identifier].to_s }],
42
+ 'StartTime' => (time - 120).to_time.iso8601,
43
+ 'EndTime' => time.to_time.iso8601, 'Period' => 60,
44
+ )
45
+ metrics_result = result.data[:body]['GetMetricStatisticsResult']
46
+ next unless metrics_result['Datapoints'].length.positive?
47
+
48
+ datapoint = metrics_result['Datapoints'][0]
49
+ ev = {
50
+ metric: datapoint['Average'],
51
+ service: "#{opts[:dbinstance_identifier]}.#{metric} (#{datapoint['Unit']})",
52
+ description: JSON.dump(metrics_result),
53
+ state: 'ok',
54
+ ttl: 300,
55
+ }
56
+
57
+ report ev
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end