基于JMX采集WebSphere 服务与指标信息

前言

最近在做was 监控,之前没有用过,方式通过JMX 方式采集。一段时间了解,was 采集分为 服务采集与指标采集,主要关注的指标采集,IBM官网上给出了一些采集伪代码,采集是服务级别,另外was 包很难找。记录一下采集实现

误区

WAS是IBM 的产品,使用的IBMJDK,安装时默认安装IBMJDK,平时基本用的都是oracle HotSpot jdk。开发时不必换成IBMJDK.

采集was 服务信息

  • 导入包

使用的was9,需要的jar 在was 安装目录下都有:%WAS_HOME%/WebSphere/AppServer/runtimes, 为了保险起见,把改目录下jar包全加到项目中。两种添加方式

  1. 自动引入,自行了解,该方式有两种引入方式
  2. 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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值