前言
最近在做was 监控,之前没有用过,方式通过JMX 方式采集。一段时间了解,was 采集分为 服务采集与指标采集,主要关注的指标采集,IBM官网上给出了一些采集伪代码,采集是服务级别,另外was 包很难找。记录一下采集实现
误区
WAS是IBM 的产品,使用的IBMJDK,安装时默认安装IBMJDK,平时基本用的都是oracle HotSpot jdk。开发时不必换成IBMJDK.
采集was 服务信息
- 导入包
使用的was9,需要的jar 在was 安装目录下都有:%WAS_HOME%/WebSphere/AppServer/runtimes, 为了保险起见,把改目录下jar包全加到项目中。两种添加方式
- 自动引入,自行了解,该方式有两种引入方式
- maven方式添加 ,参考:jar如何添加本地仓库, maven 方式jar 比较多时候,添加比较麻烦。建议使用其它方式。
我使用的自动引入,不用在pom 配置。
- 认证文件
在was 安装目录%WAS_HOME%/WebSphere/AppServer/profiles/AppSrv01/etc,找到
DummyClientTrustFile.jks、DummyClientKeyFile.jks
文件放到本地
- was服务实现
public void testGetBean() throws Exception {
try {
String connector = "soap";
String host = "127.0.0.1";
String port = "8881";
String trustStore = "F:\\was\\DummyClientTrustFile.jks";
String keyStore = "F:\\was\\DummyClientKeyFile.jks";
String trustStorePW = "WebAS";
String keyStorePW = "WebAS";
Properties props = new Properties();
props.setProperty(AdminClient.CONNECTOR_TYPE, connector);
props.setProperty(AdminClient.CONNECTOR_HOST, host);
props.setProperty(AdminClient.CONNECTOR_PORT, port);
props.setProperty(AdminClient.USERNAME, "wasusername"); //登陆was用户名密码
props.setProperty(AdminClient.PASSWORD, "was123");
props.setProperty(AdminClient.CACHE_DISABLED, "false");
props.setProperty("javax.net.ssl.trustStore", trustStore);
props.setProperty("javax.net.ssl.keyStore", keyStore);
props.setProperty("javax.net.ssl.trustStorePassword", trustStorePW);
props.setProperty("javax.net.ssl.keyStorePassword", keyStorePW);
props.setProperty(AdminClient.CONNECTOR_AUTO_ACCEPT_SIGNER, "true");
adminClient = AdminClientFactory.createAdminClient(props);
configService = new ConfigServiceProxy(adminClient);
ObjectName server = configService.resolve(null, null, "Server")[0];
ObjectName javavm = configService.resolve(null, server, "JavaVirtualMachine")[0];
System.out.println("server: " + server + "\njavavm: " + javavm);
String genericJvmArgs = configService.getAttribute(null, javavm, "genericJvmArguments").toString();
System.out.println("======" + genericJvmArgs);
} catch (Exception e) {
e.printStackTrace();
}
}
端口信息通过was客户端查看,具体位置: 服务器>服务器类型>WebSphere Application Server>应用程序服务器 > server1>端口, 里面记录了was 用到的所有的端口信息
以上就是was 采集的服务信息。
采集was指标信息
was 指标信息采集,不需要was 包,比较简单
- jmx 连接配置
登录was 客户端:服务器->服务器类型->server1->服务基础与结构->java和进程管理->进程定义->其它属性 ->java虚拟机->通用JVM参数,添加如下配置
-Djavax.management.builder.initial= -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
重启was
- 指标采集示例代码
public void testWas() {
Map<String, Object> map = new HashMap<>();
JMXConnector connector = null;
try {
String jmxURL = "service:jmx:rmi:///jndi/rmi://127.0.0.1:1099/jmxrmi";
JMXServiceURL serviceURL = new JMXServiceURL(jmxURL);
connector = JMXConnectorFactory.connect(serviceURL);
MBeanServerConnection mbsc = connector.getMBeanServerConnection();
//系统信息
ObjectName runtimeObjName = new ObjectName("java.lang:type=Runtime");
map.put("VmVendor", (String) mbsc.getAttribute(runtimeObjName, "VmVendor"));
map.put("VmName", (String) mbsc.getAttribute(runtimeObjName, "VmName"));
map.put("VmVersion", (String) mbsc.getAttribute(runtimeObjName, "VmVersion"));
Date starttime = new Date((Long) mbsc.getAttribute(runtimeObjName, "StartTime"));
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//JVM
ObjectName heapObjName = new ObjectName("java.lang:type=Memory");
MemoryUsage heapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName,
"HeapMemoryUsage"));
long maxMemory = heapMemoryUsage.getMax();//堆最大
long commitMemory = heapMemoryUsage.getCommitted();//堆当前分配
long usedMemory = heapMemoryUsage.getUsed();
map.put("maxMemory",maxMemory);
map.put("commitMemory",commitMemory);
map.put("usedMemory",usedMemory);
MemoryUsage nonheapMemoryUsage = MemoryUsage.from((CompositeDataSupport) mbsc.getAttribute(heapObjName, "NonHeapMemoryUsage"));
long noncommitMemory = nonheapMemoryUsage.getCommitted();
long nonusedMemory = heapMemoryUsage.getUsed();
map.put("noncommitMemory",noncommitMemory);
map.put("nonusedMemory",nonusedMemory);
//WebSphere
ObjectName webSphereObjName = new ObjectName("WebSphere:type=MemoryLeakConfig,name=LeakConfig");
map.put("ThreadPoolRenewalDelayFactor", mbsc.getAttribute(webSphereObjName, "ThreadPoolRenewalDelayFactor"));
map.put("LeakSweeperDelay", mbsc.getAttribute(webSphereObjName, "LeakSweeperDelay"));
map.put("JvmThreadGroupNames", mbsc.getAttribute(webSphereObjName, "JvmThreadGroupNames"));
map.put("LeakConfiguration", mbsc.getAttribute(webSphereObjName, "LeakConfiguration"));
map.put("RenewThreadPoolNames", mbsc.getAttribute(webSphereObjName, "RenewThreadPoolNames"));
//JvmCpuMonitor
ObjectName jvmCpuObjName = new ObjectName("com.ibm.lang.management:type=JvmCpuMonitor");
CompositeDataSupport dataSupport = (CompositeDataSupport) mbsc.getAttribute(jvmCpuObjName, "ThreadsCpuUsage");
if (null != dataSupport) {
Set<String> sets = dataSupport.getCompositeType().keySet();
for (String dataKey : sets) {
Object o = dataSupport.get(dataKey);
map.put(dataKey, dataSupport.get(dataKey) == null ? "" : dataSupport.get(dataKey));
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connector != null) {
try {
connector.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
System.out.println(map);
}
指标采集比较简单,单纯的jmx 采集。服务采集比较麻烦,需要jar 包和文件比较多。jmx 指标采集 key,可通过jdk 自带的jconsole
连接到was,在mBean 中查看。
总结
以上两种方式的采集,最近刚开始研究was,整理一下采集方式
参考
https://www.ibm.com/support/knowledgecenter/zh/SSEQTP_9.0.5/com.ibm.websphere.base.doc/ae/tprf_pmi.html
https://www.ibm.com/support/knowledgecenter/zh/SSYMRC_6.0.0/com.ibm.jazz.repository.web.admin.doc/topics/t_server_mon_jsr160rmi.html