tomcat work on different port than 8080 and with malformed data
paulfantom committed
Jul 26, 2016 at 23:54 UTC
da60cc7193aef46e1c5281ef1bf38796ee5e0316
1 file changed
+27
-2
python.d/tomcat.chart.py
+27
-2
@@ -6,6 +6,7 @@
6
7
from base import UrlService
8
import xml.etree.ElementTree as ET # phone home...
9
+import xml.parsers.expat.errors as errors
10
11
# default module values (can be overridden per job in `config`)
12
# update_every = 2
@@ -47,6 +48,12 @@ class Service(UrlService):
48
self.url = "http://localhost:8080/manager/status?XML=true"
49
self.order = ORDER
50
self.definitions = CHARTS
51
+ self.port = 8080
52
+
53
+ def check(self):
54
+ if UrlService.check(self):
55
+ return True
56
+
57
# get port from url
58
self.port = 0
59
for i in self.url.split('/'):
@@ -59,6 +66,11 @@ class Service(UrlService):
66
if self.port == 0:
67
self.port = 80
68
69
+ if self._get_data() is None or len(self._get_data()) == 0:
70
+ return False
71
+ else:
72
+ return True
73
+
74
def _get_data(self):
75
"""
76
Format data received from http request
@@ -66,7 +78,19 @@ class Service(UrlService):
78
"""
79
try:
80
raw = self._get_raw_data()
69
- data = ET.fromstring(raw)
81
+ try:
82
+ data = ET.fromstring(raw)
83
+ except ET.ParseError as e:
84
+ if e.code == errors.codes[errors.XML_ERROR_JUNK_AFTER_DOC_ELEMENT]:
85
+ # cut rest of invalid string
86
+ pos = 0
87
+ for i in range(e.position[0] - 1):
88
+ pos += raw.find('\n', pos)
89
+ raw = raw[:47604 + pos + e.position[0] - 1]
90
+ data = ET.fromstring(raw)
91
+ else:
92
+ raise ET.ParseError(e)
93
+
94
memory = data.find('./jvm/memory')
95
threads = data.find("./connector[@name='\"http-bio-" + str(self.port) + "\"']/threadInfo")
96
requests = data.find("./connector[@name='\"http-bio-" + str(self.port) + "\"']/requestInfo")
@@ -76,7 +100,8 @@ class Service(UrlService):
100
'current': threads.attrib['currentThreadCount'],
101
'busy': threads.attrib['currentThreadsBusy'],
102
'jvm': memory.attrib['free']}
79
- except (ValueError, AttributeError):
103
+ except (ValueError, AttributeError) as e:
104
+ self.debug(str(e))
105
return None
106
except SyntaxError as e:
107
self.error("Tomcat module needs python 2.7 at least. Stopping")