网上找了一上午,没有合用的脚本,花半天用python写了一个简单的脚本,用来获取tomcat status信息,计划上报到ganglia中
[code language=”python”]
#!/usr/bin/python
# -*- coding: utf-8 -*-
#encoding=utf-8
#Filename:get_tomcat_status.py
#Author:hunter
#WebSite: www.hunterpro.net
import urllib2
import sys
import base64
import xml.parsers.expat
#A table showing Stage, Time, Bytes Sent, Bytes Receive, Client, VHost and Request. All existing threads are listed in the table. Here is the list of the possible thread stages :
# "Parse and Prepare Request" : The request headers are being parsed or the necessary preparation to read the request body (if a transfer encoding has been specified) is taking place.
# "Service" : The thread is processing a request and generating the response. This stage follows the "Parse and Prepare Request" stage and precedes the "Finishing" stage. There is always at least one thread in this stage (the server-status page).
# "Finishing" : The end of the request processing. Any remainder of the response still in the output buffers is sent to the client. This stage is followed by "Keep-Alive" if it is appropriate to keep the connection alive or "Ready" if "Keep-Alive" is not appropriate.
# "Keep-Alive" : The thread keeps the connection open to the client in case the client sends another request. If another request is received, the next stage will be "Parse and Prepare Request". If no request is received before the keep alive times out, the connection will be closed and the next stage will be "Ready".
# "Ready" : The thread is at rest and ready to be used.
class TomcatStatusParser:
def __init__(self, is_detail):
self.is_detail = is_detail
self.value = {}
self.connector_name = None
self.inXml = 0
self.inconnector = 0
def parse(self, xmlString):
p = xml.parsers.expat.ParserCreate()
p.StartElementHandler = parser.start_element
p.EndElementHandler = parser.end_element
p.Parse(xmlString)
if self.value == None:
raise Exception("can’t parse xml")
return self.value
def set_memory_pool(self, poolname, attrs):
memoryPoolDict={}
memoryPoolDict["init"] = attrs["usageInit"]
memoryPoolDict["committed"] = attrs["usageCommitted"]
memoryPoolDict["max"] = attrs["usageMax"]
memoryPoolDict["used"] = attrs["usageUsed"]
self.value[poolname] = memoryPoolDict
def set_thread_info(self, attrs):
thread_info={}
thread_info["max"] = attrs["maxThreads"]
thread_info["count"] = attrs["currentThreadCount"]
thread_info["busy"] = attrs["currentThreadsBusy"]
self.value[self.connector_name]["threadInfo"] = thread_info
def set_request_info(self, attrs):
request_info={}
request_info["max"] = attrs["maxTime"]
request_info["process"] = attrs["processingTime"]
request_info["requests"] = attrs["requestCount"]
request_info["errors"] = attrs["errorCount"]
request_info["received"] = attrs["bytesReceived"]
request_info["sent"] = attrs["bytesSent"]
self.value[self.connector_name]["requestInfo"] = request_info
def add_worker(self, attrs):
work_info={}
work_info["stage"] = attrs["stage"]
work_info["process"] = attrs["requestProcessingTime"]
work_info["remote_addr"] = attrs["remoteAddr"]
work_info["vhost"] = attrs["virtualHost"]
work_info["received"] = attrs["requestBytesReceived"]
work_info["sent"] = attrs["requestBytesSent"]
work_info["method"] = attrs["method"]
work_info["url"] = attrs["currentUri"]
self.value[self.connector_name]["works"].append(work_info)
def start_element(self, name, attrs):
if name == "status" and self.inXml == 0:
self.inXml = 1
elif self.inXml == 1:
if name == "memory":
self.value["mem_free"] = attrs["free"]
self.value["mem_total"] = attrs["total"]
self.value["mem_max"] = attrs["max"]
elif name == "memorypool":
if attrs["name"] == "PS Eden Space":
self.set_memory_pool("pool_eden", attrs)
elif attrs["name"] == "PS Old Gen":
self.set_memory_pool("pool_old", attrs)
elif attrs["name"] == "PS Survivor Space":
self.set_memory_pool("pool_survivor", attrs)
elif attrs["name"] == "Code Cache":
self.set_memory_pool("pool_code", attrs)
elif attrs["name"] == "PS Perm Gen":
self.set_memory_pool("pool_perm", attrs)
elif name == "connector":
self.connector_name = attrs["name"].replace(‘"’,”)
self.inconnector = 1
self.value[self.connector_name] = {}
self.value[self.connector_name]["works"] = []
elif self.inconnector == 1:
if name == "threadInfo":
self.set_thread_info(attrs)
elif name == "requestInfo":
self.set_request_info(attrs)
elif name == "workers":
self.inconnector = 2
self.works_num = 0
elif self.inconnector == 2:
if name == "worker":
self.add_worker(attrs)
def end_element(self, name):
if name == "status" and self.inXml==1:
self.inXml = 0
def httpget(url, authorUser, authPass):
authorStr = authorUser + ":" + authPass
authorEncStr = base64.standard_b64encode(authorStr)
try:
req = urllib2.Request(url)
req.add_header(‘User-Agent’,’monitor_agent’)
req.add_header(‘Authorization’,"Basic " + authorEncStr)
r = urllib2.urlopen(req)
#receive_header = r.info()
#print receive_header
if r.getcode() == 200:
html = r.read()
return html
else:
return ""
except Exception, e:
print e
sys.exit(2)
def httpget2(url, authorUser, authPass):
try:
password_mgr.add_password(None, url, authorUser, authPass)
handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(handler)
urllib2.install_opener(opener)
r = urllib2.urlopen(url)
if r.getcode() == 200:
html = r.read()
return html
else:
return ""
except Exception, e:
print e
sys.exit(2)
authUser="your user"
authPass="your pass"
tomcatUrl="http://127.0.0.1:8080/manager/status?XML=true"
xmlStr = httpget(tomcatUrl,authUser,authPass)
print ‘#####################################’
if len(xmlStr)>0 :
parser = TomcatStatusParser(1)
jsonStr = parser.parse(xmlStr)
print jsonStr
[/code]