@cryptotaxi247 / netdata-1 / commits / 7c55fd6a9

redis plugin bugfix: encode requests before pass it to send method

Ilya committed Jul 22, 2017 at 14:27 UTC 7c55fd6a994e7ed0410433f03d8ce2cd4d75ab91
1 file changed +16 -20
python.d/redis.chart.py
+16 -20
@@ -68,7 +68,8 @@ CHARTS = {
68 ['connected_slaves', 'connected', 'absolute']
69 ]},
70 'persistence': {
71 - 'options': [None, 'Redis Persistence Changes Since Last Save', 'changes', 'persistence', 'redis.rdb_changes', 'line'],
71 + 'options': [None, 'Redis Persistence Changes Since Last Save', 'changes', 'persistence',
72 + 'redis.rdb_changes', 'line'],
73 'lines': [
74 ['rdb_changes_since_last_save', 'changes', 'absolute']
75 ]}
@@ -78,34 +79,30 @@ CHARTS = {
79 class Service(SocketService):
80 def __init__(self, configuration=None, name=None):
81 SocketService.__init__(self, configuration=configuration, name=name)
81 - self.request = "INFO\r\n"
82 self.order = ORDER
83 self.definitions = CHARTS
84 self._keep_alive = True
85 self.chart_name = ""
86 - self.passwd = None
87 - self.port = 6379
88 - if 'port' in configuration:
89 - self.port = configuration['port']
90 - if 'pass' in configuration:
91 - self.passwd = configuration['pass']
92 - if 'host' in configuration:
93 - self.host = configuration['host']
94 - if 'socket' in configuration:
95 - self.unix_socket = configuration['socket']
86 + self.host = self.configuration.get('host', 'localhost')
87 + self.port = self.configuration.get('port', 6379)
88 + self.unix_socket = self.configuration.get('socket')
89 + password = self.configuration.get('pass', str())
90 + self.requests = dict(request='INFO\r\n'.encode(),
91 + password=' '.join(['AUTH', password, '\r\n']).encode() if password else None)
92 + self.request = self.requests['request']
93
94 def _get_data(self):
95 """
96 Get data from socket
97 :return: dict
98 """
102 - if self.passwd:
103 - self.request = "AUTH " + self.passwd + "\r\n"
99 + if self.requests['password']:
100 + self.request = self.requests['password']
101 raw = self._get_raw_data().strip()
102 if raw != "+OK":
103 self.error("invalid password")
104 return None
108 - self.request = "INFO\r\n"
105 + self.request = self.requests['request']
106 response = self._get_raw_data()
107 if response is None:
108 # error has already been logged
@@ -117,7 +114,7 @@ class Service(SocketService):
114 self.error("response is invalid/empty")
115 return None
116
120 - data = {}
117 + data = dict()
118 for line in parsed:
119 if len(line) < 5 or line[0] == '$' or line[0] == '#':
120 continue
@@ -140,8 +137,9 @@ class Service(SocketService):
137 return None
138
139 try:
143 - data['hit_rate'] = (int(data['keyspace_hits']) * 100) / (int(data['keyspace_hits']) + int(data['keyspace_misses']))
144 - except:
140 + data['hit_rate'] = (int(data['keyspace_hits']) * 100) / (int(data['keyspace_hits'])
141 + + int(data['keyspace_misses']))
142 + except (KeyError, ZeroDivisionError, TypeError):
143 data['hit_rate'] = 0
144
145 return data
@@ -172,7 +170,6 @@ class Service(SocketService):
170 Parse configuration, check if redis is available, and dynamically create chart lines data
171 :return: boolean
172 """
175 - self._parse_config()
173 if self.name == "":
174 self.name = "local"
175 self.chart_name += "_" + self.name
@@ -183,5 +180,4 @@ class Service(SocketService):
180 for name in data:
181 if name.startswith('db'):
182 self.definitions['keys']['lines'].append([name, None, 'absolute'])
186 -
183 return True