Websphere 监视WebPere 7上的JDBC连接池

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

最近,我们开始生产一个新的应用程序,该应用程序托管在多个WebSphereApplicationServer中,如果能够使用与Jboss服务器监视/绘制的参数大致相同的参数对其进行监视/绘制,那就太好了

现在,我使用jython脚本通过wsadmin监控了几个点:

  • Java堆
  • 向所有数据源发出“测试连接”
但是,我无法找到监视JDBC连接池的方法,无法检查PoolSize、WaitingThreadCount和FreePoolSize值。我可以使用WAS DMGR中包含的Tivoli Performance Viewer实时监控它们:

但我没有找到通过wsadmin(或任何其他方式)获得它的方法,因此我可以获得值并添加到Cacti/RRD中,以获得与Jboss类似的图形:

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

如果您确实坚持
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。最后一个特别有趣,因为它是一种不用太多脚本就可以监视事情的简单方法:)