Websphere 监视WebPere 7上的JDBC连接池
最近,我们开始生产一个新的应用程序,该应用程序托管在多个WebSphereApplicationServer中,如果能够使用与Jboss服务器监视/绘制的参数大致相同的参数对其进行监视/绘制,那就太好了 现在,我使用jython脚本通过wsadmin监控了几个点:Websphere 监视WebPere 7上的JDBC连接池,websphere,monitoring,websphere-7,wsadmin,Websphere,Monitoring,Websphere 7,Wsadmin,最近,我们开始生产一个新的应用程序,该应用程序托管在多个WebSphereApplicationServer中,如果能够使用与Jboss服务器监视/绘制的参数大致相同的参数对其进行监视/绘制,那就太好了 现在,我使用jython脚本通过wsadmin监控了几个点: Java堆 向所有数据源发出“测试连接” 但是,我无法找到监视JDBC连接池的方法,无法检查PoolSize、WaitingThreadCount和FreePoolSize值。我可以使用WAS DMGR中包含的Tivoli Per
- Java堆
- 向所有数据源发出“测试连接”
wsadmin
许多WAS MBean公开了stats
属性。此属性表示组件的运行时统计信息。在您的例子中,MBean类型将是JDBCProvider
,其stats
对象实现了JSR-77中定义的javax.management.j2ee.statistics.JDBCStats
接口
有了这个stats属性值,您将能够提取所有其他数据
一个重要提示:在wsadmin
中,您需要使用AdminControl
的getAttribute_jmx
函数,而不仅仅是getAttribute
广告模式使用wsadmin和MBean可能很困难,尤其是在访问复杂属性时。您可能会发现这一过程更容易使用
其他选择
定期启动wsadmin
进程,只查询一个或两个属性,这似乎给我增加了太多的开销。另一种方法是在WSAS中安装一些代码,以易于使用的方式公开这些统计信息。一个这样的工具是。Jolokia是一个web应用程序,使用XML或JSON格式,通过HTTTP公开MBean。让Jolokia在WSA中运行,您只需从任何编程语言定期查询它,然后输入您的时间序列选择
显然,WSAS有自己的特性:额外的
MBeanServer
,安全性,因此您需要额外的描述符和代码。此外,默认情况下,Jolokia无法序列化JSR-77对象,因此您需要自己提供这些序列化程序。我过去一直在将Jolokia与WSAS结合使用,所有缺失的部分都可以在一个数据库中找到。Roland Huss(Jolokia的作者)在中实现了其中的一些(不包括EAR和WSAS描述符)。最后,我设法获得了这些地址后面的统计信息
基本上,我创建了一个函数来获取有关JDBC连接池的统计信息,我需要:
def getStats(server,driver,datasource):
perfStr = AdminControl.queryNames( 'type=Perf,process=' + server + ',*')
if perfStr == "":
print "Sorry I can't find server " + server
sys.exit(1)
perfObj = AdminControl.makeObjectName( perfStr)
srvrStr = AdminControl.queryNames( 'type=Server,process=' + server + ',*')
srvrObj = AdminControl.makeObjectName( srvrStr)
stats = AdminControl.invoke_jmx( perfObj, 'getStatsObject', [ srvrObj, java.lang.Boolean('true')], ['javax.management.ObjectName', 'java.lang.Boolean'])
try:
waitingThreads=stats.getStats('connectionPoolModule').getStats(driver).getStats(datasource).getStatistic('WaitingThreadCount').getCurrent()
poolSize=stats.getStats('connectionPoolModule').getStats(driver).getStats(datasource).getStatistic('PoolSize').getCurrent()
freePoolSize=stats.getStats('connectionPoolModule').getStats(driver).getStats(datasource).getStatistic('FreePoolSize').getCurrent()
percentUsed=stats.getStats('connectionPoolModule').getStats(driver).getStats(datasource).getStatistic('PercentUsed').getCurrent()
print "WaitingThreadCount=" + str(waitingThreads) + ", PoolSize=" + str(poolSize) + ", FreePoolSize=" + str(freePoolSize) + ", PercentUsed=" + str(percentUsed)
except:
print "Ooops, something went wrong :("
raise
为了识别服务器、驱动程序和数据源变量,我还添加了一个函数来列出它们:
def listServers():
"""List the servers Database Connection Pools"""
servers = AdminControl.queryNames( 'type=Perf,*').split("\n")
for i in range(0, len(servers)):
srvName = servers[i].split(",")[1].split("=")[1]
if srvName == "nodeagent":
continue
print "Server: " + srvName
perfStr = AdminControl.queryNames( 'type=Perf,process=' + srvName +',*')
perfObj = AdminControl.makeObjectName( perfStr)
srvrStr = AdminControl.queryNames( 'type=Server,process=' + srvName +',*')
srvrObj = AdminControl.makeObjectName( srvrStr)
stats = AdminControl.invoke_jmx( perfObj, 'getStatsObject', [ srvrObj, java.lang.Boolean('true')], ['javax.management.ObjectName', 'java.lang.Boolean'])
for driver in stats.getStats('connectionPoolModule').subCollections():
print "\tDriver Name: " + driver.getName()
for datasource in stats.getStats('connectionPoolModule').getStats(driver.getName()).subCollections():
print "\t\tDatasource: " + datasource.getName()
这将输出如下内容:
Server: APP_CLUSTER_APP01
Driver Name: Oracle JDBC Driver (XA)
Datasource: jdbc/AppEngine
Datasource: jdbc/AppEngineH
Server: APP_CLUSTER_APP02
Driver Name: Oracle JDBC Driver (XA)
Datasource: jdbc/AppEngine
Datasource: jdbc/AppEngineH
Server: SOL_CLUSTER_SOL01
Driver Name: Oracle JDBC Driver (XA)
Datasource: jdbc/dict1ds
Datasource: jdbc/dict2ds
Datasource: jdbc/dict3ds
Server: SOL_CLUSTER_SOL02
Driver Name: Oracle JDBC Driver (XA)
Datasource: jdbc/dict1ds
Datasource: jdbc/dict2ds
Datasource: jdbc/dict3ds
您是否尝试从PerfServlet获取数据@AntonNovopashin我会看一看,谢谢。非常感谢@MarcinPłonka,我会看一看WDR和Jolokia。最后一个特别有趣,因为它是一种不用太多脚本就可以监视事情的简单方法:)