前言:做了一个监控应用服务器的项目(支持Tocmat、WebSphere、WebLogic各版本), 过程也算是磕磕绊绊,由于网上缺少相关资料,或者深陷于知识的海洋难以寻觅到有效的资料,因而走过不少弯路,遇过不少困难。为了留下点印记,给后来人留下 点经验之谈,助之少走弯路,故将这些经验整理出来,与大家分享。水平有限,难免疏漏,还望指正。如有疑问,欢迎留言,或者加入Q群参与讨论:35526521。
对监控WebSphere的前期方案调研,共有两种方案:
方案一、通过perfServletApp进行监控
perfServletApp项目是由WebSphere提供的(在安装目录下可以找到PerfServletApp.ear,默认没有部署),用于简单的端对端检索性能数据,IBM 或第三方供应商提供的任何工具都可以处理此性能数据。通过servlet访问,返回XML格式的信息。
方案二、使用JMX接口开发监控程序
通过使用 PerfMBean 或个别MBean,您可使用AdminClient API 获取性能监控基础结构(PMI)数据。
两种方案比较如下:
通过perfServletApp进行监控
◆ 可以使用现有的成熟代码,减少工作量
◆ 支持各不同版本时无差别,不需要更多代码
◆ 可能存在特殊需求而perfServlet不能满足的情况
使用JMX接口开发监控程序
◆ 全部代码需要从零开始
◆ 支持各不同版本比较麻烦,每个版本用的JAR包不一样,实现机制也不一样
◆ 可支配性强,可以访问到WAS提供的所有MBean
方案一、通过perfServletApp进行监控
perfServletApp项目是由WebSphere提供的(在安装目录下可以找到PerfServletApp.ear,默认没有部署),用于简单的端对端检索性能数据,IBM 或第三方供应商提供的任何工具都可以处理此性能数据。通过servlet访问,返回XML格式的信息。
安装perfServletApp
◆ 安装 perfServletApp.ear
在管理控制台,点击左侧树中的应用程序节点。点击企业应用程序。
右侧的表中将列出已安装的所有应用程序。检查 perfServletApp 是否存在。如果不存在,则点击安装以安装 perfServletApp.ear 文件(默认情况下该文件位于 <WebSphere Installed Location>/WebSphere/AppServer/installableApps 目录下,例如:D:/Program Files/WebSphere/AppServer/installableApps/perfServletApp.ear)。然后启动这个应用程序。
◆ 在浏览器中查看
打开http://127.0.0.1:9080/wasPerfTool/servlet/perfservlet 链接,可以看到返回的XML文件,第一行是这样的格式:<PerformanceMonitor responseStatus="success" version="7.0.0.5">,这说明perfServletApp安装成功了。
配置perfServletApp
如果是WAS6.1,打开http://127.0.0.1:9080/wasPerfTool/servlet/perfservlet 会返回XML格式的错误信息,第一行是这样的格式:<PerformanceMonitor responseStatus="failed" version="6.1.0.0">,并且后面会带有“由于凭证不足或凭证为空”之类的错误提示。
这时需要进行一些配置:
1、启用应用程序安全性
2、在perfServletApp下进行安全用户的配置
3、保存修改后重启WAS即可
通过perfServletApp进行监控
查看帮助文档:
http://127.0.0.1:9080/wasPerfTool/servlet/
URL格式:
http://perfServlet_Host:port/wasPerfTool/servlet/perfservlet[?node=<node>&server=<server>&module=<module>&version=5]
在浏览器地址栏中输入此URL,转向本地址后提示输入用户名密码,然后就可以看到返回的XML格式的信息。
加上&version=5则返回的格式是5.x,如果不加,则是6.0格式。
例子:获取JVM运行时性能数据
URL为:
返回XML格式的JVM运行时性能数据:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE PerformanceMonitor (View Source for full doctype...)><PerformanceMonitor responseStatus="success" version="7.0.0.5"><Node name="IE361-PCNode01"><Server name="server1"><Stat name="JVM 运行时"> <BoundedRangeStatisticID="1" highWaterMark="91147" integral="0.0" lastSampleTime="1294795486836" lowWaterMark="51200" lowerBound="51200" mean="0.0" name="HeapSize" startTime="1294794248020" unit="千字节" upperBound="262144" value="91147" /> <CountStatisticID="3" count="57698" lastSampleTime="1294795830112" name="UsedMemory" startTime="1294794248020" unit="千字节" /> <CountStatisticID="4" count="1582" lastSampleTime="1294795830112" name="UpTime" startTime="1294794248020" unit="SECOND" /> <CountStatisticID="5" count="0" lastSampleTime="1294795830112" name="ProcessCpuUsage" startTime="1294794248020" unit="不适用" /> </Stat> </Server> </Node> </PerformanceMonitor>
方案二、使用JMX接口开发监控程序
通过使用PerfMBean 或个别MBean,您可使用AdminClient API 获取性能监控基础结构(PMI)数据
所需要的JAR包:
- com.ibm.ws.admin.client_7.0.0.jar
- ibmjgssprovider.jar
- ibmkeycert.jar
1、WebSphere不启用管理安全性
最简单的示例代码:
Properties adminProps = new Properties();
adminProps.setProperty("type", "soap");
adminProps.setProperty("host", "127.0.0.1");adminProps.setProperty("port", "8880");
AdminClient adminClient = AdminClientFactory.createAdminClient(adminProps);
注意:要使上面的代码运行正确,必须关闭WAS6.1的管理安全性。
关闭WAS6.1的管理安全性的方法
登录WebSphere的集成解决方案控制台,进入安全性 --> 全局安全性 --> 去除“启用管理安全性”的勾选 --> 点击“应用” --> 保存到主配置 --> 重启WAS
但是一般实际环境当中的WAS是不可能关闭管理安全性的,所以一般只会采取下面的情况。
2、WebSphere启用管理安全性
如果WebSphere已启用管理安全性,在WAS6.0里面,这个步骤很简单,默认的证书能直接用,但是WAS6.1就不行,默认的证书不能用,必须生成自己的证书并配置到WAS6.1里面。
WAS6.1生成和配置证书的方法
注明: 此部分转载自网上,步骤很复杂,不过以图片为主,所以只要严格按照图示步骤来,就可以配置成功。
如果启用了安全(WAS6.1默认的), 会出现下面的错误:
2009-6-4 10:25:49 com.ibm.websphere.management.AdminClientFactory
警告: ADMC0046W2009-6-4 10:25:50 com.ibm.ws.management.connector.interop.JMXClassLoader
警告: Could not find tmx4jTransform.jar in null/etc/tmx4jTransform.jar - Interoperability to older versions of WebSphere is disabled2009-6-4 10:25:50 com.ibm.ws.ssl.config.SSLConfigManager
信息: ssl.disable.url.hostname.verification.CWPKI0027Icom.ibm.websphere.management.exception.ConnectorException: ADMC0016E: 系统无法创建 SOAP 连接器以连接到端口 8880 上的主机 192.168.1.100。
如何判断安全已经启用了? 比较简单 , 如果WAS6.1 要求输入用户名和密码, 同时浏览器中查看控制台的协议是HTTPS, 那么就说明安全启用了 (默认的应该是启用的)
下面的步骤比较麻烦, 是WAS6.1特殊的. 因为需要WAS6.1的证书. 在WAS6.0里面, 这个步骤很简单, 默认的证书能直接用, 但是WAS6.1就不行, 默认的证书不能用, 必须生成自己的证书并配置到WAS6.1里面.
首先, 进入 <WAS_HOME>AppServer/bin, 运行ikeyman.bat文件, 进入证书配置工具:
点击添加:
选择类型JKS, 首先生成KeyStore. 目录设定为c:\test , 名称是store.jks
点击 OK , 之后会询问密码: 这里要输入KeyStre的密码: (密码要记住! 后面会用到)
点击OK, 返回主界面. 下面列表中很多默认的证书, 没有用, Ctrl-A 全选, 然后点击右侧的DELETE, 都删掉:
删掉后, 创建自签署证书:
在弹出的界面中, 输入必填的信息. 基本上都是证书的标识, 可以填入自己的一些信息:
点击OK. 这时KeyStore就创建完毕了. 这里需要把它导出, 稍后创建TrustStore用:
点击右下角的Extract Certificate... , 导出证书. 这里命名为cert.arm, 放到c:\test下面:
OK, 此时KeyStore就生成完毕了. 下面生成TrustStore. 再次点击New: (这次用的文件名是trust.jks , 同样放到了c:\test下面, 同样要记住TrustStore的密码)
同样, 把下面没有用的证书删掉. 然后点击 Add:
原创:本人实践过程中这一步有点问题,需要 先在下拉列表中选择“签署者证书”
在弹出的界面中选择刚刚导出的cert.arm文件:
这时会询问Label. 随便填点文本:
点击OK, TrustStore生成完毕了.
这时 , 查看c:\test 文件夹, 里面应该有三个文件 : store.jks (KeyStore), cert.arm (导出文件), trust.jks (TrustStore文件)。
下面的工作就是让WAS6.1应用这些KeyStore和TrustStore。
登录WAS6.1控制台, 点击 Security - SSL certificate and key management - Key stores and certificates 选项:
点击 new :
在界面中输入KeyStore的名称(这里用testKeyStore), Path(刚刚创建的, c:\test\store.jks), 密码 (创建的时候使用的密码, 这里用到了!!) 类型选择JKS:
一样的步骤, 加入TrustStore.jks:
这样, 自己生成的证书就导入到WAS中了. 下面要让WAS使用它. 点击证书配置项:
点击当前节点:
然后选择刚刚创建好的KeyStore和TrustStore, 然后点击"Get Certificate Alias", 获得别名.
之后, 点击OK 保存更改. 这时, WAS6.1的配置就完毕了. 重启WAS , 再重新登录控制台, 就可以在浏览器的证书信息中查看到刚才使用ikeyman生成证书时输入的一些信息了. 如果使用Firefox等浏览器, 可能还需要加入一个Exception, 因为这个证书是我们自己生成的, 不是Firefox认为"安全的"机构生成的, 所以会报告安全警告. 当Firefox询问的时候加入Exception, 忽略它就行了.
下面就是Java程序了. 把test文件夹拷贝到Java程序运行的机器上, 这里有两种方法.
第一种, 修改程序:
在创建adminClient前面加入下面的代码, 定义Keystore 和 TrustStore. 注意程序里面用到了上面生成KeyStore/TrustStore的口令!
adminProps.setProperty(AdminClient.USERNAME, "websphere"); adminProps.setProperty(AdminClient.PASSWORD, "websphere"); adminProps.setProperty(AdminClient.CONNECTOR_SECURITY_ENABLED, "true"); adminProps.setProperty("javax.net.ssl.trustStore", "c:/test/trust.jks"); adminProps.setProperty("javax.net.ssl.keyStore", "c:/test/store.jks"); adminProps.setProperty("javax.net.ssl.trustStorePassword", "password for keystore"); adminProps.setProperty("javax.net.ssl.keyStorePassword", "password for truststore");
然后在文档(1) 中的程序就能正常运行了.
第二种, 导入生成的KeyStore.jks 到 Java程序运行的JRE中 , 就不用运行的时候指定了: 目标密匙口令, 即JDK/JRE中默认的, 如果没改过就是changeit; 源密匙口令即上面生成KeyStore的口令 (又一次用到了)
之后, 上面代码里面的青色的部分就可以忽略了. 注意运行Java程序的JRE/JDK, 应该指定为上面命令行导入目标的JDK/JRE, 即 -destkeystore 中的参数.
使用证书监控WebSphere示例代码
Properties adminProps = new Properties(); adminProps.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP); adminProps.setProperty(AdminClient.CONNECTOR_HOST, "localhost"); adminProps.setProperty(AdminClient.CONNECTOR_PORT, "8880"); adminProps.setProperty(AdminClient.USERNAME, "chenfeng"); adminProps.setProperty(AdminClient.PASSWORD, "chenfeng"); adminProps.setProperty(AdminClient.CACHE_DISABLED, "false"); // WebSphere服务器是否已启用管理安全性 adminProps.setProperty(AdminClient.CONNECTOR_SECURITY_ENABLED, "true"); adminProps.setProperty(AdminClient.CONNECTOR_AUTO_ACCEPT_SIGNER, "true"); adminProps.setProperty("javax.net.ssl.trustStore","D:/JavaTools/IBM/MyKey/trust.jks"); adminProps.setProperty("javax.net.ssl.keyStore","D:/JavaTools/IBM/MyKey/store.jks"); adminProps.setProperty("javax.net.ssl.trustStorePassword","chenfeng222"); adminProps.setProperty("javax.net.ssl.keyStorePassword", "chenfeng111"); AdminClient adminClient = AdminClientFactory.createAdminClient(adminProps);
// 这里只是最简单了获取了domainName String domainName = adminClient.getDomainName();
说明: 本文为原创,原发表在ITEye,详见本人专栏: 监控应用服务器