1 # -*- coding: utf-8 -*-
2 # Description: memcached netdata python.d module
3 # Author: Pawel Krupa (paulfantom)
5 from base import SocketService
7 # default module values (can be overridden per job in `config`)
12 # default job configuration (overridden by python.d.plugin)
13 # config = {'local': {
14 # 'update_every': update_every,
16 # 'priority': priority,
17 # 'host': 'localhost',
22 ORDER = ['net', 'connections', 'items', 'evicted_reclaimed', 'get', 'get_rate', 'set_rate', 'delete', 'cas', 'increment', 'decrement', 'touch', 'touch_rate']
26 'options': [None, 'Network', 'bytes', 'Network', 'memcached.net', 'line'],
28 ['bytes_read', 'read', 'absolute'],
29 ['bytes_written', 'written', 'absolute']
32 'options': [None, 'Connections', 'connections', 'Cluster', 'memcached.cluster', 'line'],
34 ['curr_connections', 'current', 'absolute'],
35 ['rejected_connections', 'rejected', 'absolute'],
36 ['total_connections', 'total', 'absolute']
39 'options': [None, 'Items', 'items', 'Cluster', 'memcached.cluster', 'line'],
41 ['curr_items', 'current', 'absolute'],
42 ['total_items', 'total', 'absolute']
44 'evicted_reclaimed': {
45 'options': [None, 'Items', 'items', 'Evicted & Reclaimed', 'memcached.evicted_reclaimed', 'line'],
47 ['evictions', 'evicted', 'absolute'],
48 ['reclaimed', 'reclaimed', 'absolute']
51 'options': [None, 'Requests', 'requests', 'GET', 'memcached.get', 'stacked'],
53 ['get_hits', 'hits', 'percent-of-absolute-row'],
54 ['get_misses', 'misses', 'percent-of-absolute-row']
57 'options': [None, 'Rate', 'requests/s', 'GET', 'memcached.get', 'line'],
59 ['cmd_get', 'rate', 'incremental']
62 'options': [None, 'Rate', 'requests/s', 'SET', 'memcached.set', 'line'],
64 ['cmd_set', 'rate', 'incremental']
67 'options': [None, 'Requests', 'requests', 'DELETE', 'memcached.delete', 'stacked'],
69 ['delete_hits', 'hits', 'percent-of-absolute-row'],
70 ['delete_misses', 'misses', 'percent-of-absolute-row'],
73 'options': [None, 'Requests', 'requests', 'CAS', 'memcached.cas', 'stacked'],
75 ['cas_hits', 'hits', 'percent-of-absolute-row'],
76 ['cas_misses', 'misses', 'percent-of-absolute-row'],
77 ['cas_badval', 'bad value', 'percent-of-absolute-row']
80 'options': [None, 'Requests', 'requests', 'Increment', 'memcached.incr', 'stacked'],
82 ['incr_hits', 'hits', 'percent-of-absolute-row'],
83 ['incr_misses', 'misses', 'percent-of-absolute-row']
86 'options': [None, 'Requests', 'requests', 'Decrement', 'memcached.decr', 'stacked'],
88 ['decr_hits', 'hits', 'percent-of-absolute-row'],
89 ['decr_misses', 'misses', 'percent-of-absolute-row']
92 'options': [None, 'Requests', 'requests', 'Touch', 'memcached.touch', 'stacked'],
94 ['touch_hits', 'hits', 'percent-of-absolute-row'],
95 ['touch_misses', 'misses', 'percent-of-absolute-row']
98 'options': [None, 'Rate', 'requests/s', 'Touch', 'memcached.touch', 'line'],
100 ['cmd_touch', 'rate', 'incremental']
105 class Service(SocketService):
106 def __init__(self, configuration=None, name=None):
107 SocketService.__init__(self, configuration=configuration, name=name)
108 self.request = "stats\r\n"
109 self.host = "localhost"
111 self.unix_socket = None
113 self.definitions = CHARTS
121 raw = self._get_raw_data().split("\n")
122 except AttributeError:
123 self.error("no data received")
125 if raw[0].startswith('ERROR'):
126 self.error("Memcached returned ERROR")
130 if line.startswith('STAT'):
132 t = line[5:].split(' ')
133 data[t[0]] = int(t[1])
134 except (IndexError, ValueError):
137 data['hit_rate'] = int((data['keyspace_hits'] / float(data['keyspace_hits'] + data['keyspace_misses'])) * 100)
142 self.error("received data doesn't have needed records")
149 Parse configuration, check if memcached is available
155 self.chart_name += "_" + self.name
156 data = self._get_data()