]> arthur.barton.de Git - netdata.git/blobdiff - python.d/tomcat.chart.py
Remove manager/status?XML=true URI Requirement
[netdata.git] / python.d / tomcat.chart.py
index a045d86a7d27c5067b6e953266c4e7fc9ef1a455..c20f85e1ecd2818a6b87386e1f2e8d1c368f7591 100644 (file)
@@ -2,11 +2,13 @@
 # Description: tomcat netdata python.d module
 # Author: Pawel Krupa (paulfantom)
 
-# Python version higher than 2.7 is needed to run this module.
-
 from base import UrlService
-import xml.etree.ElementTree as ET  # phone home...
-import xml.parsers.expat.errors as errors
+from re import compile
+
+try:
+    from urlparse import urlparse
+except ImportError:
+    from urllib.parse import urlparse
 
 # default module values (can be overridden per job in `config`)
 # update_every = 2
@@ -18,25 +20,25 @@ ORDER = ['accesses', 'volume', 'threads', 'jvm']
 
 CHARTS = {
     'accesses': {
-        'options': [None, "tomcat requests", "requests/s", "statistics", "tomcat.accesses", "area"],
+        'options': [None, "Requests", "requests/s", "statistics", "tomcat.accesses", "area"],
         'lines': [
-            ["accesses"]
+            ["requestCount", 'accesses', 'incremental']
         ]},
     'volume': {
-        'options': [None, "tomcat volume", "KB/s", "volume", "tomcat.volume", "area"],
+        'options': [None, "Volume", "KB/s", "volume", "tomcat.volume", "area"],
         'lines': [
-            ["volume", None, 'incremental']
+            ["bytesSent", 'volume', 'incremental', 1, 1024]
         ]},
     'threads': {
-        'options': [None, "tomcat threads", "current threads", "statistics", "tomcat.threads", "line"],
+        'options': [None, "Threads", "current threads", "statistics", "tomcat.threads", "line"],
         'lines': [
-            ["current", None, "absolute"],
-            ["busy", None, "absolute"]
+            ["currentThreadCount", 'current', "absolute"],
+            ["currentThreadsBusy", 'busy', "absolute"]
         ]},
     'jvm': {
         'options': [None, "JVM Free Memory", "MB", "statistics", "tomcat.jvm", "area"],
         'lines': [
-            ["jvm", None, "absolute"]
+            ["free", None, "absolute", 1, 1048576]
         ]}
 }
 
@@ -44,67 +46,31 @@ CHARTS = {
 class Service(UrlService):
     def __init__(self, configuration=None, name=None):
         UrlService.__init__(self, configuration=configuration, name=name)
-        if len(self.url) == 0:
-            self.url = "http://localhost:8080/manager/status?XML=true"
+        self.url = self.configuration.get('url', "http://127.0.0.1:8080/manager/status?XML=true")
         self.order = ORDER
         self.definitions = CHARTS
-        self.port = 8080
 
     def check(self):
-        if UrlService.check(self):
-            return True
-
-        # get port from url
-        self.port = 0
-        for i in self.url.split('/'):
-            try:
-                int(i[-1])
-                self.port = i.split(':')[-1]
-                break
-            except:
-                pass
-        if self.port == 0:
-            self.port = 80
-
-        if self._get_data() is None or len(self._get_data()) == 0:
-            return False
-        else:
-            return True
+        netloc = urlparse(self.url).netloc.rpartition(':')
+        if netloc[1] == ':': port = netloc[2]
+        else: port = 80
+        
+        self.regex_jvm = compile(r'<jvm>.*?</jvm>')
+        self.regex_connector = compile(r'[a-z-]+%s.*?/connector' % port)
+        self.regex = compile(r'([\w]+)=\\?[\'\"](\d+)\\?[\'\"]')
+        
+        return UrlService.check(self)
 
     def _get_data(self):
         """
         Format data received from http request
         :return: dict
         """
-        try:
-            raw = self._get_raw_data()
-            try:
-                data = ET.fromstring(raw)
-            except ET.ParseError as e:
-                if e.code == errors.codes[errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT]:
-                    # cut rest of invalid string
-                    pos = 0
-                    for i in range(e.position[0] - 1):
-                        pos += raw.find('\n', pos)
-                    raw = raw[:47604 + pos + e.position[0] - 1]
-                    data = ET.fromstring(raw)
-                else:
-                    raise ET.ParseError(e)
-
-            memory = data.find('./jvm/memory')
-            threads = data.find("./connector[@name='\"http-bio-" + str(self.port) + "\"']/threadInfo")
-            requests = data.find("./connector[@name='\"http-bio-" + str(self.port) + "\"']/requestInfo")
+        data = self._get_raw_data()
+        if data:
+            jvm = self.regex_jvm.findall(data) or ['']
+            connector = self.regex_connector.findall(data) or ['']
+            data = dict(self.regex.findall(''.join([jvm[0], connector[0]])))
+        
+        return data or None
 
-            return {'accesses': requests.attrib['requestCount'],
-                    'volume': requests.attrib['bytesSent'],
-                    'current': threads.attrib['currentThreadCount'],
-                    'busy': threads.attrib['currentThreadsBusy'],
-                    'jvm': memory.attrib['free']}
-        except (ValueError, AttributeError) as e:
-            self.debug(str(e))
-            return None
-        except SyntaxError as e:
-            self.error("Tomcat module needs python 2.7 at least. Stopping")
-            self.debug(str(e))
-        except Exception as e:
-            self.debug(str(e))