sensu-plugins-influxdb-metrics-checker 0.3.2 → 0.3.4
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/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
|