@cryptotaxi247 / netdata-1 / commits / 2fb628235

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