X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=python.d%2Ftomcat.chart.py;h=c20f85e1ecd2818a6b87386e1f2e8d1c368f7591;hb=1899f0e3c7d3e67170909be5335d75fb39ac5463;hp=a045d86a7d27c5067b6e953266c4e7fc9ef1a455;hpb=da60cc7193aef46e1c5281ef1bf38796ee5e0316;p=netdata.git diff --git a/python.d/tomcat.chart.py b/python.d/tomcat.chart.py index a045d86a..c20f85e1 100644 --- a/python.d/tomcat.chart.py +++ b/python.d/tomcat.chart.py @@ -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'.*?') + 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))