tomcat.chart.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. # -*- coding: utf-8 -*-
  2. # Description: tomcat netdata python.d module
  3. # Author: Pawel Krupa (paulfantom)
  4. import xml.etree.ElementTree as ET
  5. from bases.FrameworkServices.UrlService import UrlService
  6. # default module values (can be overridden per job in `config`)
  7. # update_every = 2
  8. priority = 60000
  9. retries = 60
  10. # charts order (can be overridden if you want less charts, or different order)
  11. ORDER = ['accesses', 'bandwidth', 'processing_time', 'threads', 'jvm', 'jvm_eden', 'jvm_survivor', 'jvm_tenured']
  12. CHARTS = {
  13. 'accesses': {
  14. 'options': [None, "Requests", "requests/s", "statistics", "tomcat.accesses", "area"],
  15. 'lines': [
  16. ["requestCount", 'accesses', 'incremental'],
  17. ["errorCount", 'errors', 'incremental'],
  18. ]},
  19. 'bandwidth': {
  20. 'options': [None, "Bandwidth", "KB/s", "statistics", "tomcat.bandwidth", "area"],
  21. 'lines': [
  22. ["bytesSent", 'sent', 'incremental', 1, 1024],
  23. ["bytesReceived", 'received', 'incremental', 1, 1024],
  24. ]},
  25. 'processing_time': {
  26. 'options': [None, "processing time", "seconds", "statistics", "tomcat.processing_time", "area"],
  27. 'lines': [
  28. ["processingTime", 'processing time', 'incremental', 1, 1000]
  29. ]},
  30. 'threads': {
  31. 'options': [None, "Threads", "current threads", "statistics", "tomcat.threads", "area"],
  32. 'lines': [
  33. ["currentThreadCount", 'current', "absolute"],
  34. ["currentThreadsBusy", 'busy', "absolute"]
  35. ]},
  36. 'jvm': {
  37. 'options': [None, "JVM Memory Pool Usage", "MB", "memory", "tomcat.jvm", "stacked"],
  38. 'lines': [
  39. ["free", 'free', "absolute", 1, 1048576],
  40. ["eden_used", 'eden', "absolute", 1, 1048576],
  41. ["survivor_used", 'survivor', "absolute", 1, 1048576],
  42. ["tenured_used", 'tenured', "absolute", 1, 1048576],
  43. ["code_cache_used", 'code cache', "absolute", 1, 1048576],
  44. ["compressed_used", 'compressed', "absolute", 1, 1048576],
  45. ["metaspace_used", 'metaspace', "absolute", 1, 1048576],
  46. ]},
  47. 'jvm_eden': {
  48. 'options': [None, "Eden Memory Usage", "MB", "memory", "tomcat.jvm_eden", "area"],
  49. 'lines': [
  50. ["eden_used", 'used', "absolute", 1, 1048576],
  51. ["eden_commited", 'commited', "absolute", 1, 1048576],
  52. ["eden_max", 'max', "absolute", 1, 1048576]
  53. ]},
  54. 'jvm_survivor': {
  55. 'options': [None, "Survivor Memory Usage", "MB", "memory", "tomcat.jvm_survivor", "area"],
  56. 'lines': [
  57. ["survivor_used", 'used', "absolute", 1, 1048576],
  58. ["survivor_commited", 'commited', "absolute", 1, 1048576],
  59. ["survivor_max", 'max', "absolute", 1, 1048576]
  60. ]},
  61. 'jvm_tenured': {
  62. 'options': [None, "Tenured Memory Usage", "MB", "memory", "tomcat.jvm_tenured", "area"],
  63. 'lines': [
  64. ["tenured_used", 'used', "absolute", 1, 1048576],
  65. ["tenured_commited", 'commited', "absolute", 1, 1048576],
  66. ["tenured_max", 'max', "absolute", 1, 1048576]
  67. ]},
  68. }
  69. class Service(UrlService):
  70. def __init__(self, configuration=None, name=None):
  71. UrlService.__init__(self, configuration=configuration, name=name)
  72. self.url = self.configuration.get('url', "http://127.0.0.1:8080/manager/status?XML=true")
  73. self.connector_name = self.configuration.get('connector_name', None)
  74. self.order = ORDER
  75. self.definitions = CHARTS
  76. def _get_data(self):
  77. """
  78. Format data received from http request
  79. :return: dict
  80. """
  81. data = None
  82. raw_data = self._get_raw_data()
  83. if raw_data:
  84. try:
  85. xml = ET.fromstring(raw_data)
  86. except ET.ParseError:
  87. self.debug('%s is not a vaild XML page. Please add "?XML=true" to tomcat status page.' % self.url)
  88. return None
  89. data = {}
  90. jvm = xml.find('jvm')
  91. connector = None
  92. if self.connector_name:
  93. for conn in xml.findall('connector'):
  94. if self.connector_name in conn.get('name'):
  95. connector = conn
  96. break
  97. else:
  98. connector = xml.find('connector')
  99. memory = jvm.find('memory')
  100. data['free'] = memory.get('free')
  101. data['total'] = memory.get('total')
  102. for pool in jvm.findall('memorypool'):
  103. name = pool.get('name')
  104. if 'Eden Space' in name:
  105. data['eden_used'] = pool.get('usageUsed')
  106. data['eden_commited'] = pool.get('usageCommitted')
  107. data['eden_max'] = pool.get('usageMax')
  108. elif 'Survivor Space' in name:
  109. data['survivor_used'] = pool.get('usageUsed')
  110. data['survivor_commited'] = pool.get('usageCommitted')
  111. data['survivor_max'] = pool.get('usageMax')
  112. elif 'Tenured Gen' in name or 'Old Gen' in name:
  113. data['tenured_used'] = pool.get('usageUsed')
  114. data['tenured_commited'] = pool.get('usageCommitted')
  115. data['tenured_max'] = pool.get('usageMax')
  116. elif name == 'Code Cache':
  117. data['code_cache_used'] = pool.get('usageUsed')
  118. data['code_cache_commited'] = pool.get('usageCommitted')
  119. data['code_cache_max'] = pool.get('usageMax')
  120. elif name == 'Compressed':
  121. data['compressed_used'] = pool.get('usageUsed')
  122. data['compressed_commited'] = pool.get('usageCommitted')
  123. data['compressed_max'] = pool.get('usageMax')
  124. elif name == 'Metaspace':
  125. data['metaspace_used'] = pool.get('usageUsed')
  126. data['metaspace_commited'] = pool.get('usageCommitted')
  127. data['metaspace_max'] = pool.get('usageMax')
  128. if connector:
  129. thread_info = connector.find('threadInfo')
  130. data['currentThreadsBusy'] = thread_info.get('currentThreadsBusy')
  131. data['currentThreadCount'] = thread_info.get('currentThreadCount')
  132. request_info = connector.find('requestInfo')
  133. data['processingTime'] = request_info.get('processingTime')
  134. data['requestCount'] = request_info.get('requestCount')
  135. data['errorCount'] = request_info.get('errorCount')
  136. data['bytesReceived'] = request_info.get('bytesReceived')
  137. data['bytesSent'] = request_info.get('bytesSent')
  138. return data or None