@cryptotaxi247 / netdata-1 / commits / cfbd41303

Rescan peers every N updates, always get peer data

Find new peers on first run or every peer_rescan interval or after more than 8 peer failures. Do not scan for new peers every update if self.peers dict is empty. Also get data from peers after finding new peers in the current run.

Sven Mäder committed Feb 20, 2018 at 09:56 UTC cfbd413031ea9542600ed9b3fbff65e9307ccf6e
2 files changed +30 -19
conf.d/python.d/ntpd.conf
+1
@@ -62,6 +62,7 @@
62 # peer_filter: '127\..*' # regex to exclude peers
63 # # by default local peers are hidden
64 # # use `''` to show all peers.
65 +# peer_rescan: 60 # interval to check for new/changed peers
66 #
67 # ----------------------------------------------------------------------
68 # AUTO-DETECTION JOBS
python.d/ntpd.chart.py
+29 -19
@@ -12,6 +12,7 @@ from bases.FrameworkServices.SocketService import SocketService
12 update_every = 1
13 priority = 60000
14 retries = 60
15 +peer_rescan = 60
16
17 # NTP Control Message Protocol constants
18 MODE = 6
@@ -225,7 +226,6 @@ class Service(SocketService):
226 SocketService.__init__(self, configuration=configuration, name=name)
227 self.order = list(ORDER)
228 self.definitions = dict(CHARTS)
228 - self.definitions.update(PEER_CHARTS)
229
230 self.port = 'ntp'
231 self.dgram_socket = True
@@ -234,27 +234,38 @@ class Service(SocketService):
234 self.request = str()
235 self.retries = 0
236 self.show_peers = self.configuration.get('show_peers', False)
237 - self.peer_filter = None
237
238 def check(self):
239 """
240 Checks if we can get valid systemvars.
241 If not, returns None to disable module.
242 """
244 - peer_filter = self.configuration.get('peer_filter', r'127\..*')
245 - try:
246 - self.peer_filter = re.compile(r'^((0\.0\.0\.0)|({0}))$'.format(peer_filter))
247 - except re.error as error:
248 - self.error('Compile pattern error : {0}'.format(error))
249 - return None
250 -
243 self._parse_config()
244
245 + if self.show_peers:
246 + self.definitions.update(PEER_CHARTS)
247 +
248 + peer_filter = self.configuration.get('peer_filter', r'127\..*')
249 + try:
250 + self.peer_filter = re.compile(r'^((0\.0\.0\.0)|({0}))$'.format(peer_filter))
251 + except re.error as error:
252 + self.error('Compile pattern error (peer_filter) : {0}'.format(error))
253 + return None
254 +
255 + try:
256 + self.peer_rescan = int(self.configuration.get('peer_rescan', peer_rescan))
257 + if self.peer_rescan <= 0:
258 + raise ValueError('int > 0 expected: {0}'.format(self.peer_rescan))
259 + except ValueError as error:
260 + self.error('Value error (peer_rescan) : {0}'.format(error))
261 + return None
262 +
263 self.request = self.system.request
264 raw_systemvars = self._get_raw_data()
265
266 if not self.system.get_data(raw_systemvars):
267 return None
268 +
269 return True
270
271 def get_data(self):
@@ -274,17 +285,16 @@ class Service(SocketService):
285 if not self.show_peers:
286 return data
287
277 - # TODO: run self.find_new_peers() every N runs?
278 - if not self.peers or self.retries > 8:
288 + if self.runs_counter == 1 or self.runs_counter % self.peer_rescan or self.retries > 8:
289 self.find_new_peers()
280 - else:
281 - for peer in self.peers.values():
282 - self.request = peer.request
283 - peer_data = peer.get_data(self._get_raw_data())
284 - if peer_data:
285 - data.update(peer_data)
286 - else:
287 - self.retries += 1
290 +
291 + for peer in self.peers.values():
292 + self.request = peer.request
293 + peer_data = peer.get_data(self._get_raw_data())
294 + if peer_data:
295 + data.update(peer_data)
296 + else:
297 + self.retries += 1
298
299 return data
300