WebSphere(WAS)是一些大型企业常用的中间件,由于was自身提供的工具有时不能满足多样化的监控需求,而我们又会经常遇到对was进行监控的应用场景,所以我们有必要自己动手做一些was的监控脚本,尤其是自动化监控脚本。

目前针对WAS主要有以下这几种监控方式:

一、heapdump解析。很多人都会使用命令行生成heapdump,然后用工具对heapdump进行分析,从而得到自己想要的结果。

步骤如下:

#cd /opt/IBM/WebSphere/AppServer/bin

#./wsadmin.sh -username <was的用户名> -password <was的密码>

wasadmin>set objectName [$AdminControl queryNames WebSphere:type=JVM,process=服务名称,node=节点名称,*]

wasadmin >$AdminControl invoke $objectName generateHeapDump

这种方法需要借助第三方工具,而且这些工具大多是图形界面,所以不利于自动化监控。

二、利用PerfServlet监控

    perfServletApp项目是由WebSphere官方提供的用于简单的端对端检索性能数据的应用。通过servlet访问,返回XML 格式的信息,然后解析XML即可获得相应的监控数据。

    这个方法的优点是可以使用现有代码,减少工作量,由于是官方内置应用包,可以支持不同的版本,但缺点也有很多。首先,它能监控到的数据比较有限,不能满足各种多样化需求,其次,如果was设置了访问权限,无论通过java程序访问还是页面访问,都需要先进行鉴权,鉴权的过程很复杂。

    这个包内置在安装包里,所以不需要从其他渠道找这个应用包(默认情况下位于<WebSphere Installed Location>/WebSphere/AppServer/installableApps)。安装PerfServlet的过程和安装其他was应用的步骤一样,安装完毕后启动即可。

安装后,在浏览器中打开http:// <ip>:<port>/wasPerfTool/servlet/perfservlet链接,可以看到返回的XML文件第一行内容如下:<PerformanceMonitorresponseStatus=” success”version=”7.0.0.5″>,这说明perfServletApp安装成功了。

如果是WAS6.1或以上版本,打开http://<ip>:<port>/wasPerfTool/servlet/perfservlet 

返回XML格式的错误信息:<PerformanceMonitorresponseStatus=”failed“version=” 6.1.0.0 “>,并且后面带有“由于凭证不足或凭证为空”之类的错误提示,说明我们需要进行权限设置。

  1. 在安全性->安全管理、应用程序和基础结构->配置里勾选启用应用程序安全性
  2. 在应用程序->企业应用程序里找到perfservlet, 在安全信息属性里找到安全角色到用户/组映射,进入该功能的连接页面以后查找到监控用户并勾选该用户,在用户设置页面设置用户组认证,最后勾选所有已认证的用户并保存
  3. 重启was

tips:已经安装PerfServlet插件的,可以直接访问内置页面来获取帮助。

未进行权限配置的访问页面:http:// <ip>:<port>/wasPerfTool/servlet/

已进行权限配置的访问页面:https://<ip>:<port>/wasPerfTool/servlet?&username=<username>&password=<password>

查看具体监控信息时构造URL:http:// <ip>:<port>/wasPerfTool/servlet[?node=<node>&server=<server>&module=<module>&version=5]

 注意:加上&version=5 则返回的格式是5.x,如果不加,则返回的格式是6.0.

module的值可以从官网获取,比如获取jvm数据时,module参数值就是jvmRuntimeModule

java代码进行鉴权的代码参考样例如下:

URL url = new URL("http://localhost:<port>/manager/jmxproxy?qry=*%3Atype%3DManager%2C*");
URLConnection conn = (URLConnection) url.openConnection();
// URL授权访问 -- Begin
String password = "<user>:<password>"; // manager角色的用户和密码
String encodedPassword = new BASE64Encoder().encode(password.getBytes());
conn.setRequestProperty("Authorization", "Basic " + encodedPassword);
// URL授权访问 -- End
InputStream is = conn.getInputStream();
BufferedReader bufreader = new BufferedReader(new InputStreamReader(is));
String line = null;
while ((line = bufreader.readLine()) != null) {
       System.out.println(line);
}

三、使用JMX 接口开发监控程序

JMX接口监控的方法核心是通过引入PerfMBean等MBean元素,调用AdminClient API获取性能监控基础结构(PMI)数据。

该方法的优点是可以获取到所有数据,缺点是需要编写大量java代码,而且编写代码时需要依赖官方提供的jar包,不同WAS版本的jar包有差异,可调用方法也不同,这些问题会导致代码的兼容性不佳。

例如以下JAR包:

   com.ibm.ws.admin.client_7.0.0.jar

   ibmjgssprovider.jar

   ibmkeycert.jar

感兴趣的朋友可以在不同版本的was环境里找到这些jar包比较一下差异。

         和perfServlet监控类似,启用管理安全性以后,was的鉴权验证机制会使监控难度上升好几个等级。

1 .不启用管理安全性时的MBean连接代码

Properties adminProps = new Properties();  
adminProps.setProperty("type", "soap");  
adminProps.setProperty("host", "127.0.0.1");  
adminProps.setProperty("port", "8880");  #端口需要根据实际情况调整
AdminClient adminClient = AdminClientFactory.createAdminClient(adminProps);  
String domainName = adminClient.getDomainName();  

2.启用管理安全性以后

         连接MBean之前,我们需要先配置证书。在WAS6.0里面,官方提供的默认证书能直接用,但是WAS6.1以上不行,必须生成自己的证书并配置到环境里面。

 证书生成方法:

1、生成服务器端证书: keytool -genkey -alias s1as -keyalg RSA -keystore tomcat-server.jks -storepass changeit -keypass changeit -dname “CN=<要导入证书的机器名>, OU=Research Department, O=Shanghai Ideal Ltd., L=xuhui, S=Shanghai, C=CN” -storepass changeit -keystore keystore.jks

2、服务器端证书导出(给客户端使用)

keytool -export -alias s1as -storepass changeit -file server.cer -keystore keystore.jks

3、服务器端证书导入cacerts

keytool -import -v -trustcacerts -alias s1as -file server.cer -keystore cacerts.jks -keypass changeit

4、服务器端证书导入客户端JDK

keytool -import -file server.cer -keystore was_home$/java/jre/lib/security/cacerts -file server.cer -alias s1as

导入信任文件的路径必须在webshpere自带的jdk的jre目录下,如websphere6.1的安装路径的IBM\WebSphere\AppServer\java\jre\lib\security目录下。生产证书和密钥的过程可以在其它的jdk下。

5、复制证书到was服务器目录

cacerts.jks、keystore.jks 拷贝到下列路径:IBM\WebSphere\AppServer\profiles\AppSrv01\config\cells\<cellname>\nodes\<nodename>

keystore可以看成一个放key的库,key就是公钥,私钥,数字签名等组成的一个信息。

truststore可以理解为放信任的证书的一个store.比如cacerts.jks文件,就可以理解为存放的store

truststore里存放的是只包含公钥的数字证书,代表了可以信任的证书,而keystore是包含私钥的

监控参考代码如下:

Properties adminProps = new Properties();
adminProps.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
adminProps.setProperty(AdminClient.CONNECTOR_HOST, "<hostname>");
adminProps.setProperty(AdminClient.CONNECTOR_PORT, "<port>");
adminProps.setProperty(AdminClient.USERNAME, "<username>");
adminProps.setProperty(AdminClient.PASSWORD, "<password>");
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","<cacerts.jks的绝对路径>");
adminProps.setProperty("javax.net.ssl.keyStore","<keystore.jks的绝对路径>");
adminProps.setProperty("javax.net.ssl.trustStorePassword","<cacerts.jks 生成时输入的密码>");
adminProps.setProperty("javax.net.ssl.keyStorePassword", "<keystore.jks 生成时输入的密码>");
AdminClient adminClient = AdminClientFactory.createAdminClient(adminProps);
// 这里只是最简单了获取了domainName
String domainName = adminClient.getDomainName();

附上一些参考资料:

1、目前最新版本的adminclient接口参考地址(也可以搜索关键词APIs – Application Programming Interfaces):https://www.ibm.com/support/knowledgecenter/SS7K4U_9.0.0/com.ibm.websphere.javadoc.doc/web/apidocs/overview-summary.html

2、很有用的jython脚本参考资料(也可以搜索Jython script library: Application administration scripts)https://www.ibm.com/support/knowledgecenter/SS7K4U_9.0.0/com.ibm.websphere.zseries.doc/ae/rxml_7libutility.html?pos=3

顺便吐槽下IBM的文档检索系统,哪怕是文档里出现的字词,你检索时也未必搜得到,能搜到啥全看运气了

 

下篇将讲述以下两块内容:

四、使用TPV命令行监控

五、使用PMI命令行监控

重点讲述jython脚本的编写以及原生命令行的使用,欢迎各位关注

 

版权声明:本文为slqt原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/slqt/p/9105839.html