riemann-tools 1.1.1 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +2 -0
- data/.gitignore +2 -0
- data/.rubocop.yml +8 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +60 -2
- data/Rakefile +17 -3
- data/bin/riemann-apache-status +1 -106
- data/bin/riemann-bench +2 -70
- data/bin/riemann-cloudant +1 -56
- data/bin/riemann-consul +1 -106
- data/bin/riemann-dir-files-count +1 -55
- data/bin/riemann-dir-space +1 -55
- data/bin/riemann-diskstats +1 -92
- data/bin/riemann-fd +2 -81
- data/bin/riemann-freeswitch +2 -119
- data/bin/riemann-haproxy +1 -58
- data/bin/riemann-health +0 -2
- data/bin/riemann-kvminstance +2 -22
- data/bin/riemann-md +8 -0
- data/bin/riemann-memcached +1 -37
- data/bin/riemann-net +0 -2
- data/bin/riemann-nginx-status +1 -85
- data/bin/riemann-ntp +0 -2
- data/bin/riemann-portcheck +1 -44
- data/bin/riemann-proc +1 -108
- data/bin/riemann-varnish +1 -54
- data/bin/riemann-wrapper +113 -0
- data/bin/riemann-zookeeper +1 -39
- data/bin/riemann-zpool +8 -0
- data/lib/riemann/tools/apache_status.rb +107 -0
- data/lib/riemann/tools/bench.rb +72 -0
- data/lib/riemann/tools/cloudant.rb +57 -0
- data/lib/riemann/tools/consul_health.rb +107 -0
- data/lib/riemann/tools/dir_files_count.rb +56 -0
- data/lib/riemann/tools/dir_space.rb +56 -0
- data/lib/riemann/tools/diskstats.rb +94 -0
- data/lib/riemann/tools/fd.rb +81 -0
- data/lib/riemann/tools/freeswitch.rb +119 -0
- data/lib/riemann/tools/haproxy.rb +59 -0
- data/lib/riemann/tools/health.rb +150 -19
- data/lib/riemann/tools/kvm.rb +23 -0
- data/lib/riemann/tools/md.rb +35 -0
- data/lib/riemann/tools/mdstat_parser.tab.rb +340 -0
- data/lib/riemann/tools/memcached.rb +38 -0
- data/lib/riemann/tools/net.rb +2 -1
- data/lib/riemann/tools/nginx_status.rb +86 -0
- data/lib/riemann/tools/ntp.rb +1 -0
- data/lib/riemann/tools/portcheck.rb +45 -0
- data/lib/riemann/tools/proc.rb +109 -0
- data/lib/riemann/tools/riemann_client_wrapper.rb +43 -0
- data/lib/riemann/tools/uptime_parser.tab.rb +323 -0
- data/lib/riemann/tools/varnish.rb +55 -0
- data/lib/riemann/tools/version.rb +1 -1
- data/lib/riemann/tools/zookeeper.rb +40 -0
- data/lib/riemann/tools/zpool.rb +40 -0
- data/lib/riemann/tools.rb +2 -20
- data/riemann-tools.gemspec +10 -1
- data/tools/riemann-aws/Rakefile +6 -9
- data/tools/riemann-aws/bin/riemann-aws-billing +2 -87
- data/tools/riemann-aws/bin/riemann-aws-rds-status +2 -62
- data/tools/riemann-aws/bin/riemann-aws-sqs-status +2 -44
- data/tools/riemann-aws/bin/riemann-aws-status +2 -77
- data/tools/riemann-aws/bin/riemann-elb-metrics +2 -162
- data/tools/riemann-aws/bin/riemann-s3-list +2 -81
- data/tools/riemann-aws/bin/riemann-s3-status +2 -96
- data/tools/riemann-aws/lib/riemann/tools/aws/billing.rb +87 -0
- data/tools/riemann-aws/lib/riemann/tools/aws/elb_metrics.rb +163 -0
- data/tools/riemann-aws/lib/riemann/tools/aws/rds_status.rb +63 -0
- data/tools/riemann-aws/lib/riemann/tools/aws/s3_list.rb +82 -0
- data/tools/riemann-aws/lib/riemann/tools/aws/s3_status.rb +97 -0
- data/tools/riemann-aws/lib/riemann/tools/aws/sqs_status.rb +45 -0
- data/tools/riemann-aws/lib/riemann/tools/aws/status.rb +74 -0
- data/tools/riemann-chronos/Rakefile +6 -9
- data/tools/riemann-chronos/bin/riemann-chronos +1 -154
- data/tools/riemann-chronos/lib/riemann/tools/chronos.rb +157 -0
- data/tools/riemann-docker/Rakefile +5 -8
- data/tools/riemann-docker/bin/riemann-docker +2 -200
- data/tools/riemann-docker/lib/riemann/tools/docker.rb +200 -0
- data/tools/riemann-elasticsearch/Rakefile +6 -9
- data/tools/riemann-elasticsearch/bin/riemann-elasticsearch +1 -167
- data/tools/riemann-elasticsearch/lib/riemann/tools/elasticsearch.rb +170 -0
- data/tools/riemann-marathon/Rakefile +6 -9
- data/tools/riemann-marathon/bin/riemann-marathon +1 -156
- data/tools/riemann-marathon/lib/riemann/tools/marathon.rb +159 -0
- data/tools/riemann-mesos/Rakefile +6 -9
- data/tools/riemann-mesos/bin/riemann-mesos +1 -139
- data/tools/riemann-mesos/lib/riemann/tools/mesos.rb +142 -0
- data/tools/riemann-munin/Rakefile +5 -8
- data/tools/riemann-munin/bin/riemann-munin +1 -36
- data/tools/riemann-munin/lib/riemann/tools/munin.rb +37 -0
- data/tools/riemann-rabbitmq/Rakefile +6 -9
- data/tools/riemann-rabbitmq/bin/riemann-rabbitmq +1 -266
- data/tools/riemann-rabbitmq/lib/riemann/tools/rabbitmq.rb +269 -0
- data/tools/riemann-riak/Rakefile +5 -8
- data/tools/riemann-riak/bin/riemann-riak +1 -316
- data/tools/riemann-riak/bin/riemann-riak-keys +0 -1
- data/tools/riemann-riak/bin/riemann-riak-ring +0 -1
- data/tools/riemann-riak/lib/riemann/tools/riak.rb +317 -0
- metadata +64 -10
- data/.travis.yml +0 -31
- data/tools/riemann-riak/riak_status/key_count.erl +0 -13
- data/tools/riemann-riak/riak_status/riak_status.rb +0 -152
- 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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|