]> arthur.barton.de Git - netdata.git/blobdiff - python.d/memcached.chart.py
dns_query_time plugin: added
[netdata.git] / python.d / memcached.chart.py
index 12e0fb9b57d645ba560409508381987eadc0a21e..0d6807ba731580b8345a26527aee094ad59a1f9d 100644 (file)
@@ -19,83 +19,90 @@ retries = 60
 #             'unix_socket': None
 #          }}
 
-ORDER = ['net', 'connections', 'items', 'evicted_reclaimed', 'get', 'get_rate', 'set_rate', 'delete', 'cas', 'increment', 'decrement', 'touch', 'touch_rate']
+ORDER = ['cache', 'net', 'connections', 'items', 'evicted_reclaimed',
+         'get', 'get_rate', 'set_rate', 'cas', 'delete', 'increment', 'decrement', 'touch', 'touch_rate']
 
 CHARTS = {
+    'cache': {
+        'options': [None, 'Cache Size', 'megabytes', 'cache', 'memcached.cache', 'stacked'],
+        'lines': [
+            ['avail', 'available', 'absolute', 1, 1048576],
+            ['used', 'used', 'absolute', 1, 1048576]
+        ]},
     'net': {
-        'options': [None, 'Network', 'bytes', 'Network', 'memcached.net', 'line'],
+        'options': [None, 'Network', 'kilobits/s', 'network', 'memcached.net', 'area'],
         'lines': [
-            ['bytes_read', 'read', 'absolute'],
-            ['bytes_written', 'written', 'absolute']
+            ['bytes_read', 'in', 'incremental', 8, 1024],
+            ['bytes_written', 'out', 'incremental', -8, 1024]
         ]},
     'connections': {
-        'options': [None, 'Connections', 'connections', 'Cluster', 'memcached.cluster', 'line'],
+        'options': [None, 'Connections', 'connections/s', 'connections', 'memcached.connections', 'line'],
         'lines': [
-            ['curr_connections', 'current', 'absolute'],
-            ['rejected_connections', 'rejected', 'absolute'],
-            ['total_connections', 'total', 'absolute']
+            ['curr_connections', 'current', 'incremental'],
+            ['rejected_connections', 'rejected', 'incremental'],
+            ['total_connections', 'total', 'incremental']
         ]},
     'items': {
-        'options': [None, 'Items', 'items', 'Cluster', 'memcached.cluster', 'line'],
+        'options': [None, 'Items', 'items', 'items', 'memcached.items', 'line'],
         'lines': [
             ['curr_items', 'current', 'absolute'],
             ['total_items', 'total', 'absolute']
         ]},
     'evicted_reclaimed': {
-        'options': [None, 'Items', 'items', 'Evicted & Reclaimed', 'memcached.evicted_reclaimed', 'line'],
+        'options': [None, 'Items', 'items', 'items', 'memcached.evicted_reclaimed', 'line'],
         'lines': [
-            ['evictions', 'evicted', 'absolute'],
-            ['reclaimed', 'reclaimed', 'absolute']
+            ['reclaimed', 'reclaimed', 'absolute'],
+            ['evictions', 'evicted', 'absolute']
         ]},
     'get': {
-        'options': [None, 'Requests', 'requests', 'GET', 'memcached.get', 'stacked'],
+        'options': [None, 'Requests', 'requests', 'get ops', 'memcached.get', 'stacked'],
         'lines': [
             ['get_hits', 'hits', 'percent-of-absolute-row'],
             ['get_misses', 'misses', 'percent-of-absolute-row']
         ]},
     'get_rate': {
-        'options': [None, 'Rate', 'requests/s', 'GET', 'memcached.get', 'line'],
+        'options': [None, 'Rate', 'requests/s', 'get ops', 'memcached.get_rate', 'line'],
         'lines': [
             ['cmd_get', 'rate', 'incremental']
         ]},
     'set_rate': {
-        'options': [None, 'Rate', 'requests/s', 'SET', 'memcached.set', 'line'],
+        'options': [None, 'Rate', 'requests/s', 'set ops', 'memcached.set_rate', 'line'],
         'lines': [
             ['cmd_set', 'rate', 'incremental']
         ]},
     'delete': {
-        'options': [None, 'Requests', 'requests', 'DELETE', 'memcached.delete', 'stacked'],
+        'options': [None, 'Requests', 'requests', 'delete ops', 'memcached.delete', 'stacked'],
         'lines': [
             ['delete_hits', 'hits', 'percent-of-absolute-row'],
             ['delete_misses', 'misses', 'percent-of-absolute-row'],
         ]},
     'cas': {
-        'options': [None, 'Requests', 'requests', 'CAS', 'memcached.cas', 'stacked'],
+        'options': [None, 'Requests', 'requests', 'check and set ops', 'memcached.cas', 'stacked'],
         'lines': [
             ['cas_hits', 'hits', 'percent-of-absolute-row'],
             ['cas_misses', 'misses', 'percent-of-absolute-row'],
             ['cas_badval', 'bad value', 'percent-of-absolute-row']
         ]},
     'increment': {
-        'options': [None, 'Requests', 'requests', 'Increment', 'memcached.incr', 'stacked'],
+        'options': [None, 'Requests', 'requests', 'increment ops', 'memcached.increment', 'stacked'],
         'lines': [
             ['incr_hits', 'hits', 'percent-of-absolute-row'],
             ['incr_misses', 'misses', 'percent-of-absolute-row']
         ]},
     'decrement': {
-        'options': [None, 'Requests', 'requests', 'Decrement', 'memcached.decr', 'stacked'],
+        'options': [None, 'Requests', 'requests', 'decrement ops', 'memcached.decrement', 'stacked'],
         'lines': [
             ['decr_hits', 'hits', 'percent-of-absolute-row'],
             ['decr_misses', 'misses', 'percent-of-absolute-row']
         ]},
     'touch': {
-        'options': [None, 'Requests', 'requests', 'Touch', 'memcached.touch', 'stacked'],
+        'options': [None, 'Requests', 'requests', 'touch ops', 'memcached.touch', 'stacked'],
         'lines': [
             ['touch_hits', 'hits', 'percent-of-absolute-row'],
             ['touch_misses', 'misses', 'percent-of-absolute-row']
         ]},
     'touch_rate': {
-        'options': [None, 'Rate', 'requests/s', 'Touch', 'memcached.touch', 'line'],
+        'options': [None, 'Rate', 'requests/s', 'touch ops', 'memcached.touch_rate', 'line'],
         'lines': [
             ['cmd_touch', 'rate', 'incremental']
         ]}
@@ -108,6 +115,7 @@ class Service(SocketService):
         self.request = "stats\r\n"
         self.host = "localhost"
         self.port = 11211
+        self._keep_alive = True
         self.unix_socket = None
         self.order = ORDER
         self.definitions = CHARTS
@@ -117,32 +125,52 @@ class Service(SocketService):
         Get data from socket
         :return: dict
         """
+        response = self._get_raw_data()
+        if response is None:
+            # error has already been logged
+            return None
+
+        if response.startswith('ERROR'):
+            self.error("received ERROR")
+            return None
+
         try:
-            raw = self._get_raw_data().split("\n")
+            parsed = response.split("\n")
         except AttributeError:
-            self.error("no data received")
-            return None
-        if raw[0].startswith('ERROR'):
-            self.error("Memcached returned ERROR")
+            self.error("response is invalid/empty")
             return None
+
+        # split the response
         data = {}
-        for line in raw:
+        for line in parsed:
             if line.startswith('STAT'):
                 try:
                     t = line[5:].split(' ')
-                    data[t[0]] = int(t[1])
+                    data[t[0]] = t[1]
                 except (IndexError, ValueError):
+                    self.debug("invalid line received: " + str(line))
                     pass
-        try:
-            data['hit_rate'] = int((data['keyspace_hits'] / float(data['keyspace_hits'] + data['keyspace_misses'])) * 100)
-        except:
-            data['hit_rate'] = 0
 
         if len(data) == 0:
-            self.error("received data doesn't have needed records")
+            self.error("received data doesn't have any records")
             return None
-        else:
-            return data
+
+        # custom calculations
+        try:
+            data['avail'] = int(data['limit_maxbytes']) - int(data['bytes'])
+            data['used'] = int(data['bytes'])
+        except:
+            pass
+
+        return data
+
+    def _check_raw_data(self, data):
+        if data.endswith('END\r\n'):
+            self.debug("received full response from memcached")
+            return True
+
+        self.debug("waiting more data from memcached")
+        return False
 
     def check(self):
         """