最近,我们开始使用托管在多个WebSphere Aplication Server中的新应用程序进行生产,并且很高兴用监视/绘制我们监视/绘制Jboss服务器的相同参数来监视/绘制它们。
现在我设法使用jython脚本使用wsadmin监视多个点:
但是,我无法找到监视 JDBC连接池的方法,以检查PoolSize,WaitingThreadCount和FreePoolSize值。我可以使用WAS DMGR中包含的 Tivoli Performance Viewer 在RealTime上监视它们:
但我没有找到通过wsadmin(或任何其他方式)获取它的方法,所以我可以获取值并添加到Cacti / RRD以获取我们已经拥有的Jboss图形:
是否有人设法使用wsadmin或任何其他工具从websphere获取此数据?
答案 0 :(得分:1)
wsadmin
许多WAS MBean都公开stats
属性。此属性表示组件的运行时统计信息。在您的情况下,MBean类型为JDBCProvider
,其stats
对象实现JSR-77中定义的javax.management.j2ee.statistics.JDBCStats
接口。
掌握了stats属性值,您就可以提取所有其他数据。
一个重要提示:在wsadmin
中,您需要使用getAttribute_jmx
的{{1}}功能,而不仅仅是AdminControl
。
广告模式 使用wsadmin和MBean非常困难,尤其是在访问复杂属性时。您可以使用WDR更轻松地找到此过程。
定期启动getAttribute
进程只查询一个或两个属性似乎给我增加了太多开销。另一种方法是在WSAS中安装一些代码,这些代码可以以易于使用的方式公开这些统计信息。其中一个工具是Jolokia。 Jolokia是一个Web应用程序,使用XML或JSON格式通过HTTTP公开MBean。让Jolokia在您的WSAS中运行,您可以定期从任何编程语言中查询它,然后提供您的时间序列选择。
显然,WSAS有自己的细节:额外wsadmin
,安全性,因此您需要额外的描述符和代码。此外,默认情况下,Jolokia无法序列化JSR-77对象,因此您需要自己提供这些序列化程序。我过去一直在使用Jolokia和WSAS,所有这些缺失的部分都可以在clone of Jolokia repo中找到。 Roland Huss(Jolokia的作者)在Jolokia-Extra project中实现了其中一些(不包括EAR和WSAS描述符)。
答案 1 :(得分:0)
最后,我设法获取了这些地址后的统计信息https://www.ibm.com/developerworks/websphere/techjournal/1112_guillemenot/1112_guillemenot.html?ca=drs-
基本上我已经创建了一个函数来获取我需要的 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