sensu-plugins-couchbase 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 73d44423ac402b16af93efaa1b933eaecb22d53b
4
- data.tar.gz: e965ec7100c3b760af9b4f9f7ef74a9b3f7d9bf8
3
+ metadata.gz: 5aab37121a62f6578b8f1b3b4111a19d76afffb7
4
+ data.tar.gz: e3fc6a269e5ff21b9595e56799d64df095c02579
5
5
  SHA512:
6
- metadata.gz: 75a9651c3b0c17729c9c255c7e326d6b6f6a7e8523ddc0a40698028d1d10e8f25896751dcb13eaaa688256486885c8b5af2da662978110fa1ae59c6e7e81d883
7
- data.tar.gz: a995a04dc0ba668fd6ebbc147c36d34bd1d5d2651dc4888b2c49e91fd9cf45402a5f02c2aa5cca3d11f1bced3d0eb9ed08e58a5cd60f0e5ff3cb7e9ebac6bcdb
6
+ metadata.gz: 6f70878045a20540a290b1d48f50aa1026cda5e3f4f594514ca1c06345b99e6858afa9feea62526f707b919183e1abe098833158a94614f92c82a6c0e330ff15
7
+ data.tar.gz: c735ec7f613d60827a74a3564929a0bb98672ab08446913af9e9b7ce1a4d893e786d687e29e1f89e449264c8d1fd0e9b0f6e409132f6e4b590bc51f70c0ca67a
checksums.yaml.gz.sig CHANGED
@@ -1 +1 @@
1
- t�Ox$���1Tq;HyG�#�y���xFNX$����5�G���
1
+ N�s<Z����y×� \���4���t��CA���1S�`M�R ��ȉQ�b��ףf�Y薊�ĎsK��n��dI��hNm��p��L�g��\(� ���Y��m�[)T ,�9��պuБ�O&}0t��(�E�i�Q������������ڵ����$~�� ��I����E�)�Z�����Oqn|�.4b5�Ѹ� Ɲ�j�3^Glg8�2�-P�_��f�vy���)5ŃR�ïZ�"���K:�sY��a�~
data.tar.gz.sig CHANGED
@@ -1,2 +1 @@
1
- br���W�כ�(��s����q����v���,���NAnY�~�^A��9�7�N4
2
- h���?�c�Tqf� L�*Xs\�Tk��{��\���R]�� <��]�3U�jݲ��м�,�����ӟZ캱�uZܧ{>��1L���a�R%CH�*hF�������K�E����ag��';��R�,NPcUr�.\��=j��1� >@����Ƌ��Z�ѷ �����|�?Z
1
+ 2��WL����|k���?�Q��!�/Flc��3�*ߋ.�o��=wj7ox�������lj7��2��rP Q@�7����t}U���hKP��߈��m��*.���0��6���%\]��ݒ-?N]Ad:��m��
data/CHANGELOG.md CHANGED
@@ -3,21 +3,30 @@ 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
- ## Unreleased][unreleased]
6
+ ## Unreleased
7
+
8
+ ## 0.1.0 - 2015-08-11
9
+ ### Added
10
+ - add metrics-couchbase.py plugin (requires python requests,DNS modules)
7
11
 
8
12
  ## [0.0.3] - 2015-07-14
9
13
  ### Changed
10
14
  - updated sensu-plugin gem to 1.2.0
11
15
 
12
- ## 0.0.1 - 2015-05-04
13
-
14
- ### Added
15
- - initial release
16
-
17
- ## 0.0.2 - 2015-06-02
16
+ ## [0.0.2] - 2015-06-02
18
17
 
19
18
  ### Fixed
20
19
  - added binstubs
21
20
 
22
21
  ### Changed
23
- - removed cruft from /lib
22
+ - removed cruft from /lib
23
+
24
+ ## 0.0.1 - 2015-05-04
25
+
26
+ ### Added
27
+ - initial release
28
+
29
+ [unreleased]: https://github.com/sensu-plugins/sensu-plugins-ssl/compare/0.1.0...HEAD
30
+ [0.1.0]: https://github.com/sensu-plugins/sensu-plugins-ssl/compare/0.0.3...0.1.0
31
+ [0.0.3]: https://github.com/sensu-plugins/sensu-plugins-ssl/compare/0.0.2...0.0.3
32
+ [0.0.2]: https://github.com/sensu-plugins/sensu-plugins-ssl/compare/0.0.1...0.0.2
data/README.md CHANGED
@@ -16,6 +16,6 @@
16
16
 
17
17
  ## Installation
18
18
 
19
- [Installation and Setup](https://github.com/sensu-plugins/documentation/blob/master/user_docs/installation_instructions.md)
19
+ [Installation and Setup](http://sensu-plugins.io/docs/installation_instructions.html)
20
20
 
21
21
  ## Notes
@@ -72,7 +72,7 @@ class CheckCouchbase < Sensu::Plugin::Check::CLI
72
72
  short: '-b BUCKET',
73
73
  long: '--bucket BUCKET'
74
74
 
75
- def run # rubocop:disable all
75
+ def run
76
76
  begin
77
77
  resource = '/pools/default/buckets'
78
78
  response = RestClient::Request.new(
@@ -0,0 +1,465 @@
1
+ #!/usr/bin/env python
2
+ #
3
+ # metrics-couchbase.py
4
+ #
5
+ # DESCRIPTION:
6
+ # Collects several couchbase stats using the couchbase stats REST API endpoints
7
+ #
8
+ # OUTPUT:
9
+ # graphite plain text protocol
10
+ #
11
+ # PLATFORMS:
12
+ # Linux
13
+ #
14
+ # DEPENDENCIES:
15
+ # python module: requests http://www.python-requests.org
16
+ # python module: pydns http://pydns.sourceforge.net
17
+ #
18
+ # USAGE:
19
+ # metrics-couchbase.py -u <user> -p <pw> -c <cb_host> [-s graphite_scheme] [-d] [-b] [-r]
20
+ # NOTES:
21
+ # This plugin gets *all* the CB cluster members dynamically and grab all the
22
+ # stats it can, in addition it grabs per bucket stats so be prepared for
23
+ # lots of stats...On a prod small CB cluster the output is ~5000 metrics.
24
+ # LICENSE:
25
+ # Jaime Gago contact@jaimegago.com
26
+ # Released under the same terms as Sensu (the MIT license); see LICENSE
27
+ # for details.
28
+ #
29
+
30
+ import DNS
31
+ import logging
32
+ import logging.handlers
33
+ import optparse
34
+ import requests
35
+ import sys
36
+ import time
37
+ from operator import add
38
+
39
+ FAILURE_CONSTANT = 1
40
+
41
+ PER_BUCKET_PER_NODE_STATS = [
42
+ 'cas_hits',
43
+ 'cmd_get',
44
+ 'cmd_set',
45
+ 'curr_connections',
46
+ 'cpu_utilization_rate',
47
+ 'curr_items',
48
+ 'decr_hits',
49
+ 'decr_misses',
50
+ 'delete_misses',
51
+ 'delete_hits',
52
+ 'ep_bg_fetched',
53
+ 'ep_flusher_todo',
54
+ 'ep_max_size',
55
+ 'ep_mem_high_wat',
56
+ 'ep_mem_low_wat',
57
+ 'ep_tmp_oom_errors',
58
+ 'ep_queue_size',
59
+ 'incr_hits',
60
+ 'incr_misses',
61
+ 'mem_used',
62
+ 'ops',
63
+ 'vb_active_eject',
64
+ 'vb_active_itm_memory',
65
+ 'vb_active_meta_data_memory',
66
+ 'vb_active_num',
67
+ 'vb_active_queue_drain',
68
+ 'vb_active_queue_fill',
69
+ 'vb_active_queue_size',
70
+ 'vb_active_resident_items_ratio',
71
+ 'vb_replica_num'
72
+ ]
73
+
74
+ PER_BUCKET_STATS = [
75
+ 'cas_hits',
76
+ 'cmd_get',
77
+ 'cmd_set',
78
+ 'curr_items',
79
+ 'decr_hits',
80
+ 'decr_misses',
81
+ 'incr_hits',
82
+ 'incr_misses',
83
+ 'ops',
84
+ 'vb_active_resident_items_ratio',
85
+ ]
86
+
87
+ WRITE_STATS = [
88
+ 'cmd_set',
89
+ 'incr_misses',
90
+ 'incr_hits',
91
+ 'decr_misses',
92
+ 'decr_hits',
93
+ 'cas_hits'
94
+ ]
95
+
96
+ # Helper functions
97
+ def set_syslog():
98
+ '''Set a syslog logger'''
99
+ try:
100
+ logger = logging.getLogger(__name__)
101
+ logger.setLevel(logging.DEBUG)
102
+
103
+ formatter = logging.Formatter("%(pathname)s: %(message)s")
104
+
105
+ handler = logging.handlers.SysLogHandler(address = '/dev/log')
106
+ handler.setFormatter(formatter)
107
+ logger.addHandler(handler)
108
+ except Exception:
109
+ logging.critical("Failed to configure syslog handler")
110
+ sys.exit(1)
111
+ return logger
112
+
113
+ def min_med_max_avg(floats):
114
+ '''Return dict with min,median,max,avg(integers) from a list of floats'''
115
+ min_med_max_avg = {}
116
+ # Median calculations
117
+ values = sorted(floats)
118
+ midpoint = len(values) / 2
119
+ if len(values) % 2 == 0:
120
+ med = avg(values[midpoint:midpoint+2])
121
+ else:
122
+ med = values[midpoint]
123
+ min_med_max_avg['min'] = min(floats)
124
+ min_med_max_avg['med'] = med
125
+ min_med_max_avg['max'] = max(floats)
126
+ min_med_max_avg['avg'] = avg(floats)
127
+ return min_med_max_avg
128
+
129
+ def avg(floats):
130
+ length = len(floats)
131
+ total = sum(floats)
132
+ return total / length
133
+
134
+ def dns_reverse_lookup(dns_server, timeout_in_sec, ip, logger):
135
+ '''Tries to return a hostname doing a DNS rev lookup'''
136
+ dns_answered = False
137
+ try:
138
+ reversed_ip = '.'.join(ip.split('.')[::-1])
139
+ except Exception as e:
140
+ logger.critical('not a valid IP')
141
+ logger.critical(e)
142
+ sys.exit(FAILURE_CONSTANT)
143
+ try:
144
+ dns_obj = DNS.DnsRequest(server=dns_server, timeout=timeout_in_sec)
145
+ except Exception, error:
146
+ logger.critical('failed to talk to DNS NS')
147
+ logger.critical(e)
148
+ sys.exit(FAILURE_CONSTANT)
149
+ try:
150
+ dns_response = dns_obj.req(reversed_ip + '.in-addr.arpa', qtype='PTR')
151
+ if len(dns_response.answers):
152
+ dns_answered = True
153
+ except Exception as e:
154
+ logger.info('failed to rev lookup target IP')
155
+ logger.info(e)
156
+ pass
157
+ if dns_answered:
158
+ return dns_response.answers[0]['data'].split('.')[0]
159
+ else:
160
+ return ip
161
+
162
+ def strip_port(ip_and_port, logger):
163
+ '''strips :1234 from 10.10.10.10:1234'''
164
+ try:
165
+ ip, port = ip_and_port.split(':')
166
+ except Exception as e:
167
+ logger.critical('could not strip port from %s' % ip_and_port)
168
+ logger.critical(e)
169
+ return ip
170
+
171
+ def graphite_printer(all_stats, date, scheme, host_format=False):
172
+ '''Takes a dict with stats_compute func structure flattens it for Graphite
173
+ plain text protocol'''
174
+
175
+ for host in all_stats:
176
+ if host_format:
177
+ host_formated = host.replace('.', '_')
178
+ host_formated = host_formated.replace(':', '_')
179
+ else:
180
+ host_formated = host
181
+ for bucket in all_stats[host]:
182
+ for stat_name in all_stats[host][bucket]:
183
+ for stats in all_stats[host][bucket][stat_name]:
184
+ value = all_stats[host][bucket][stat_name][stats]
185
+ if host_formated == 'per_bucket':
186
+ print "%s.%s.%s.%s.%s %s %d" % (scheme, host_formated, bucket,
187
+ stat_name, stats, value, date)
188
+ else:
189
+ print "%s.per_bucket_per_node.%s.%s.%s.%s %s %d" % (scheme, host_formated, bucket,
190
+ stat_name, stats, value, date)
191
+
192
+ # Couchbase API dedicated functions
193
+ def get_buckets(couchbase_host, couchbase_rest_port, user, password, logger):
194
+ '''Get CouchBase buckets from REST API'''
195
+ try:
196
+ query = 'http://%s:%s/pools/default/buckets' % (couchbase_host,
197
+ couchbase_rest_port)
198
+ response = requests.get(query, auth=(user, password))
199
+ data = response.json()
200
+ except Exception as e:
201
+ logger.critical('Could not get buckets from Couchbase REST API')
202
+ logger.critical(e)
203
+ sys.exit(FAILURE_CONSTANT)
204
+ buckets = []
205
+ for bucket in data:
206
+ buckets.append(bucket['name'])
207
+ return buckets
208
+
209
+ def get_nodes_in_cluster(couchbase_host, couchbase_rest_port, user, password,
210
+ logger):
211
+ '''Get Couchbase cluster hostnames from REST API'''
212
+ try:
213
+ query = 'http://%s:%s/pools/default' % (couchbase_host, couchbase_rest_port)
214
+ response = requests.get(query, auth=(user, password))
215
+ data = response.json()
216
+ except Exception as e:
217
+ logger.critical('Could not get nodes from Couchbase REST API')
218
+ logger.critical(e)
219
+ sys.exit(FAILURE_CONSTANT)
220
+ cb_nodes = []
221
+ for node in data['nodes']:
222
+ if node['clusterMembership'] == 'active':
223
+ cb_nodes.append(node['hostname'])
224
+ return cb_nodes
225
+
226
+ def urls_generator(couchbase_host, couchbase_rest_port, buckets,
227
+ couchbase_nodes, logger, bucket_format=False):
228
+ # This hits the same host to get all the stats but it can be changed to
229
+ # hit each Couchbase node host for the per node stats
230
+ '''Generate URLs from buckets and nodes to hit Couchbase REST API
231
+
232
+ returns dict with following data structure:
233
+
234
+ {'per_bucket_cluster_urls':[ ('per_bucket',<bucket_foo>,<URL_foo>),
235
+ ('per_bucket',<bucket_bar>,<URL_bar>),...],
236
+
237
+ 'per_bucket_per_nodes_urls':[ (<node_foo>,<bucket_foo>,<URL_foo>),
238
+ (<node_foo>,<bucket_bar>,<URL_bar>),
239
+ (<node_baz>,<bucket_foo>,<URL_baz>),...]
240
+ }'''
241
+
242
+ cluster_nodes_buckets_urls = {}
243
+ cluster_stats_urls = []
244
+ per_node_urls = []
245
+ for bucket in buckets:
246
+ try:
247
+ cluster_url = "http://%s:%s/pools/default/buckets/%s/stats" % (
248
+ couchbase_host, couchbase_rest_port, bucket)
249
+ if bucket_format:
250
+ bucket_formated = bucket.replace('.', '_')
251
+ else:
252
+ bucket_formated = bucket
253
+ cluster_bucket_url = ('per_bucket', bucket_formated, cluster_url)
254
+ cluster_stats_urls.append(cluster_bucket_url)
255
+ except Exception as e:
256
+ logger.critical('Failed to generate list of URLs for per cluster queries')
257
+ logger.critical(e)
258
+ sys.exit(FAILURE_CONSTANT)
259
+ try:
260
+ for couchbase_node in couchbase_nodes:
261
+ node_url = "http://%s:%s/pools/default/buckets/%s/nodes/%s/stats" % (
262
+ couchbase_host, couchbase_rest_port, bucket, couchbase_node)
263
+ if bucket_format:
264
+ bucket_formated = bucket.replace('.', '_')
265
+ else:
266
+ bucket_formated = bucket
267
+ node_bucket_url = (couchbase_node, bucket_formated, node_url)
268
+ per_node_urls.append(node_bucket_url)
269
+ except Exception as e:
270
+ logger.critical('Failed to generate list of urls for per node queries')
271
+ logger.critical(e)
272
+
273
+ cluster_nodes_buckets_urls['per_bucket_cluster_urls'] = cluster_stats_urls
274
+ cluster_nodes_buckets_urls['per_bucket_per_nodes_urls'] = per_node_urls
275
+ return cluster_nodes_buckets_urls
276
+
277
+ def get_stats(url, user, password, cutoff, logger):
278
+ '''Get couchbase stats (JSON) via REST API'''
279
+ try:
280
+ params = { 'haveTStamp': cutoff, 'zoom':'minute'}
281
+ response = requests.get(url, auth=(user, password), params=params)
282
+ return response.json()
283
+ except Exception as e:
284
+ logger.critical('Could not retrieve json data from %s' % url)
285
+ logger.critical(e)
286
+ sys.exit(FAILURE_CONSTANT)
287
+
288
+ def stats_compute(hosts_buckets_urls, stats_names, write_stats, user,
289
+ password, cutoff, logger):
290
+ hosts_buckets_stats = {}
291
+ hosts_buckets_write_stats = {}
292
+ for host_bucket_url in hosts_buckets_urls:
293
+ host = host_bucket_url[0]
294
+ bucket = host_bucket_url[1]
295
+ url = host_bucket_url[2]
296
+ stats = get_stats(url, user, password, cutoff, logger)
297
+ stats_names_values = {}
298
+ bucket_stats_names_values = {}
299
+ # Needed because of len(stats) inconsistency in between queries
300
+ number_of_data_points = len(stats['op']['samples'][write_stats[0]])
301
+
302
+ # Calculate regular stats
303
+ if host not in hosts_buckets_stats:
304
+ hosts_buckets_stats[host] = {}
305
+
306
+ for stat_name in stats_names:
307
+ stats_names_values[stat_name] = min_med_max_avg(
308
+ stats['op']['samples'][stat_name])
309
+ bucket_stats_names_values[bucket] = stats_names_values
310
+ host_buckets_stats_names_values = hosts_buckets_stats[host].copy()
311
+ host_buckets_stats_names_values.update(bucket_stats_names_values)
312
+
313
+ hosts_buckets_stats[host] = host_buckets_stats_names_values
314
+
315
+ # Calculate write sums per bucket basis (per index)
316
+ if host not in hosts_buckets_write_stats:
317
+ hosts_buckets_write_stats[host] = {}
318
+
319
+ if bucket not in hosts_buckets_write_stats[host]:
320
+ hosts_buckets_write_stats[host][bucket] = {}
321
+ # During testing got both 59 and 60 length depending on the buckets
322
+ # (consistent per query) so we initialize the write sum list length
323
+ # to the right value on a per bucket basis
324
+ hosts_buckets_write_stats[host][bucket]['writes'] = [ 0 for x in range(0,
325
+ number_of_data_points) ]
326
+
327
+ for write_stat_name in write_stats:
328
+ hosts_buckets_write_stats[host][bucket]['writes'] = map(add, stats[
329
+ 'op']['samples'][write_stat_name], hosts_buckets_write_stats[host][
330
+ bucket]['writes'])
331
+
332
+ hosts_buckets_write_stats[host][bucket]['writes'] = min_med_max_avg(
333
+ hosts_buckets_write_stats[host][bucket]['writes'])
334
+
335
+ # Merge the write stats to the regular stats
336
+ for host in hosts_buckets_write_stats:
337
+ for bucket in hosts_buckets_write_stats[host]:
338
+ hosts_buckets_stats[host][bucket]['writes'] = hosts_buckets_write_stats[
339
+ host][bucket]['writes']
340
+ return hosts_buckets_stats
341
+
342
+ def main():
343
+ parser = optparse.OptionParser()
344
+
345
+ parser.add_option('-c', '--couchbase-host',
346
+ help = 'Couchbase metrics source host',
347
+ dest = 'couchbase_host',
348
+ metavar = 'COUCHBASE_HOST',
349
+ type = str)
350
+
351
+ parser.add_option('-b', '--bucket_format',
352
+ help = 'replaces dots (.) in buckets names with underscores (_)',
353
+ action = 'store_true',
354
+ default = False,
355
+ dest = 'bucket_format')
356
+
357
+ parser.add_option('-d', '--dns-lookup',
358
+ help = 'Try a rev DNS lookup for couchbase nodes host',
359
+ action = 'store_true',
360
+ default = False,
361
+ dest = 'rev_dns')
362
+
363
+ parser.add_option('-i', '--interval',
364
+ help = 'Interval for stat collection in seconds, default to 60',
365
+ dest = 'interval',
366
+ default = 60,
367
+ metavar = 'INTERVAL',
368
+ type = int)
369
+
370
+ parser.add_option('-r', '--host_format',
371
+ help = 'replaces dots (.) in nodes hostnames with underscores (_)',
372
+ action = 'store_true',
373
+ default = False,
374
+ dest = 'host_format')
375
+
376
+ parser.add_option('-n', '--dns-name-server',
377
+ help = 'dns server for rev lookups',
378
+ dest = 'dns_ns',
379
+ default = '8.8.8.8',
380
+ metavar = 'DNS_NAMESERVER',
381
+ type = str)
382
+
383
+ parser.add_option('-s', '--scheme',
384
+ help = 'Metric Graphite naming scheme, text to prepend to metric',
385
+ default = 'couchbase',
386
+ dest = 'graphite_scheme',
387
+ metavar = 'SCHEME')
388
+
389
+ parser.add_option('-u', '--user',
390
+ help = 'couchbase user with access to rest',
391
+ dest = 'user',
392
+ metavar = 'USER')
393
+
394
+ parser.add_option('-p', '--password',
395
+ help = 'couchbase user password',
396
+ dest = 'password',
397
+ metavar = 'PASSWORD')
398
+
399
+ parser.add_option('-w', '--couchbase_rest_port',
400
+ help = 'couchbase REST port, defaults to 8091',
401
+ default = 8091,
402
+ dest = 'couchbase_rest_port',
403
+ metavar = 'COUCHBASE_REST_PORT')
404
+
405
+ (options, args) = parser.parse_args()
406
+
407
+ if not options.couchbase_host:
408
+ print 'A couchbase metrics source host is required'
409
+ sys.exit(FAILURE_CONSTANT)
410
+
411
+ if not options.user or not options.password:
412
+ print 'A couchbase user and password are required'
413
+ sys.exit(FAILURE_CONSTANT)
414
+
415
+ couchbase_host = options.couchbase_host
416
+ couchbase_rest_port = options.couchbase_rest_port
417
+ dns_ns = options.dns_ns
418
+ interval = options.interval
419
+ password = options.password
420
+ graphite_scheme = options.graphite_scheme
421
+ user = options.user
422
+
423
+ logger = set_syslog()
424
+
425
+ cutoff = int(time.time() - interval)
426
+
427
+ # Generate URLs to hit for all buckets and all nodes
428
+ buckets = get_buckets(couchbase_host, couchbase_rest_port, user, password,
429
+ logger)
430
+ cb_nodes = get_nodes_in_cluster(couchbase_host, couchbase_rest_port, user,
431
+ password, logger)
432
+ buckets_nodes_and_cluster_urls = urls_generator(couchbase_host,
433
+ couchbase_rest_port, buckets, cb_nodes, logger,
434
+ bucket_format=options.bucket_format)
435
+ # Get and compute the stats
436
+
437
+ ## Cluster stats
438
+ cluster_buckets_urls = buckets_nodes_and_cluster_urls[
439
+ 'per_bucket_cluster_urls']
440
+ cluster_stats = stats_compute(cluster_buckets_urls, PER_BUCKET_STATS,
441
+ WRITE_STATS, user, password, cutoff, logger)
442
+
443
+ ## Per node stats
444
+ nodes_buckets_urls = buckets_nodes_and_cluster_urls[
445
+ 'per_bucket_per_nodes_urls']
446
+ node_stats = stats_compute(nodes_buckets_urls, PER_BUCKET_PER_NODE_STATS,
447
+ WRITE_STATS, user, password, cutoff, logger)
448
+ ### Replace nodes IPs with hostnames via DNS rev lookup
449
+ if options.rev_dns:
450
+ node_stats_hostnames = {}
451
+ for host in node_stats:
452
+ ip = strip_port(host,logger)
453
+ hostname = dns_reverse_lookup(dns_ns, 5, ip, logger)
454
+ node_stats_hostnames[hostname] = node_stats[host]
455
+ node_stats = node_stats_hostnames
456
+
457
+ all_stats = cluster_stats.copy()
458
+ all_stats.update(node_stats)
459
+
460
+ now = time.time()
461
+ graphite_printer(all_stats, now, options.graphite_scheme,
462
+ host_format=options.host_format)
463
+
464
+ if __name__ == '__main__':
465
+ main()
@@ -1,8 +1,8 @@
1
1
  module SensuPluginsCouchbase
2
2
  module Version
3
3
  MAJOR = 0
4
- MINOR = 0
5
- PATCH = 2
4
+ MINOR = 1
5
+ PATCH = 0
6
6
 
7
7
  VER_STRING = [MAJOR, MINOR, PATCH].compact.join('.')
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sensu-plugins-couchbase
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sensu Plugins and contributors
@@ -30,7 +30,7 @@ cert_chain:
30
30
  8sHuVruarogxxKPBzlL2is4EUb6oN/RdpGx2l4254+nyR+abg//Ed27Ym0PkB4lk
31
31
  HP0m8WSjZmFr109pE/sVsM5jtOCvogyujQOjNVGN4gz1wwPr
32
32
  -----END CERTIFICATE-----
33
- date: 2015-07-14 00:00:00.000000000 Z
33
+ date: 2015-08-12 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: rest_client
@@ -61,103 +61,103 @@ dependencies:
61
61
  - !ruby/object:Gem::Version
62
62
  version: 1.2.0
63
63
  - !ruby/object:Gem::Dependency
64
- name: codeclimate-test-reporter
64
+ name: bundler
65
65
  requirement: !ruby/object:Gem::Requirement
66
66
  requirements:
67
67
  - - "~>"
68
68
  - !ruby/object:Gem::Version
69
- version: '0.4'
69
+ version: '1.7'
70
70
  type: :development
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - "~>"
75
75
  - !ruby/object:Gem::Version
76
- version: '0.4'
76
+ version: '1.7'
77
77
  - !ruby/object:Gem::Dependency
78
- name: rubocop
78
+ name: codeclimate-test-reporter
79
79
  requirement: !ruby/object:Gem::Requirement
80
80
  requirements:
81
- - - '='
81
+ - - "~>"
82
82
  - !ruby/object:Gem::Version
83
- version: '0.30'
83
+ version: '0.4'
84
84
  type: :development
85
85
  prerelease: false
86
86
  version_requirements: !ruby/object:Gem::Requirement
87
87
  requirements:
88
- - - '='
88
+ - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '0.30'
90
+ version: '0.4'
91
91
  - !ruby/object:Gem::Dependency
92
- name: rspec
92
+ name: github-markup
93
93
  requirement: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '3.1'
97
+ version: '1.3'
98
98
  type: :development
99
99
  prerelease: false
100
100
  version_requirements: !ruby/object:Gem::Requirement
101
101
  requirements:
102
102
  - - "~>"
103
103
  - !ruby/object:Gem::Version
104
- version: '3.1'
104
+ version: '1.3'
105
105
  - !ruby/object:Gem::Dependency
106
- name: bundler
106
+ name: rake
107
107
  requirement: !ruby/object:Gem::Requirement
108
108
  requirements:
109
109
  - - "~>"
110
110
  - !ruby/object:Gem::Version
111
- version: '1.7'
111
+ version: '10.0'
112
112
  type: :development
113
113
  prerelease: false
114
114
  version_requirements: !ruby/object:Gem::Requirement
115
115
  requirements:
116
116
  - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '1.7'
118
+ version: '10.0'
119
119
  - !ruby/object:Gem::Dependency
120
- name: rake
120
+ name: redcarpet
121
121
  requirement: !ruby/object:Gem::Requirement
122
122
  requirements:
123
123
  - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '10.0'
125
+ version: '3.2'
126
126
  type: :development
127
127
  prerelease: false
128
128
  version_requirements: !ruby/object:Gem::Requirement
129
129
  requirements:
130
130
  - - "~>"
131
131
  - !ruby/object:Gem::Version
132
- version: '10.0'
132
+ version: '3.2'
133
133
  - !ruby/object:Gem::Dependency
134
- name: github-markup
134
+ name: rubocop
135
135
  requirement: !ruby/object:Gem::Requirement
136
136
  requirements:
137
- - - "~>"
137
+ - - '='
138
138
  - !ruby/object:Gem::Version
139
- version: '1.3'
139
+ version: 0.32.1
140
140
  type: :development
141
141
  prerelease: false
142
142
  version_requirements: !ruby/object:Gem::Requirement
143
143
  requirements:
144
- - - "~>"
144
+ - - '='
145
145
  - !ruby/object:Gem::Version
146
- version: '1.3'
146
+ version: 0.32.1
147
147
  - !ruby/object:Gem::Dependency
148
- name: redcarpet
148
+ name: rspec
149
149
  requirement: !ruby/object:Gem::Requirement
150
150
  requirements:
151
151
  - - "~>"
152
152
  - !ruby/object:Gem::Version
153
- version: '3.2'
153
+ version: '3.1'
154
154
  type: :development
155
155
  prerelease: false
156
156
  version_requirements: !ruby/object:Gem::Requirement
157
157
  requirements:
158
158
  - - "~>"
159
159
  - !ruby/object:Gem::Version
160
- version: '3.2'
160
+ version: '3.1'
161
161
  - !ruby/object:Gem::Dependency
162
162
  name: yard
163
163
  requirement: !ruby/object:Gem::Requirement
@@ -197,6 +197,7 @@ files:
197
197
  - LICENSE
198
198
  - README.md
199
199
  - bin/check-couchbase-bucket-quota.rb
200
+ - bin/metrics-couchbase.py
200
201
  - lib/sensu-plugins-couchbase.rb
201
202
  - lib/sensu-plugins-couchbase/version.rb
202
203
  homepage: https://github.com/sensu-plugins/sensu-plugins-couchbase
@@ -225,7 +226,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
225
226
  version: '0'
226
227
  requirements: []
227
228
  rubyforge_project:
228
- rubygems_version: 2.4.6
229
+ rubygems_version: 2.4.8
229
230
  signing_key:
230
231
  specification_version: 4
231
232
  summary: Sensu plugins for couchbase
metadata.gz.sig CHANGED
@@ -1 +1,2 @@
1
- zZNH0��z��,=�+�gt�J;u��B�7��4��o�m3���)��g/%��ח�w���畯kcD��ٽ y��Z)Jw΄qb7k`U��Y"��s}h-�.�O`q_pF�b�1 _��T!l.=��M���� N��:�� ��̣��z��[ m&�%y1J{0<~V �gj ������q������6�7e��&g8z�a �dA��=tjKD��[�4I=��~m)����@^�1,6w��`
1
+ ��=n����7a)a��\������[��C���݅T6��(�B2f��P����|� ��;Ќqg�K}��FSd��Ʌ�� p��H+�j(M�V���ǗYz�7��.�f�1.��+�0ɇk��#�+����0L� u5�p
2
+ �q襇+�m]�C$1�_�H�������� ;�jp���ET���ĨM������|\���ȍ��V$ cP�Qk��G���9>GT�~D����DSOB