rabbitmq: api/nodes requests fix (#5142)
* nodes_stats fix * fix
Ilya Mashchenko committed
Jan 10, 2019 at 11:51 UTC
2fb628235087fd9e91accd08d057f8057fe1fb44
1 file changed
+45
-63
collectors/python.d.plugin/rabbitmq/rabbitmq.chart.py
+45
-63
@@ -3,19 +3,12 @@
3
# Author: l2isbad
4
# SPDX-License-Identifier: GPL-3.0-or-later
5
6
-from collections import namedtuple
6
from json import loads
8
-from socket import gethostbyname, gaierror
9
-from threading import Thread
10
-try:
11
- from queue import Queue
12
-except ImportError:
13
- from Queue import Queue
7
8
from bases.FrameworkServices.UrlService import UrlService
9
17
-
18
-METHODS = namedtuple('METHODS', ['get_data', 'url', 'stats'])
10
+API_NODE = 'api/nodes'
11
+API_OVERVIEW = 'api/overview'
12
13
NODE_STATS = [
14
'fd_used',
@@ -123,74 +116,62 @@ class Service(UrlService):
116
UrlService.__init__(self, configuration=configuration, name=name)
117
self.order = ORDER
118
self.definitions = CHARTS
126
- self.host = self.configuration.get('host', '127.0.0.1')
127
- self.port = self.configuration.get('port', 15672)
128
- self.scheme = self.configuration.get('scheme', 'http')
119
+ self.url = '{0}://{1}:{2}'.format(
120
+ configuration.get('scheme', 'http'),
121
+ configuration.get('host', '127.0.0.1'),
122
+ configuration.get('port', 15672),
123
+ )
124
+ self.node_name = str()
125
130
- def check(self):
131
- # We can't start if <host> AND <port> not specified
132
- if not (self.host and self.port):
133
- self.error('Host is not defined in the module configuration file')
134
- return False
126
+ def _get_data(self):
127
+ data = dict()
128
136
- # Hostname -> ip address
137
- try:
138
- self.host = gethostbyname(self.host)
139
- except gaierror as error:
140
- self.error(str(error))
141
- return False
142
-
143
- # Add handlers (auth, self signed cert accept)
144
- self.url = '{scheme}://{host}:{port}/api'.format(scheme=self.scheme,
145
- host=self.host,
146
- port=self.port)
147
- # Add methods
148
- api_node = self.url + '/nodes'
149
- api_overview = self.url + '/overview'
150
- self.methods = [METHODS(get_data=self._get_overview_stats,
151
- url=api_node,
152
- stats=NODE_STATS),
153
- METHODS(get_data=self._get_overview_stats,
154
- url=api_overview,
155
- stats=OVERVIEW_STATS)]
156
- return UrlService.check(self)
129
+ stats = self.get_overview_stats()
130
158
- def _get_data(self):
159
- threads = list()
160
- queue = Queue()
161
- result = dict()
131
+ if not stats:
132
+ return None
133
+
134
+ data.update(stats)
135
+
136
+ stats = self.get_nodes_stats()
137
+
138
+ if not stats:
139
+ return None
140
+
141
+ data.update(stats)
142
163
- for method in self.methods:
164
- th = Thread(target=method.get_data,
165
- args=(queue, method.url, method.stats))
166
- th.start()
167
- threads.append(th)
143
+ return data or None
144
169
- for thread in threads:
170
- thread.join()
171
- result.update(queue.get())
145
+ def get_overview_stats(self):
146
+ url = '{0}/{1}'.format(self.url, API_OVERVIEW)
147
173
- return result or None
148
+ raw = self._get_raw_data(url)
149
175
- def _get_overview_stats(self, queue, url, stats):
176
- """
177
- Format data received from http request
178
- :return: dict
179
- """
150
+ if not raw:
151
+ return None
152
181
- raw_data = self._get_raw_data(url)
153
+ data = loads(raw)
154
183
- if not raw_data:
184
- return queue.put(dict())
185
- data = loads(raw_data)
186
- data = data[0] if isinstance(data, list) else data
155
+ self.node_name = data['node']
156
188
- to_netdata = fetch_data(raw_data=data, metrics=stats)
189
- return queue.put(to_netdata)
157
+ return fetch_data(raw_data=data, metrics=OVERVIEW_STATS)
158
+
159
+ def get_nodes_stats(self):
160
+ url = '{0}/{1}/{2}'.format(self.url, API_NODE, self.node_name)
161
+
162
+ raw = self._get_raw_data(url)
163
+
164
+ if not raw:
165
+ return None
166
+
167
+ data = loads(raw)
168
+
169
+ return fetch_data(raw_data=data, metrics=NODE_STATS)
170
171
172
def fetch_data(raw_data, metrics):
173
data = dict()
174
+
175
for metric in metrics:
176
value = raw_data
177
metrics_list = metric.split('.')
@@ -200,4 +181,5 @@ def fetch_data(raw_data, metrics):
181
except KeyError:
182
continue
183
data['_'.join(metrics_list)] = value
184
+
185
return data