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