JMX让程序有被管理的功能,它的应用场景非常多。总的来说只要是运行在java虚拟机上的应用,例如tomcat、 jboss 、web app等都可以通过jmx方式来进行数据监控或者在程序运行的状态下对程序进行“操作”,在不需要太多的工作和努力情况下让开发或者运维人员对程序的运行及其所处理的数据的性质获得深入了解。
JMX介绍:
Jmx(Java Management Extensions)java管理拓展
JMX特点:
JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
总的来说:JMX 既是 Java 管理系统的一个标准,一个规范,也是一个接口,一个框架。
JMX的体系层次结构:
- 分布层:是JMX架构对外一层,分布层负责使用JMX代理对外部世界可用。有两种类型的分布式交互。第一种类型是由适配器来实现,它通过HTTP或SNMP一类的协议提供了MBean的可见性。第二种类型是连接器,它将代理的API暴露给其它分布式技术,如Java RMI。(管理访问框架接口)
- 代理层:代理层主要组件是MBean服务器,MBean服务器提供MBean的注册使用,它是JMX代理的核心。(访问资源接口)
- 指令层:指令层是接近管理资源的一层,它由代理中注册的MBean构成MBean使得资源可以通过代理来被管理。(处理资源)
在java中通过以上三层的处理将jvm的resource获取到。在java se中提供了jmx在jdk的一个应用包:java.lang.management 、javax.management
Kafka:
Kafka是由LinkedIn开发的一个分布式的消息系统。因其水平扩展能力及高吞吐率的优点被选作为BSA平台的消息系统。它是BSA平台的数据入口,对其关键参数的监控有助于平台使用者对整个平台的运行情况的把握。
Kafka的官方文档对kafka的监控指标有了讲解(http://kafka.apache.org/documentation.html 6.6节),该文档中也讲述了kafka是通过JAVA Metrics进行内部状态的监控,并且通过jmx对metric进行report。
监控设计:
- 第一步:启动jmx端口
启动jmx端口有两种方式:
方式一:在运行启动命令前 加上系统预留的JMX_PORT
JMX_PORT=9999 nohup bin/kafka-server-start.sh config/server.properties &
方式二:修改kafka-server-start.sh 加入以下代码
If [ “x$JMX_PORT” = “x”]; then Export JMX_PORT = “9999” Fi
- 第二步:通过jmx的9999端口访问观察MBean及metric数据
打开JConsole,
输入,service:jmx:rmi:///jndi/rmi://10.67.1.105:9999/jmxrmi
通过jconsole来观看其metrics信息
Jconsole只能初浅的查看一些metrics信息,还不能达到监控的级别。
步骤三:通过定时job来获取metrics数据并且传到管理节点存储,组织数据进行展示。
数据获取的关键代码如下:
定义连接信息:(分布层)
jmxServiceURL = new JMXServiceURL(jmxServiceUrl);
1.String jmxServiceUrl = "service:jmx:rmi:///jndi/rmi://" + ip + ":" + port + "/jmxrmi";
获取接口层:(代理层)
mBeanServerConnection = jmxConnector.getMBeanServerConnection(); 1.jmxConnector = JMXConnectorFactory.connect(jmxServiceURL);
处理层:(指令层)
tmpSet = mBeanServerConnection.queryMBeans(objectName, null);kafka通过jmx report获取的metrics有: sampleAttrValue=mBeanServerConnection.getAttribute(sampleMBeanName, "Count").toString(); objectName = new ObjectName(KafkaMertic.Kafka.MESSAGECOUNT); kafka.server (MBean Name) BrokerTopicMetrics (Type) AllTopicsMessagesInPerSec,所有topic每秒messages数 AllTopicsBytesInPerSec,所有topic每秒in的字节数 AllTopicsBytesOutPerSe,out的字节数,没有out的message数,为啥?呵呵 ReplicaManager UnderReplicatedPartitions,即有几个partition实际replica数是小于设置数的(|ISR| < |all replicas|) PartitionCount, partition的个数 kafka.network RequestMetrics {Produce|Fetch-consumer|Fetch-follower}-RequestsPerSec, 每秒producer或consumer请求次数,follower指replica broker {Produce|Fetch-Consumer|Fetch-Follower}-TotalTimeMs,Request total time {Produce|Fetch-Consumer|Fetch-Follower}-QueueTimeMs,Time the request waiting in the request queue {Produce|Fetch-Consumer|Fetch-Follower}-LocalTimeMs,Time the request being processed at the leader {Produce|Fetch-Consumer|Fetch-Follower}-RemoteTimeMs,Time the request waits for the follower {Produce|Fetch-Consumer|Fetch-Follower}-ResponseSendTimeMs,Time to send the response
步骤四:数据整理,拼接前端需要的json
步骤五:监控数据展示效果
结束:
JMX让程序有被管理的功能,它的应用场景非常多。总的来说只要是运行在java虚拟机上的应用,例如tomcat、 jboss 、web app等都可以通过jmx方式来进行数据监控或者在程序运行的状态下对程序进行“操作”,在不需要太多的工作和努力情况下让开发或者运维人员对程序的运行及其所处理的数据的性质获得深入了解。在监控层面上来讲,现在大多数的应用都支持jmx,其开发的端口可为我们运维监控提供了简单,可靠的数据接口。
如果您需要了解更多内容,可以
加入QQ群:570982169、486207500
直接询问:010-68438880-8669