JMX

JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展。这种机制可以方便的管理、监控正在运行中的Java程序。常用于管理线程,内存,日志Level,服务重启,系统环境等

基本术语

  • MBean:

    是Managed Bean的简称,可以翻译为“管理构件”。在JMX中MBean代表一个被管理的资源实例,通过MBean中暴露的方法和属性,外界可以获取被管理的资源的状态和操纵MBean的行为。事实上,MBean就是一个Java Object,同JavaBean模型一样,外界使用自醒和反射来获取Object的值和调用Object的方法,只是MBean更为复杂和高级一些。MBean通过公共方法以及遵从特定的设计模式封装了属性和操作,以便暴露给管理应用程序。例如,一个只读属性在管理构件中只有Get方法,既有Get又有Set方法表示是一个可读写的属性。一共有四种类型的MBean:

    • Standard MBean,
    • Dynamic MBean,
    • Open MBean,
    • Model MBean。
  • MBeanServer:

    MBean生存在一个MBeanServer中。MBeanServer管理这些MBean,并且代理外界对它们的访问。并且MBeanServer提供了一种注册机制,是的外界可以通过名字来得到相应的MBean实例。

  • JMX Agent:

    Agent只是一个Java进程,它包括这个MBeanServer和一系列附加的- - - MbeanService。当然这些Service也是通过MBean的形式来发布。

  • Protocol Adapters and Connectors:

    MBeanServer依赖于Protocol Adapters和Connectors来和运行该代理的Java虚拟机之外的管理应用程序进行通信。Protocol Adapters通过特定的协议提供了一张注册在MBeanServer的MBean的视图。例如,一个HTML Adapter可以将所有注册过的MBean显示在Web 页面上。不同的协议,提供不同的视图。Connectors还必须提供管理应用一方的接口以使代理和管理应用程序进行通信,即针对不同的协议,Connectors必须提供同样的远程接口来封装通信过程。当远程应用程序使用这个接口时,就可以通过网络透明的和代理进行交互,而忽略协议本身。Adapters和Connectors使MBean服务器与管理应用程序能进行通信。因此,一个代理要被管理,它必须提供至少一个Protocol Adapter或者Connector。面临多种管理应用时,代理可以包含各种不同的Protocol Adapters和Connectors。当前已经实现和将要实现的Protocol Adapters和Connectors包括: RMI Connector, SNMP Adapter, IIOP Adapter, HTML Adapter, HTTP Connector.

Adapter 和Connector的区别在于:Adapter是使用某种Internet协议来与JMX Agent获得联系,Agent端会有一个对象 (Adapter)来处理有关协议的细节。比如SNMP Adapter和HTTP Adapter。而Connector则是使用类似RPC的方式来访问Agent,在Agent端和客户端都必须有这样一个对象来处理相应的请求与应答。比如RMI Connector。

Spring JMX

为了将一个POJO变为MBean,一个做法是定义一个XXXXMBean为名的接口,然后实现它。

而Spring提供了一种更简单的方法,Annotation注释即可,既可以将POJO变为MBean,还可以为属性,方法及其参数都加上描述,为JConsole进行操作时提供更好的帮助信息。

  • @ManagedResource 在类上使用,把类标记为MBean。
  • @ManagedOperation 在可操作的方法加使用。
  • @ManagedAttribute 在字段上使用。如果属性是可读可写的,就在getter和setter上都注释,只读的话就只在getter上注释。
package com.example.demo.jmx;

import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;
import org.springframework.stereotype.Component; import java.util.concurrent.atomic.AtomicLong;
@Component
@ManagedResource(objectName="test.jmx:name=ServerManager",
description="Server manager.")
public class Hello { private final AtomicLong alarm = new AtomicLong(0); @ManagedAttribute
public Integer getAlarm() {
return alarm.intValue();
} @ManagedOperation
public void setAlarm() {
alarm.incrementAndGet();
}
}

新建一个SpringBoot项目,添加像上面使用注解的类,启动项目后,就可以在JConsole查看MBean的情况了。

支持JMX远程连接

如果是用Jolokia将JMX Restful JSON的话,远程连接就不是必须的。如果仍然要远程连接,可以在启动JVM时加上系统参数

-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=3099

JConsole

如果JConsole与应用在同一台机器,直接选择该进程

远程进程URL可以简单的写host:portlocalhost:2099

练打字的话写完整版的service:jmx:rmi:///jndi/rmi://localhost:2099/jmxrmi

自定义MBean(非Spring方式)

  1. 新建接口
package com.example.demo.jmx;

public interface AlarmMBean {
Integer getAlarm();
void setAlarm();
}
  1. 新建实现类
package com.example.demo.jmx;
import java.util.concurrent.atomic.AtomicLong; public class Alarm implements AlarmMBean{ private final AtomicLong alarm = new AtomicLong(0); @Override
public Integer getAlarm() {
return alarm.intValue();
} @Override
public void setAlarm() {
alarm.incrementAndGet();
}
}
  1. 注册MBean

    Demo程序在main访法中调用即可
    private static void registerMBean(String module,Integer errorCode) {
try {
MBeanServer server = ManagementFactory.getPlatformMBeanServer();
ObjectName name = new ObjectName("jmxBean:name="+module+"-"+errorCode);
//create mbean and register mbean
server.registerMBean(new Alarm(), name); } catch (Exception e) {
System.out.println(e);
}
}
  1. 支持JConsole远程连接
    private static void jmxConnect() {
try {
MBeanServer server = ManagementFactory.getPlatformMBeanServer(); LocateRegistry.createRegistry(9999);
//URL路径的结尾可以随意指定,但如果需要用Jconsole来进行连接,则必须使用jmxrmi
JMXServiceURL url = new JMXServiceURL
("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");
JMXConnectorServer jcs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
System.out.println("begin rmi start");
jcs.start();
System.out.println("rmi start"); } catch (Exception e) {
System.out.println(e);
} }

这样就可以在JConsole中用localhost:9999连接。

prometheus jmx_exporter

通过HTTP公开JMX Bean以供Prometheus使用的过程

https://github.com/prometheus/jmx_exporter

配置文件config.yaml

---
lowercaseOutputLabelNames: true
lowercaseOutputName: true
#whitelistObjectNames: ["java.lang:type=OperatingSystem","jmxBean:type=custom",*]
#blacklistObjectNames: []
rules:
#在JConsole中可观察到自定义MBean:jmxBean:name=reactor-100102
- pattern: 'jmxBean<name=(\w+)-(\d+)><>(alarm):'
name: test_$1_$2
labels:
"module": "$1"
"errorCode": "$2"
type: COUNTER
attrNameSnakeCase: true

whitelistObjectNames 中配置MBean的白名单,缺省设置默认是全部公开的MBean。

()每个小括号的正则结果对应$1,$2...的变量。

更多的选项设置Github文档中有更详细描述和示例配置。

模式匹配格式 (pattern)

与模式匹配的输入格式为

domain<beanpropertyName1=beanPropertyValue1, beanpropertyName2=beanPropertyValue2, ...><key1, key2, ...>attrName: value
部分 描述
domain 定义ObjectName时,JMX对象名称中冒号之前的部分。
beanProperyName/Value Bean属性。这些是JMX对象名称中冒号后面的键/值。
key 如果遇到复合数据或表格数据,则将属性名称添加到此列表中。
attrName 属性的名称。对于表格数据,这将是列的名称
value 属性的值。

预设格式

在大多数情况下,缺省格式将以一种可以产生健全度量标准的方式转换bean。它是

domain_beanPropertyValue1_key1_key2_...keyN_attrName{beanpropertyName2="beanPropertyValue2", ...}: value

javaagent运行

要作为javaagent运行,请下载jar并运行:

java -javaagent:./jmx_prometheus_javaagent-0.12.0.jar=8081:config.yaml -jar yourJar.jar

现在可以在http://localhost:8081 上访问指标

要将Java代理绑定到特定IP,请将端口号更改为host:port。

JavaAgent.java

https://github.com/prometheus/jmx_exporter/blob/master/jmx_prometheus_javaagent/src/main/java/io/prometheus/jmx/JavaAgent.java

Prometheus和Grafana的配置这里不讲,可以找其它文章进行配置。

参考链接:

https://www.cnblogs.com/dongguacai/p/5900507.html

https://blog.csdn.net/u013256816/article/details/52800742

https://github.com/springside/springside4/wiki/Jmx

https://docs.spring.io/spring-boot/docs/2.1.9.RELEASE/reference/html/boot-features-jmx.html

https://github.com/prometheus/jmx_exporter

【JMX】jmx结合jmx_exporter实现promethues监控的更多相关文章

  1. JMX——以可视化形式管理与监控正在运行中的Java程序

    简单理解: MBean:管理的最小单元,一个MBean就是一个可以被监控的JavaBean. MBeanServer:一个池子,各个MBean都会注册到该池子中,并且该池子提供一系列的管理.监控API ...

  2. JMX - JMX定义

    JMX定义 JMX超详细解读 https://www.cnblogs.com/dongguacai/p/5900507.html 开源框架是如何通过JMX来做监控的(一) - JMX简介和Standa ...

  3. 1.promethues监控融入k8s

    文档链接地址 https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_confi ...

  4. 使用JMX Exporter监控Rainbond上的Java应用

    场景 Prometheus 社区开发了 JMX Exporter 用于导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据.当您的 Java 应用部署在Rainbond上后 可通过 ...

  5. Zabbix JMX监控之ActiveMQ

    监控原理: ActiveMQ作为依赖java环境的中间件,同样可以像tomcat一样用JMX(java扩展程序)监控.并且与tomcat不同的是,ActiveMQ自带了JMX,只需在配置文件中开启即可 ...

  6. Kafka使用jmxtrans+influxdb+grafana监控JMX指标

    最近在搞Kafka集群监控,之前也是看了网上的很多资料.之所以使用jmxtrans+influxdb+grafana是因为界面酷炫,可以定制化,缺点是不能操作Kafka集群,可能需要配合Kafka M ...

  7. 如何使用JMX监控Kafka

    使用kafka做消息队列中间件时,为了实时监控其性能时,免不了要使用jmx调取kafka broker的内部数据,不管是自己重新做一个kafka集群的监控系统,还是使用一些开源的产品,比如yahoo的 ...

  8. [编织消息框架][消息服务]jmx

    JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序.设备.系统等植入管理功能的框架,使用的是RMI技术. 比较经典的应用jdk bin目录下 jcons ...

  9. JMX与Spring

    1.什么是JMX JMX可以监控类的运行情况,可以在程序运行期查看并修改类属性的信息. 举一个应用实例:在一个系统中常常会有一些配置信息,比如服务的IP地址,端口号什么的,那么如何来写这些代码呢? 下 ...

随机推荐

  1. html2canvas 生成电子合同书

    首先给合同书父级加个ref 然后用html2canvas 插件 然后html2canvas 坑区来了,生成页面的时候,合同书是很长的.他有一部分是黑色的, 最开始从前辈们了解到是滚至顶部解决偏移.然后 ...

  2. 死磕 java线程系列之ForkJoinPool深入解析

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:本文基于ForkJoinPool分治线程池类. 简介 随着在硬件上多核处理器的发展和广泛使用,并发编程成为 ...

  3. 关于Ubuntu10.04磁盘空间不足的问题

    最近由于项目问题,需要自己写驱动,但是驱动知识太少,开始下了个内核自己玩玩,没想到的是内核下好了,Ubuntu待机后却登录不了了,重启了好几次也不行,而且颜色是蓝色,右上角还提示:Install pr ...

  4. CSPS模拟 75

    我身边 mikufun:矩阵树学学学 Lrefrain:矩阵题刷刷刷 Dybala:神仙定理康康康 skyh:讨论讨论讨论(most mei face) DeepinC:我过样例了! Mouding: ...

  5. SSM配置后可以访问静态html文件但无法访问其他后台接口的解决方案

    web.xml中的一段 <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class> ...

  6. NOIP模拟赛18 皇帝的烦恼O(∩_∩)O 二分+DP

    题目描述 经过多年的杀戮,秦皇终于统一了中国.为了抵御外来的侵略,他准备在国土边境安置n名将军.不幸的是这n名将军羽翼渐丰,开始展露他们的狼子野心了.他们拒绝述职.拒绝接受皇帝的圣旨. 秦皇已经准备好 ...

  7. linux4.1内核配置以及编译及千兆网卡dp83867网卡驱动移植

    一  内核配置编译 1首先解压内核 tar jxvf linux-at91-4.1.tar.bz2: 2下载编译链 在ubuntu命令行中输入sudo apt-get install gcc-arm- ...

  8. 一分钟带你学会利用mybatis-generator自动生成代码!

    目录 一.MyBatis Generator简介 二.使用方式 三.实战 之前的文章<SpringBoot系列-整合Mybatis(XML配置方式)>介绍了XML配置方式整合的过程,本文介 ...

  9. 区块链原理、设计与应用pdf电子版下载

    链接:https://pan.baidu.com/s/1koShkDjEYOXxLOewZJU2Rw 提取码:8ycx 内容简介  · · · · · · 本书由专业区块链开发者撰写,是区块链开发起步 ...

  10. EFCore批量操作,你真的清楚吗

    背景 EntityFramework Core有许多新的特性,其中一个重要特性便是批量操作. 批量操作意味着不需要为每次Insert/Update/Delete操作发送单独的命令,而是在一次SQL请求 ...