sensu-plugins-influxdb-metrics-checker 0.3.2 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -3
- data/README.md +17 -1
- data/bin/check-influxdb-metrics.rb +147 -21
- data/lib/sensu-plugins-influxdb-metrics-checker/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86fe26cfb281849f4b73356b47011b08bf1a7960
|
4
|
+
data.tar.gz: dca6df28cc658d7faff6274090ecb5b050b5654a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 861427b6a1b16058eb9bfc51c0186eed75d765942325762932933ec8d67efb81f0192c2804be9c4c443acd73545ce8a134ae6f5e96de219504a23ebda7b32524
|
7
|
+
data.tar.gz: 74d9af1f5b6de576c991bcece54f24041ca43d2b7128c60e7c5f7f825b4ad90eb6e1dfb49e83f711b3130c95d6c799328b35c694aab67cd7319593a2e82d1f3e
|
data/CHANGELOG.md
CHANGED
@@ -3,7 +3,13 @@ This project adheres to [Semantic Versioning](http://semver.org/).
|
|
3
3
|
|
4
4
|
This CHANGELOG follows the format listed at [Keep A Changelog](http://keepachangelog.com/)
|
5
5
|
|
6
|
-
# [0.3.
|
6
|
+
# [0.3.4] - 2017-01-17
|
7
|
+
- sixth release
|
8
|
+
Allow the usage of regex expressions that we can identify as "/^[your_regex]$". I'll strongly recommend to use this only for exceptions, and always aim for zero-exceptions, or it wouldn't be accurate. At the moment it will fire when the number of exception today is bigger than the number of exceptions yesterday.
|
9
|
+
Also, if you have the same number of metrics found (let's say, exceptions) it will compare just the first one. I'll not rely on this tool (yet) for a deep analysis of differences in exceptions.
|
10
|
+
Improve feedback when returning null from InfluxDB (usually because the query is pointing to a metric that doesn't exists).
|
11
|
+
|
12
|
+
# [0.3.2] - 2016-12-14
|
7
13
|
### Added
|
8
14
|
- fifth release
|
9
15
|
Rounded float result to 5 decimal places
|
@@ -33,5 +39,6 @@ Leaving 5 minutes to the data to consolidate.
|
|
33
39
|
[0.1.0]: https://github.com/pliyosenpai/sensu-plugins-influxdb-metrics-checker/0.1.0...0.2.0
|
34
40
|
[0.2.0]: https://github.com/pliyosenpai/sensu-plugins-influxdb-metrics-checker/0.2.0...0.2.1
|
35
41
|
[0.2.1]: https://github.com/pliyosenpai/sensu-plugins-influxdb-metrics-checker/0.2.1...0.3.0
|
36
|
-
[0.3.0]: https://github.com/pliyosenpai/sensu-plugins-influxdb-metrics-checker/0.3.0...0.3.
|
37
|
-
[0.3.
|
42
|
+
[0.3.0]: https://github.com/pliyosenpai/sensu-plugins-influxdb-metrics-checker/0.3.0...0.3.2
|
43
|
+
[0.3.2]: https://github.com/pliyosenpai/sensu-plugins-influxdb-metrics-checker/0.3.2...0.3.4
|
44
|
+
[0.3.3]: https://github.com/pliyosenpai/sensu-plugins-influxdb-metrics-checker/0.3.4...HEAD
|
data/README.md
CHANGED
@@ -40,12 +40,28 @@ ruby check-influxdb-metrics.rb --host=metrics-influxdb.internal.com --port=8086
|
|
40
40
|
|
41
41
|
```
|
42
42
|
|
43
|
-
|
43
|
+
You can set the period that you want for your queries, for example:
|
44
44
|
```
|
45
45
|
ruby check-influxdb-metrics.rb --host=metrics-influxdb.internal.com --port=8086 --user=admin --password=password -c -20 -w -10 --db=statsd_metrics --metric=api.request.counter --tag=datacenter --filter=ci --period=1440
|
46
46
|
|
47
47
|
```
|
48
48
|
|
49
|
+
## Advanced Queries
|
50
|
+
|
51
|
+
You can use Regex in your metrics. The spirit behind this feature is to gather information about exceptions only, always aiming for a zero exception policy. So I'll advise against using it for other purposes.
|
52
|
+
|
53
|
+
**How it works**
|
54
|
+
1. It will understand that is a regex only when the metric name contains '/'. In the bash you'll need to include your metric inside double quotes.
|
55
|
+
2. It will compare the number of metrics gathered today vs the number of metrics gathered yesterday.
|
56
|
+
3. If today we read more than yesterday, it will blow up as **Critical**.
|
57
|
+
4. If today we read the same number of metrics than yesterday, at the moment it will compare only the first one.
|
58
|
+
I'll not rely on this tool (yet) for a deep analysis of differences when comparing multiple metrics (such as exceptions) using Regex.
|
59
|
+
```
|
60
|
+
ruby check-influxdb-metrics.rb --host=metrics-influxdb.internal.com --port=8086 --user=admin --password=password -c -20 -w -10 --db=statsd_metrics --metric="/^prefix.datacenter.([A-Za-z0-9-]+).([A-Za-z0-9-]+).exceptions$/"
|
61
|
+
|
62
|
+
```
|
63
|
+
|
64
|
+
|
49
65
|
## Lessons learnt
|
50
66
|
The InfluxDb query language that we used is not the latest, you can find it here:
|
51
67
|
|
@@ -90,7 +90,24 @@ class CheckInfluxDbMetrics < Sensu::Plugin::Check::CLI
|
|
90
90
|
end
|
91
91
|
|
92
92
|
def base_query
|
93
|
-
|
93
|
+
'SELECT sum("value") from '
|
94
|
+
end
|
95
|
+
|
96
|
+
def base_query_with_metricname
|
97
|
+
base_query + clean_quotes_when_regex
|
98
|
+
end
|
99
|
+
|
100
|
+
def clean_quotes_when_regex
|
101
|
+
metric = " \"#{config[:metric]}\""
|
102
|
+
clean_metric = ''
|
103
|
+
if metric.include?('/')
|
104
|
+
clean_metric = metric.tr '\"', ''
|
105
|
+
@is_using_regex = true
|
106
|
+
else
|
107
|
+
clean_metric = metric
|
108
|
+
end
|
109
|
+
|
110
|
+
clean_metric
|
94
111
|
end
|
95
112
|
|
96
113
|
def today_query_for_a_period
|
@@ -108,13 +125,20 @@ class CheckInfluxDbMetrics < Sensu::Plugin::Check::CLI
|
|
108
125
|
end
|
109
126
|
|
110
127
|
def query_for_a_period(start_period, end_period)
|
111
|
-
query =
|
128
|
+
query = base_query_with_metricname + ' WHERE time > now() - ' + end_period.to_s + 'm AND time < now() - ' + start_period.to_s + 'm'
|
112
129
|
query + filter_by_environment_when_needed
|
113
130
|
end
|
114
131
|
|
115
132
|
def encode_parameters(parameters)
|
116
133
|
encodedparams = Addressable::URI.escape(parameters)
|
117
|
-
|
134
|
+
# this is needed after encoding because Addressable will not encode +. So for ex: ([A-Za-z0-9-]+) will miss the + and with that it will not find the metrics
|
135
|
+
encode_for_regex = if @is_using_regex
|
136
|
+
encodedparams.gsub! '+', '%2B'
|
137
|
+
else
|
138
|
+
encodedparams
|
139
|
+
end
|
140
|
+
|
141
|
+
"#{config[:db]}&q=" + encode_for_regex
|
118
142
|
end
|
119
143
|
|
120
144
|
def yesterday_query_encoded
|
@@ -128,30 +152,108 @@ class CheckInfluxDbMetrics < Sensu::Plugin::Check::CLI
|
|
128
152
|
end
|
129
153
|
|
130
154
|
def today_value
|
131
|
-
|
132
|
-
|
133
|
-
|
155
|
+
response = request(today_query_encoded)
|
156
|
+
metrics = parse_json(response)
|
157
|
+
@today_metric_count = validate_metrics_and_count(metrics)
|
158
|
+
value = if @today_metric_count > 0
|
159
|
+
series = read_series_from_metrics(metrics)
|
160
|
+
@today_metrics = store_metrics(series)
|
161
|
+
read_value_from_series(series)
|
162
|
+
end
|
163
|
+
value
|
134
164
|
end
|
135
165
|
|
136
166
|
def yesterday_value
|
137
|
-
|
138
|
-
|
139
|
-
|
167
|
+
response = request(yesterday_query_encoded)
|
168
|
+
metrics = parse_json(response)
|
169
|
+
@yesterday_metric_count = validate_metrics_and_count(metrics)
|
170
|
+
value = if @today_metric_count > 0
|
171
|
+
series = read_series_from_metrics(metrics)
|
172
|
+
@yesterday_metrics = store_metrics(series)
|
173
|
+
read_value_from_series(series)
|
174
|
+
end
|
175
|
+
value
|
140
176
|
end
|
141
177
|
|
142
|
-
def
|
143
|
-
|
144
|
-
|
145
|
-
values = series[0]['values'][0][1]
|
178
|
+
def metric_bigger_than_zero?(metric)
|
179
|
+
metric > 0
|
180
|
+
end
|
146
181
|
|
147
|
-
|
148
|
-
|
182
|
+
def using_regex?(using_regex)
|
183
|
+
using_regex == true
|
184
|
+
end
|
185
|
+
|
186
|
+
def read_series_from_metrics(metrics)
|
187
|
+
metrics[0]['series']
|
188
|
+
end
|
189
|
+
|
190
|
+
def validate_metrics_and_count(metrics)
|
191
|
+
if metrics.empty? || metrics.nil? || metrics[0].nil? || metrics[0]['series'].nil? || metrics[0]['series'][0]['values'][0][1].nil?
|
192
|
+
0
|
193
|
+
else
|
194
|
+
metrics[0]['series'].count
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def parse_json(response)
|
199
|
+
JSON.parse(response.to_str)['results']
|
200
|
+
end
|
201
|
+
|
202
|
+
def read_value_from_series(series)
|
203
|
+
if series.nil?
|
204
|
+
0
|
205
|
+
elsif series[0]['values'][0][1].nil?
|
206
|
+
0
|
207
|
+
else
|
208
|
+
values = series[0]['values'][0][1]
|
209
|
+
values.to_f
|
149
210
|
end
|
211
|
+
end
|
150
212
|
|
151
|
-
|
213
|
+
def store_metrics(series)
|
214
|
+
regex_metrics = Hash.new {}
|
215
|
+
if series.nil? == false && series.count > 0
|
216
|
+
series.each do |values|
|
217
|
+
value = values['values'][0][1]
|
218
|
+
regex_metrics[values['name']] = value.to_f
|
219
|
+
end
|
220
|
+
regex_metrics
|
221
|
+
end
|
152
222
|
end
|
153
223
|
|
154
|
-
def
|
224
|
+
def display_metrics
|
225
|
+
puts 'Today metrics analysis: '
|
226
|
+
@today_metrics.each do |key, value|
|
227
|
+
puts 'For: ' + key + ' : ' + value.to_s
|
228
|
+
end
|
229
|
+
end
|
230
|
+
|
231
|
+
def difference_for_regex_and_notify
|
232
|
+
# different or more number of metrics for today could be a problem. Regex is designed to catch exceptions, so more exceptions -> alert
|
233
|
+
if @today_metric_count == 0 && @yesterday_metric_count == 0
|
234
|
+
ok 'no metrics found'
|
235
|
+
elsif @today_metric_count > @yesterday_metric_count
|
236
|
+
display_metrics
|
237
|
+
critical "For \"#{config[:metric]}\" more metrics were tracked today than yesterday. Check them out above"
|
238
|
+
elsif @today_metric_count == @yesterday_metric_count
|
239
|
+
compare_each_metric_in_regex
|
240
|
+
else
|
241
|
+
ok 'regex seems ok ' + @today_metric_count.to_s + ' metrics found today vs ' + @yesterday_metric_count.to_s + ' metrics found yesterday'
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
def compare_each_metric_in_regex
|
246
|
+
@today_metrics.each do |today_key, today_value|
|
247
|
+
@yesterday_metrics.each do |yesterday_key, yesterday_value|
|
248
|
+
if today_key.eql? yesterday_key
|
249
|
+
puts yesterday_value.to_s + ' vs ' + today_value.to_s + ' for ' + today_key
|
250
|
+
difference_for_standard_queries(today_value, yesterday_value)
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
256
|
+
def difference_between_two_metrics(original, newnumber)
|
155
257
|
decrease = original - newnumber
|
156
258
|
decrease.to_f / original.to_f * 100
|
157
259
|
end
|
@@ -169,6 +271,7 @@ class CheckInfluxDbMetrics < Sensu::Plugin::Check::CLI
|
|
169
271
|
end
|
170
272
|
|
171
273
|
def evaluate_percentage_and_notify(difference)
|
274
|
+
puts 'Difference of: ' + difference.round(4).to_s + ' % for a period of ' + config[:period].to_s + 'm'
|
172
275
|
if difference < config[:crit]
|
173
276
|
critical "\"#{config[:metric]}\" difference is below allowed minimum of #{config[:crit]} %"
|
174
277
|
elsif difference < config[:warn]
|
@@ -178,16 +281,39 @@ class CheckInfluxDbMetrics < Sensu::Plugin::Check::CLI
|
|
178
281
|
end
|
179
282
|
end
|
180
283
|
|
181
|
-
def
|
182
|
-
difference =
|
183
|
-
|
284
|
+
def calculate_difference_and_display_result(today, yesterday)
|
285
|
+
difference = if @is_using_regex
|
286
|
+
difference_for_regex_and_notify
|
287
|
+
else
|
288
|
+
difference_for_standard_queries(today, yesterday)
|
289
|
+
end
|
290
|
+
difference
|
291
|
+
end
|
292
|
+
|
293
|
+
def difference_for_standard_queries(today, yesterday)
|
294
|
+
difference = difference_between_two_metrics(today, yesterday)
|
184
295
|
evaluate_percentage_and_notify(difference)
|
296
|
+
end
|
297
|
+
|
298
|
+
def difference_in_metrics
|
299
|
+
today = today_value
|
300
|
+
yesterday = yesterday_value
|
301
|
+
if today.nil? && yesterday.nil?
|
302
|
+
puts 'No results coming from InfluxDB either for Today nor Yesterday. Please check your query or try again'
|
303
|
+
else
|
304
|
+
calculate_difference_and_display_result(today, yesterday)
|
305
|
+
end
|
306
|
+
exit
|
307
|
+
end
|
308
|
+
|
309
|
+
def run
|
310
|
+
difference_in_metrics
|
185
311
|
|
186
312
|
rescue Errno::ECONNREFUSED => e
|
187
313
|
critical 'InfluxDB is not responding' + e.message
|
188
314
|
rescue RestClient::RequestTimeout
|
189
315
|
critical 'InfluxDB Connection timed out'
|
190
316
|
rescue StandardError => e
|
191
|
-
unknown 'An exception occurred:' + e.message
|
317
|
+
unknown 'An exception occurred: ' + e.message
|
192
318
|
end
|
193
319
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensu-plugins-influxdb-metrics-checker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Juanjo Guerrero Cerezuela
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-01-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sensu-plugin
|