Rush has uploaded a new change for review.
https://gerrit.wikimedia.org/r/230259
Change subject: diamond: nutcracker collector improvements
......................................................................
diamond: nutcracker collector improvements
Change-Id: Ia1a40f96d2d1d0a50466ac27e7b9e2f78324028b
---
M modules/nutcracker/files/monitor/nutcracker.py
1 file changed, 63 insertions(+), 52 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/operations/puppet
refs/changes/59/230259/1
diff --git a/modules/nutcracker/files/monitor/nutcracker.py
b/modules/nutcracker/files/monitor/nutcracker.py
index dafca87..891df26 100644
--- a/modules/nutcracker/files/monitor/nutcracker.py
+++ b/modules/nutcracker/files/monitor/nutcracker.py
@@ -1,50 +1,68 @@
# coding=utf-8
+"""
+ Chase Pettet 2015
-import diamond.collector
+ Collects nutcracker server and pool stats via stats interface
+
+ Example output:
+
+ nutcracker.curr_connections 57 1438286309
+ nutcracker.uptime 74201 1438286309
+ nutcracker.total_connections 15146322 1438286309
+ nutcracker.pool.$poolname.client_err 0 1438286309
+ nutcracker.pool.$poolname.fragments 0 1438286309
+ nutcracker.pool.$poolname.client_connections 1 1438286309
+ nutcracker.pool.$poolname.forward_error 0 1438286309
+ nutcracker.pool.$poolname.client_eof 587971 1438286309
+"""
+
import json
import re
import socket
+from contextlib import closing
-"""
-Collects nutcracker server and pool stats via stats interface
-
-Example output:
-
-nutcracker.curr_connections 57 1438286309
-nutcracker.uptime 74201 1438286309
-nutcracker.total_connections 15146322 1438286309
-nutcracker.pool.$poolname.client_err 0 1438286309
-nutcracker.pool.$poolname.fragments 0 1438286309
-nutcracker.pool.$poolname.client_connections 1 1438286309
-nutcracker.pool.$poolname.forward_error 0 1438286309
-nutcracker.pool.$poolname.client_eof 587971 1438286309
-"""
-
-standard_keys = {
- 'curr_connections',
- 'total_connections',
- 'uptime',
- 'service',
- 'timestamp',
- 'source',
- 'version'
-}
+import diamond.collector
class NutcrackerCollector(diamond.collector.Collector):
- def get_nutcracker_stats(self, host, port):
- try:
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.connect((host, port))
+ def __init__(self, *args, **kwargs):
+
+ diamond.collector.Collector.__init__(self, *args, **kwargs)
+
+ self.standard_keys = {
+ 'curr_connections',
+ 'total_connections',
+ 'uptime',
+ 'service',
+ 'timestamp',
+ 'source',
+ 'version'
+ }
+
+ self.server_stats = [
+ 'curr_connections',
+ 'total_connections',
+ 'uptime',
+ ]
+
+ self.pool_stats = [
+ 'client_connections',
+ 'forward_error',
+ 'client_eof',
+ 'client_err',
+ 'server_ejects',
+ 'fragments'
+ ]
+
+ def get_nutcracker_stats(self, port):
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+
+ with closing(sock):
+ sock.connect(('', port))
sock.settimeout(1)
raw_data = sock.recv(65536).decode('utf-8', errors='ignore')
sock.shutdown(socket.SHUT_RDWR)
- except:
- self.log.error("%s:%s connection failed" % (host, port))
- return {}
- finally:
- sock.close()
# does not properly escape quotation marks in server aliases.
data = re.sub(r'"("\w+")"(?=:)', r'\1', raw_data.strip())
@@ -52,7 +70,7 @@
# The pool names are all the keys
# that aren't part of standard set of keys.
- pools = standard_keys.symmetric_difference(stats)
+ pools = self.standard_keys.symmetric_difference(stats)
stats['pools'] = {p: stats.pop(p) for p in pools}
return stats
@@ -69,30 +87,23 @@
return config
def collect(self):
- stats = self.get_nutcracker_stats(self.config['host'],
- self.config['port'])
+ try:
+ stats = self.get_nutcracker_stats(self.config['port'])
+ except socket.error:
+ self.log.error("connection failed for port %s",
self.config['port'])
+ return
+
if not stats:
return
- server_stats = ['curr_connections',
- 'total_connections',
- 'uptime']
-
- pool_stats = ['client_connections',
- 'forward_error',
- 'client_eof',
- 'client_err',
- 'server_ejects',
- 'fragments']
-
metrics = {}
- for ss in server_stats:
+ for ss in self.server_stats:
metrics[ss] = stats[ss]
pools = stats['pools'].keys()
for p in pools:
- for s in pool_stats:
+ for s in self.pool_stats:
metrics["pool.%s.%s" % (p, s)] = stats['pools'][p][s]
- for m in metrics.keys():
- self.publish(m, metrics[m])
+ for stat, value in metrics.iteritems():
+ self.publish(stat, value)
--
To view, visit https://gerrit.wikimedia.org/r/230259
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia1a40f96d2d1d0a50466ac27e7b9e2f78324028b
Gerrit-PatchSet: 1
Gerrit-Project: operations/puppet
Gerrit-Branch: production
Gerrit-Owner: Rush <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits