redis: populate `keys_redis` chart in runtime (#7639)
* redis: populate `keys_redis` in runtime * redis: return 0 value for dbs that were collected previously if there is not data
Ilya Mashchenko committed
Dec 29, 2019 at 18:10 UTC
0e1326d7ad086195f62a4fca610aceb0a01da821
1 file changed
+26
-16
collectors/python.d.plugin/redis/redis.chart.py
+26
-16
@@ -37,7 +37,6 @@ PIKA_ORDER = [
37
'uptime',
38
]
39
40
-
40
CHARTS = {
41
'operations': {
42
'options': [None, 'Operations', 'operations/s', 'operations', 'redis.operations', 'line'],
@@ -156,6 +155,7 @@ class Service(SocketService):
155
self.auth_request = 'AUTH {0} \r\n'.format(p).encode() if p else None
156
self.request = 'INFO\r\n'.encode()
157
self.bgsave_time = 0
158
+ self.keyspace_dbs = set()
159
160
def do_auth(self):
161
resp = self._get_raw_data(request=self.auth_request)
@@ -189,23 +189,38 @@ class Service(SocketService):
189
:return: dict
190
"""
191
data = self.get_raw_and_parse()
192
-
192
if not data:
193
return None
194
195
+ self.calc_hit_rate(data)
196
+ self.calc_redis_keys(data)
197
+ self.calc_redis_rdb_save_operations(data)
198
+ return data
199
+
200
+ @staticmethod
201
+ def calc_hit_rate(data):
202
try:
197
- data['hit_rate'] = (
198
- (int(data['keyspace_hits']) * 100) / (int(data['keyspace_hits']) + int(data['keyspace_misses']))
199
- )
203
+ hits = int(data['keyspace_hits'])
204
+ misses = int(data['keyspace_misses'])
205
+ data['hit_rate'] = hits * 100 / (hits + misses)
206
except (KeyError, ZeroDivisionError):
207
data['hit_rate'] = 0
208
203
- if data.get('redis_version') and data.get('rdb_bgsave_in_progress'):
204
- self.get_data_redis_specific(data)
205
-
206
- return data
207
-
208
- def get_data_redis_specific(self, data):
209
+ def calc_redis_keys(self, data):
210
+ if not data.get('redis_version'):
211
+ return
212
+ # db0:keys=2,expires=0,avg_ttl=0
213
+ new_keyspace_dbs = [k for k in data if k.startswith('db') and k not in self.keyspace_dbs]
214
+ for db in new_keyspace_dbs:
215
+ self.keyspace_dbs.add(db)
216
+ self.charts['keys_redis'].add_dimension([db, None, 'absolute'])
217
+ for db in self.keyspace_dbs:
218
+ if db not in data:
219
+ data[db] = 0
220
+
221
+ def calc_redis_rdb_save_operations(self, data):
222
+ if not (data.get('redis_version') and data.get('rdb_bgsave_in_progress')):
223
+ return
224
if data['rdb_bgsave_in_progress'] != '0':
225
self.bgsave_time += self.update_every
226
else:
@@ -229,11 +244,6 @@ class Service(SocketService):
244
for n in self.order:
245
self.definitions.update(copy_chart(n))
246
232
- if data.get('redis_version'):
233
- for k in data:
234
- if k.startswith('db'):
235
- self.definitions['keys_redis']['lines'].append([k, None, 'absolute'])
236
-
247
return True
248
249
def _check_raw_data(self, data):