监视WebSphere 7中的JDBC连接池

时间:2015-03-20 10:43:37

标签: websphere monitoring websphere-7 wsadmin

最近,我们开始使用托管在多个WebSphere Aplication Server中的新应用程序进行生产,并且很高兴用监视/绘制我们监视/绘制Jboss服务器的相同参数来监视/绘制它们。

现在我设法使用jython脚本使用wsadmin监视多个点:

  • Java HEAP
  • 向所有数据源发出“测试连接”

但是,我无法找到监视 JDBC连接池的方法,以检查PoolSize,WaitingThreadCount和FreePoolSize值。我可以使用WAS DMGR中包含的 Tivoli Performance Viewer 在RealTime上监视它们:

Tivoli Performance Viewer JDBC connection pool

但我没有找到通过wsadmin(或任何其他方式)获取它的方法,所以我可以获取值并添加到Cacti / RRD以获取我们已经拥有的Jboss图形:

enter image description here

是否有人设法使用wsadmin或任何其他工具从websphere获取此数据?

2 个答案:

答案 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