from base import SimpleService
from re import compile
-from os import access as is_executable, X_OK
from subprocess import Popen, PIPE
-
# default module values (can be overridden per job in `config`)
# update_every = 2
priority = 60000
['esi_errors_b', None, 'incremental', 1, 1],
['esi_warnings_b', None, 'incremental', 1, 1],
['sess_fail_b', None, 'incremental', 1, 1],
+ ['sc_pipe_overflow_b', None, 'incremental', 1, 1],
['sess_pipe_overflow_b', None, 'incremental', 1, 1]],
'options': [None, 'Misbehavior', 'problems', 'Problems summary', 'varnish.bad', 'line']},
'expunge':
['s0.g_bytes', 'allocated', 'absolute', -1, 1048576]],
'options': [None, 'Memory usage', 'megabytes', 'Memory usage', 'varnish.memory_usage', 'stacked']},
'session':
- {'lines': [['sess_conn', 'conn', 'incremental', 1, 1],
- ['client_req', 'requests', 'incremental', 1, 1],
- ['sess_dropped', 'dropped', 'incremental', 1, 1]],
+ {'lines': [['sess_conn', 'sess_conn', 'incremental', 1, 1],
+ ['client_req', 'client_requests', 'incremental', 1, 1],
+ ['client_conn', 'client_conn', 'incremental', 1, 1],
+ ['client_drop', 'client_drop', 'incremental', 1, 1],
+ ['sess_dropped', 'sess_dropped', 'incremental', 1, 1]],
'options': [None, 'Sessions', 'units', 'Client metrics', 'varnish.session', 'line']},
'threads':
{'lines': [['threads', None, 'absolute', 1, 1],
'options': [None, 'Varnish uptime', 'seconds', 'Uptime', 'varnish.uptime', 'line']}
}
-DIRECTORIES = ['/bin/', '/usr/bin/', '/sbin/', '/usr/sbin/']
-
class Service(SimpleService):
def __init__(self, configuration=None, name=None):
SimpleService.__init__(self, configuration=configuration, name=name)
- try:
- self.varnish = [''.join([directory, 'varnishstat']) for directory in DIRECTORIES
- if is_executable(''.join([directory, 'varnishstat']), X_OK)][0]
- except IndexError:
- self.varnish = False
- self.rgx_all = compile(r'([A-Z]+\.)([\d\w_.]+)\s+(\d+)')
+ self.varnish = self.find_binary('varnishstat')
+ self.rgx_all = compile(r'([A-Z]+\.)?([\d\w_.]+)\s+(\d+)')
# Could be
# VBE.boot.super_backend.pipe_hdrbyte (new)
# or
def check(self):
# Cant start without 'varnishstat' command
if not self.varnish:
- self.error('\'varnishstat\' command was not found in %s or not executable by netdata' % DIRECTORIES)
+ self.error('Can\'t locate \'varnishstat\' binary or binary is not executable by netdata')
return False
# If command is present and we can execute it we need to make sure..
# 2. Output is parsable (list is not empty after regex findall)
is_parsable = self.rgx_all.findall(reply)
if not is_parsable:
- self.error('Cant parse output (only varnish version 4+ supported)')
+ self.error('Cant parse output...')
return False
# We need to find the right regex for backend parse
self.rgx_bck = self.rgx_bck[0]
else:
self.backend_list = self.rgx_bck[1].findall(reply)[::2]
- self.rgx_bck = self.rgx_back[1]
+ self.rgx_bck = self.rgx_bck[1]
# We are about to start!
self.create_charts()
if not raw_data:
return None
- return raw_data
+ return raw_data.decode()
def _get_data(self):
"""
return None
# 1. ALL data from 'varnishstat -1'. t - type(MAIN, MEMPOOL etc)
- to_netdata = {k: int(v) for t, k, v in data_all}
+ to_netdata = dict([(k, int(v)) for t, k, v in data_all])
# 2. ADD backend statistics
- to_netdata.update({'_'.join([n, k]): int(v) for n, k, v in data_backend})
+ to_netdata.update(dict([('_'.join([n, k]), int(v)) for n, k, v in data_backend]))
# 3. ADD additional keys to dict
# 3.1 Cache hit/miss/hitpass OVERALL in percent
self.cache_prev = [to_netdata.get('cache_hit', 0), to_netdata.get('cache_miss', 0), to_netdata.get('cache_hitpass', 0)]
# 3.3 Problems summary chart
- for elem in ['backend_busy', 'backend_unhealthy', 'esi_errors', 'esi_warnings', 'losthdr', 'sess_drop',
+ for elem in ['backend_busy', 'backend_unhealthy', 'esi_errors', 'esi_warnings', 'losthdr', 'sess_drop', 'sc_pipe_overflow',
'sess_fail', 'sess_pipe_overflow', 'threads_destroyed', 'threads_failed', 'threads_limited', 'thread_queue_len']:
- to_netdata[''.join([elem, '_b'])] = to_netdata.get(elem, 0)
+ if to_netdata.get(elem) is not None:
+ to_netdata[''.join([elem, '_b'])] = to_netdata.get(elem)
# Ready steady go!
return to_netdata
#self.order.extend(extra_charts)
# Create static charts
- self.definitions = {chart: values for chart, values in CHARTS.items() if chart in self.order}
+ #self.definitions = {chart: values for chart, values in CHARTS.items() if chart in self.order}
+ self.definitions = CHARTS
# Create dynamic backend charts
if self.backend_list: