Rush has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/228135

Change subject: diamond: start collecting nutcracker stats
......................................................................

diamond: start collecting nutcracker stats

ref T107381

Change-Id: I3cf6a5ce7890e889e5828f0a49c5486d7e083944
---
A modules/nutcracker/files/monitor/nutcracker.py
M modules/nutcracker/manifests/monitoring.pp
2 files changed, 103 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/puppet 
refs/changes/35/228135/1

diff --git a/modules/nutcracker/files/monitor/nutcracker.py 
b/modules/nutcracker/files/monitor/nutcracker.py
new file mode 100644
index 0000000..b6d941c
--- /dev/null
+++ b/modules/nutcracker/files/monitor/nutcracker.py
@@ -0,0 +1,99 @@
+# coding=utf-8
+
+import diamond.collector
+import json
+import re
+import socket
+
+"""
+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'
+}
+
+
+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))
+            sock.settimeout(1)
+            raw_data = sock.recv(65536).decode('utf-8', 
errors='ignore').strip()
+            sock.shutdown(socket.SHUT_RDWR)
+        except:
+            self.log.error("%s:%s connection failed" % (host, port))
+            return {}
+        finally:
+            sock.close()
+
+        # Nutcracker does not properly escape quotation marks in server 
aliases.
+        data = re.sub(r'"("\w+")"(?=:)', r'\1', raw_data)
+        stats = json.loads(data)
+
+        # The pool names are all the keys that aren't part of standard set of 
keys.
+        pools = standard_keys.symmetric_difference(stats)
+        stats['pools'] = {p: stats.pop(p) for p in pools}
+        return stats
+
+
+    def get_default_config(self):
+        """
+        Returns default collector settings.
+        """
+        config = super(NutcrackerCollector, self).get_default_config()
+        config.update({
+            'path': 'nutcracker',
+            'host': '127.0.0.1',
+            'port': 22222,
+        })
+        return config
+
+    def collect(self):
+        stats = self.get_nutcracker_stats(self.config['host'],
+                                          self.config['port'])
+        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:
+            metrics[ss] = stats[ss]
+
+        pools = stats['pools'].keys()
+        for p in pools:
+            for s in pool_stats:
+                metrics["pool.%s.%s" % (p, s)] = stats['pools'][p][s]
+
+        for m in metrics.keys():
+            self.publish(m, metrics[m])
diff --git a/modules/nutcracker/manifests/monitoring.pp 
b/modules/nutcracker/manifests/monitoring.pp
index 94b5252..8563b1a 100644
--- a/modules/nutcracker/manifests/monitoring.pp
+++ b/modules/nutcracker/manifests/monitoring.pp
@@ -12,4 +12,8 @@
         description  => 'nutcracker port',
         nrpe_command => '/usr/lib/nagios/plugins/check_tcp -H 127.0.0.1 -p 
11212 --timeout=2',
     }
+
+    diamond::collector { 'Nutcracker':
+        source   => 'puppet:///modules/nutcracker/monitor/nutcracker.py',
+    }
 }

-- 
To view, visit https://gerrit.wikimedia.org/r/228135
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I3cf6a5ce7890e889e5828f0a49c5486d7e083944
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