@cryptotaxi247 / netdata-1 / commits / 0e1326d7a

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):