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

Reply via email to