summaryrefslogtreecommitdiffstats
path: root/collectors/python.d.plugin/unbound
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2019-10-26 08:29:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2019-10-26 08:29:10 +0000
commit66ae4baad173098544603718e9864f0da1c0c7a3 (patch)
treed8e6f387ee9b4d9b6936e3c21208e50b86daea60 /collectors/python.d.plugin/unbound
parentAdding upstream version 1.18.0. (diff)
downloadnetdata-66ae4baad173098544603718e9864f0da1c0c7a3.tar.xz
netdata-66ae4baad173098544603718e9864f0da1c0c7a3.zip
Adding upstream version 1.18.1.upstream/1.18.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'collectors/python.d.plugin/unbound')
-rw-r--r--collectors/python.d.plugin/unbound/unbound.chart.py92
1 files changed, 60 insertions, 32 deletions
diff --git a/collectors/python.d.plugin/unbound/unbound.chart.py b/collectors/python.d.plugin/unbound/unbound.chart.py
index 6e5a22c5..590de4c9 100644
--- a/collectors/python.d.plugin/unbound/unbound.chart.py
+++ b/collectors/python.d.plugin/unbound/unbound.chart.py
@@ -32,10 +32,10 @@ CHARTS = {
]
},
'recursion': {
- 'options': [None, 'Recursion Timings', 'seconds', 'Unbound', 'unbound.recursion', 'line'],
+ 'options': [None, 'Recursion Timings', 'milliseconds', 'Unbound', 'unbound.recursion', 'line'],
'lines': [
- ['recursive_avg', 'average', 'absolute', 1, PRECISION],
- ['recursive_med', 'median', 'absolute', 1, PRECISION]
+ ['recursive_avg', 'average', 'absolute', 1, 1],
+ ['recursive_med', 'median', 'absolute', 1, 1]
]
},
'reqlist': {
@@ -83,11 +83,11 @@ PER_THREAD_CHARTS = {
]
},
'_recursion': {
- 'options': [None, '{longname} Recursion Timings', 'seconds', 'Recursive Timings',
+ 'options': [None, '{longname} Recursion Timings', 'milliseconds', 'Recursive Timings',
'unbound.threads.recursion', 'line'],
'lines': [
- ['{shortname}_recursive_avg', 'average', 'absolute', 1, PRECISION],
- ['{shortname}_recursive_med', 'median', 'absolute', 1, PRECISION]
+ ['{shortname}_recursive_avg', 'average', 'absolute', 1, 1],
+ ['{shortname}_recursive_med', 'median', 'absolute', 1, 1]
]
},
'_reqlist': {
@@ -103,7 +103,6 @@ PER_THREAD_CHARTS = {
}
}
-
# This maps the Unbound stat names to our names and precision requiremnets.
STAT_MAP = {
'total.num.queries_ip_ratelimited': ('ratelimit', 1),
@@ -118,6 +117,7 @@ STAT_MAP = {
'total.requestlist.exceeded': ('reqlist_exceeded', 1),
'total.requestlist.current.all': ('reqlist_current', 1),
'total.requestlist.current.user': ('reqlist_user', 1),
+ # Unbound reports recursion timings as fractional seconds, but we want to show them as milliseconds.
'total.recursion.time.avg': ('recursive_avg', PRECISION),
'total.recursion.time.median': ('recursive_med', PRECISION),
'msg.cache.count': ('cache_message', 1),
@@ -142,11 +142,16 @@ PER_THREAD_STAT_MAP = {
'{shortname}.requestlist.exceeded': ('{shortname}_reqlist_exceeded', 1),
'{shortname}.requestlist.current.all': ('{shortname}_reqlist_current', 1),
'{shortname}.requestlist.current.user': ('{shortname}_reqlist_user', 1),
+ # Unbound reports recursion timings as fractional seconds, but we want to show them as milliseconds.
'{shortname}.recursion.time.avg': ('{shortname}_recursive_avg', PRECISION),
'{shortname}.recursion.time.median': ('{shortname}_recursive_med', PRECISION)
}
+def is_readable(name):
+ return os.access(name, os.R_OK)
+
+
# Used to actually generate per-thread charts.
def _get_perthread_info(thread):
sname = 'thread{0}'.format(thread)
@@ -203,25 +208,8 @@ class Service(SocketService):
self.debug('Using certificate: {0}'.format(self.cert))
def _auto_config(self):
- if self.ubconf and os.access(self.ubconf, os.R_OK):
- self.debug('Unbound config: {0}'.format(self.ubconf))
- conf = dict()
- try:
- conf = load_config(self.ubconf)
- except Exception as error:
- self.error("error on loading '{0}' : {1}".format(self.ubconf, error))
- if self.ext is None:
- if 'extended-statistics' in conf['server']:
- self.ext = conf['server']['extended-statistics']
- if 'remote-control' in conf:
- if conf['remote-control'].get('control-use-cert', False):
- self.key = self.key or conf['remote-control'].get('control-key-file')
- self.cert = self.cert or conf['remote-control'].get('control-cert-file')
- self.port = self.port or conf['remote-control'].get('control-port')
- else:
- self.unix_socket = self.unix_socket or conf['remote-control'].get('control-interface')
- else:
- self.debug('Unbound configuration not found.')
+ self.load_unbound_config()
+
if not self.key:
self.key = '/etc/unbound/unbound_control.key'
if not self.cert:
@@ -229,6 +217,38 @@ class Service(SocketService):
if not self.port:
self.port = 8953
+ def load_unbound_config(self):
+ if not (self.ubconf and is_readable(self.ubconf)):
+ self.debug('Unbound configuration not found.')
+ return
+
+ self.debug('Loading Unbound config: {0}'.format(self.ubconf))
+
+ try:
+ conf = load_config(self.ubconf)
+ except Exception as error:
+ self.error("error on loading '{0}' : {1}".format(self.ubconf, error))
+ return
+
+ srv = conf.get('server')
+ if self.ext is None:
+ if srv and 'extended-statistics' in srv:
+ self.ext = srv['extended-statistics']
+
+ rc = conf.get('remote-control')
+ if not (rc and isinstance(rc, dict)):
+ return
+
+ if rc.get('control-use-cert', False):
+ self.key = self.key or rc.get('control-key-file')
+ self.cert = self.cert or rc.get('control-cert-file')
+ self.port = self.port or rc.get('control-port')
+ else:
+ ci = rc.get('control-interface', str())
+ is_socket = '/' in ci
+ if is_socket:
+ self.unix_socket = ci
+
def _generate_perthread_charts(self):
tmporder = list()
for thread in range(0, self.threads):
@@ -239,6 +259,14 @@ class Service(SocketService):
self.order.extend(sorted(tmporder))
def check(self):
+ if not is_readable(self.key):
+ self.error("ssl key '{0}' is not readable".format(self.key))
+ return False
+
+ if not is_readable(self.cert):
+ self.error("ssl certificate '{0}' is not readable".format(self.certificate))
+ return False
+
# Check if authentication is working.
self._connect()
result = bool(self._sock)
@@ -268,12 +296,6 @@ class Service(SocketService):
self.request = tmp
return result
- @staticmethod
- def _check_raw_data(data):
- # The server will close the connection when it's done sending
- # data, so just keep looping until that happens.
- return False
-
def _get_data(self):
raw = self._get_raw_data()
data = dict()
@@ -288,3 +310,9 @@ class Service(SocketService):
else:
self.warning('Received no data from socket.')
return data
+
+ @staticmethod
+ def _check_raw_data(data):
+ # The server will close the connection when it's done sending
+ # data, so just keep looping until that happens.
+ return False