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