]> arthur.barton.de Git - netdata.git/blobdiff - python.d/squid.chart.py
Merge pull request #2022 from l2isbad/dns_query_time_fixes
[netdata.git] / python.d / squid.chart.py
index a16cb0a4e14f2e39eceb96c97148ed63c5985e25..e9e8f1d08bbb1f263136a3e59ff0f59d5960d134 100644 (file)
@@ -1,53 +1,55 @@
 # -*- coding: utf-8 -*-
-# Description: squid netdata python.d plugin
+# 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, 8080)
+        self.port = 3128
         self.order = ORDER
         self.definitions = CHARTS
 
@@ -56,20 +58,50 @@ 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):
         """
         Parse essential configuration, autodetect squid configuration (if needed), and check if data is available
@@ -80,32 +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
+        if self._get_data() is not None:
+            return True
         else:
-            if self._get_data() is not None:
-                return True
-            else:
-                return False
-            
-                
-                
-                
-            
-                
-            
-
+            return False