+# -*- coding: utf-8 -*-
+# Description: dns_query_time netdata python.d module
+# Author: l2isbad
+
try:
from time import monotonic as time
except ImportError:
data = self._get_data(timeout=1)
- down_servers = [s[2:] for s in data if data[s] == -100]
- if down_servers:
- self.info('Removed due to non response %s' % down_servers)
- self.server_list = [s for s in self.server_list if s not in down_servers]
- if self.server_list:
- self._data_from_check = data
- self.order, self.definitions = create_charts(aggregate=self.aggregate, server_list=self.server_list)
- self.info(str({'domains': len(self.domains), 'servers': self.server_list}))
- return True
- else:
- return False
+ down_servers = [s for s in data if data[s] == -100]
+ for down in down_servers:
+ down = down[3:].replace('_', '.')
+ self.info('Removed due to non response %s' % down)
+ self.server_list.remove(down)
+ if not self.server_list:
+ return False
+
+ self._data_from_check = data
+ self.order, self.definitions = create_charts(aggregate=self.aggregate, server_list=self.server_list)
+ self.info(str({'domains': len(self.domains), 'servers': self.server_list}))
+ return True
def _get_data(self, timeout=None):
return dns_request(self.server_list, timeout or self.timeout, self.domains)
dns.query.udp(request, ns, timeout=t)
dns_end = time()
query_time = round((dns_end - dns_start) * 1000)
- q.put({''.join(['ns', ns]): query_time})
+ q.put({'_'.join(['ns', ns.replace('.', '_')]): query_time})
except dns.exception.Timeout:
- q.put({''.join(['ns', ns]): -100})
+ q.put({'_'.join(['ns', ns.replace('.', '_')]): -100})
for server in server_list:
th = Thread(target=dns_req, args=(server, timeout, que))
def create_charts(aggregate, server_list):
if aggregate:
order = ['dns_group']
- definitions = {'dns_group': {'options': [None, "DNS Response Time", "ms", 'name servers',
- 'resp.time', 'line'], 'lines': []}}
+ definitions = {'dns_group': {'options': [None, 'DNS Response Time', 'ms', 'name servers',
+ 'dns_query_time.response_time', 'line'], 'lines': []}}
for ns in server_list:
- definitions['dns_group']['lines'].append([''.join(['ns', ns]), ns, 'absolute'])
+ definitions['dns_group']['lines'].append(['_'.join(['ns', ns.replace('.', '_')]), ns, 'absolute'])
return order, definitions
else:
- order = [''.join(['dns_', ns]) for ns in server_list]
+ order = [''.join(['dns_', ns.replace('.', '_')]) for ns in server_list]
definitions = dict()
for ns in server_list:
- definitions[''.join(['dns_', ns])] = {'options': [None, "DNS Response Time", "ms", ns,
- 'resp.time', 'area'],
- 'lines': [[''.join(['ns', ns]), ns, 'absolute']]}
+ definitions[''.join(['dns_', ns.replace('.', '_')])] = {'options': [None, 'DNS Response Time', 'ms', ns,
+ 'dns_query_time.response_time', 'area'],
+ 'lines': [['_'.join(['ns', ns.replace('.', '_')]),
+ ns, 'absolute']]}
return order, definitions
def create_dimensions(self):
self.definitions = {
- 'jails_bans': {'options': [None, "Jails Ban Statistics", "bans/s", 'bans', 'jail.bans', 'line'],
- 'lines': []},
- 'jails_in_jail': {'options': [None, "Currently In Jail", "ip addresses", 'in jail', 'jail.in_jail', 'line'],
- 'lines': []},
+ 'jails_bans': {'options': [None, 'Jails Ban Statistics', "bans/s", 'bans', 'jail.bans', 'line'],
+ 'lines': []},
+ 'jails_in_jail': {'options': [None, 'Banned IPs (since the last restart of netdata)', 'IPs',
+ 'in jail', 'jail.in_jail', 'line'], 'lines': []},
}
for jail in self.jails_list:
self.definitions['jails_bans']['lines'].append([jail, jail, 'incremental'])
# Author: l2isbad
from base import SimpleService
-from re import compile, findall, search, subn
+from re import compile as r_compile
priority = 60000
retries = 60
update_every = 10
ORDER = ['users', 'traffic']
CHARTS = {
'users': {
- 'options': [None, 'OpenVPN active users', 'active users', 'Users', 'openvpn_status.users', 'line'],
+ 'options': [None, 'OpenVPN Active Users', 'active users', 'users', 'openvpn_status.users', 'line'],
'lines': [
["users", None, "absolute"],
]},
'traffic': {
- 'options': [None, 'OpenVPN traffic', 'kilobit/s', 'Traffic', 'openvpn_status.traffic', 'area'],
+ 'options': [None, 'OpenVPN Traffic', 'Kb/s', 'traffic', 'openvpn_status.traffic', 'area'],
'lines': [
["in", None, "incremental", 8, 1000], ["out", None, "incremental", 8, -1000]
]},
}
+
class Service(SimpleService):
def __init__(self, configuration=None, name=None):
SimpleService.__init__(self, configuration=configuration, name=name)
self.order = ORDER
self.definitions = CHARTS
self.log_path = self.configuration.get('log_path')
- self.regex_data_inter = compile(r'(?<=Since ).*?(?=.ROUTING)')
- self.regex_data_final = compile(r'\d{1,3}(?:\.\d{1,3}){3}[:0-9,. ]*')
- self.regex_users = compile(r'\d{1,3}(?:\.\d{1,3}){3}:\d+')
- self.regex_traffic = compile(r'(?<=(?:,| ))\d+(?=(?:,| ))')
+ self.regex_data_inter = r_compile(r'(?<=Since ).*?(?=.ROUTING)')
+ self.regex_data_final = r_compile(r'\d{1,3}(?:\.\d{1,3}){3}[:0-9,. ]*')
+ self.regex_users = r_compile(r'\d{1,3}(?:\.\d{1,3}){3}:\d+')
+ self.regex_traffic = r_compile(r'(?<=(?:,| ))\d+(?=(?:,| ))')
def check(self):
- if not self._get_raw_data():
+ if not (self.log_path and isinstance(self.log_path, str)):
+ self.error('\'log_path\' is not defined')
+ return False
+
+ data = self._get_data()
+ if not data:
self.error('Make sure that the openvpn status log file exists and netdata has permission to read it')
return False
else:
- self.info('Plugin was started succesfully')
+ self._data_from_check = data
return True
def _get_raw_data(self):
Open log file
:return: str
"""
+
try:
with open(self.log_path, 'rt') as log:
result = log.read()
- except Exception:
+ except OSError:
return None
else:
- return result
+ return result or None
def _get_data(self):
"""
"""
raw_data = self._get_raw_data()
- try:
- data_inter = self.regex_data_inter.search(' '.join(raw_data.splitlines())).group()
- except AttributeError:
- data_inter = ''
+ if not raw_data:
+ return None
+
+ data_inter = self.regex_data_inter.search(' '.join(raw_data.splitlines()))
+ if not data_inter:
+ return None
+ else:
+ data_inter = data_inter.group()
data_final = ' '.join(self.regex_data_final.findall(data_inter))
users = self.regex_users.subn('', data_final)[1]
traffic = self.regex_traffic.findall(data_final)
- bytes_in = sum([int(traffic[i]) for i in range(len(traffic)) if (i + 1) % 2 is 1])
- bytes_out = sum([int(traffic[i]) for i in range(len(traffic)) if (i + 1) % 2 is 0])
+ bytes_in = sum(int(traffic[i[0]]) for i in enumerate(traffic) if (i[0] + 1) % 2 is 1)
+ bytes_out = sum(int(traffic[i[0]]) for i in enumerate(traffic) if (i[0] + 1) % 2 is 0)
return {'users': users, 'in': bytes_in, 'out': bytes_out}
# Description: smart netdata python.d module
# Author: l2isbad, vorph1
-from re import compile
+from re import compile as r_compile
from os import listdir, access, R_OK
from os.path import isfile, join, getsize, basename, isdir
try:
class Service(SimpleService):
def __init__(self, configuration=None, name=None):
SimpleService.__init__(self, configuration=configuration, name=name)
- self.regex = compile(r'(\d+);(\d+);(\d+)')
+ self.regex = r_compile(r'(\d+);(\d+);(\d+)')
self.log_path = self.configuration.get('log_path', '/var/log/smartd')
self.raw_values = self.configuration.get('raw_values')
self.attr = self.configuration.get('smart_attributes', [])
for k, v in dict([(k, v) for k, v in SMART_ATTR.items() if k in ORDER]).items():
self.definitions.update({''.join(['attrid', k]): {
- 'options': [None, v, units, v, 'smartd.attrid' + k, 'line'],
+ 'options': [None, v, units, v.lower(), 'smartd.attrid' + k, 'line'],
'lines': create_lines(k)}})
def find_disks_in_log_path(log_path):