X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=python.d%2Fsquid.chart.py;h=e9e8f1d08bbb1f263136a3e59ff0f59d5960d134;hb=7e5e0bcf61f2a482530695816202d83e4e508ed5;hp=f68ce7e57c9950d1223be0fc628a4a9481cf8b18;hpb=c2f188f6db995d19c85823b829585d804a8ab026;p=netdata.git diff --git a/python.d/squid.chart.py b/python.d/squid.chart.py index f68ce7e5..e9e8f1d0 100644 --- a/python.d/squid.chart.py +++ b/python.d/squid.chart.py @@ -2,49 +2,51 @@ # Description: squid netdata python.d module # Author: Pawel Krupa (paulfantom) -from base import NetSocketService +from base import SocketService +import select # default module values (can be overridden per job in `config`) # update_every = 2 priority = 60000 -retries = 5 +retries = 60 # charts order (can be overridden if you want less charts, or different order) ORDER = ['clients_net', 'clients_requests', 'servers_net', 'servers_requests'] CHARTS = { 'clients_net': { - 'options': [None, "Squid Client Bandwidth", "kilobits/s", "clients", "squid.clients.net" "area"], + 'options': [None, "Squid Client Bandwidth", "kilobits/s", "clients", "squid.clients_net", "area"], 'lines': [ ["client_http_kbytes_in", "in", "incremental", 8, 1], ["client_http_kbytes_out", "out", "incremental", -8, 1], ["client_http_hit_kbytes_out", "hits", "incremental", -8, 1] ]}, 'clients_requests': { - 'options': [None, "Squid Client Requests", "requests/s", "clients", "squid.clients.requests", 'line'], + 'options': [None, "Squid Client Requests", "requests/s", "clients", "squid.clients_requests", 'line'], 'lines': [ - ["client_http_requests", "requests"], - ["client_http_hits", "hits"], + ["client_http_requests", "requests", "incremental"], + ["client_http_hits", "hits", "incremental"], ["client_http_errors", "errors", "incremental", -1, 1] ]}, 'servers_net': { - 'options': [None, "Squid Server Bandwidth", "kilobits/s", "servers", "squid.servers.net" "area"], + 'options': [None, "Squid Server Bandwidth", "kilobits/s", "servers", "squid.servers_net", "area"], 'lines': [ ["server_all_kbytes_in", "in", "incremental", 8, 1], ["server_all_kbytes_out", "out", "incremental", -8, 1] ]}, 'servers_requests': { - 'options': [None, "Squid Server Requests", "requests/s", "servers", "squid.servers.requests", 'line'], + 'options': [None, "Squid Server Requests", "requests/s", "servers", "squid.servers_requests", 'line'], 'lines': [ - ["server_all_requests", "requests"], + ["server_all_requests", "requests", "incremental"], ["server_all_errors", "errors", "incremental", -1, 1] ]} } -class Service(NetSocketService): +class Service(SocketService): def __init__(self, configuration=None, name=None): - NetSocketService.__init__(self, configuration=configuration, name=name) + SocketService.__init__(self, configuration=configuration, name=name) + self._keep_alive = True self.request = "" self.host = "localhost" self.port = 3128 @@ -56,19 +58,49 @@ class Service(NetSocketService): Get data via http request :return: dict """ + response = self._get_raw_data() + + data = {} try: - raw = self._get_raw_data().split('\n') - if "200 OK" not in raw[0]: + raw = "" + for tmp in response.split('\r\n'): + if tmp.startswith("sample_time"): + raw = tmp + break + + if raw.startswith('<'): + self.error("invalid data received") return None - data = {} - for row in raw: + + for row in raw.split('\n'): if row.startswith(("client", "server.all")): tmp = row.split("=") data[tmp[0].replace('.', '_').strip(' ')] = int(tmp[1]) - return data - except (ValueError, AttributeError): + except (ValueError, AttributeError, TypeError): + self.error("invalid data received") + return None + + if len(data) == 0: + self.error("no data received") return None + else: + return data + + def _check_raw_data(self, data): + header = data[:1024].lower() + + if "connection: keep-alive" in header: + self._keep_alive = True + else: + self._keep_alive = False + + if data[-7:] == "\r\n0\r\n\r\n" and "transfer-encoding: chunked" in header: # HTTP/1.1 response + self.debug("received full response from squid") + return True + + self.debug("waiting more data from squid") + return False def check(self): """ @@ -80,33 +112,10 @@ class Service(NetSocketService): req = self.request.decode() if not req.startswith("GET"): req = "GET " + req - if not req.endswith(" HTTP/1.0\r\n\r\n"): - req += " HTTP/1.0\r\n\r\n" + if not req.endswith(" HTTP/1.1\r\n\r\n"): + req += " HTTP/1.1\r\n\r\n" self.request = req.encode() - # - # # autodetect squid - # if type(self.port) is tuple: - # ports = self.port - # for port in ports: - # self.port = port - # urls = ["cache_object://" + self.host + ":" + str(port) + "/counters", - # "/squid-internal-mgr/counters"] - # for url in urls: - # tmp = "GET " + url + " HTTP/1.0\r\n\r\n" - # self.request = tmp.encode() - # if self._get_data() is not None: - # return True - # else: - if True: - if self._get_data() is not None: - return True - else: - return False - - - - - - - - + if self._get_data() is not None: + return True + else: + return False