如今不少公司都遵循一个准则,没有监控的程序不能上线,可见监控的重要性。这里先介绍下ActiveMQ都须要监控的内容。html
监控硬件物理空间是否充足:java
ActiveMQ有3个重要的参数,存储空间百分比,内存空间百分比和临时空间百分比。这三个参数的意义很明显,若是值到了100,则代表硬件空间已满,Broker不能再接受任何的消息了,除非有消息消费而且删除,Broker才能够再接收消息。linux
若是这些值长时间都比较高,接近阀值,则表示硬件的配置不能知足要求,建议更换硬件,或者给予ActiveMQ的环境配置比较小,建议给予更多的资源给ActiveMQ。shell
若是平时保持在一个稳定值,有一段时间忽然增高,则有两种可能。一种多是用户量大增(固然你们都但愿是这样),另外一种多是某个或者某几个消息消费者死机了。须要人工干预重启。数据库
还有一种多是平时保持在一个稳定值,可是一段时间内忽然下降了,则表示消息的生产者可能出现问题了。apache
监控队列:json
若是ActiveMQ使用队列,须要监控队列的未消费消息数量,消费者数量,消息入队和出队的数量。api
未消费消息数量的含义和监控硬件的内存和硬盘空间差很少,过多的消息堆积多是有消息消费者死机。浏览器
消费者数量应该是一个相对固定的值,这个值减小,就直接表示有的消费者已经死机。url
消息入队和出队数量若是增加缓慢或者不增加,则表示消息发送者已经死机。通常是经过增量监控。
监控主题:
若是ActiveMQ使用主题,须要监控的内容和队列类似,可是没有未消费的消息数量。这里指的注意的是,ActiveMQ提供Advisory Message,用于帮助使用统计一些额外信息,详细状况在后面介绍。
监控订阅者:
一样,若是ActiveMQ使用主题,订阅者的信息就十分重要。须要监控已经下线的订阅者。
介绍完须要监控的内容,下面介绍一下ActiveMQ提供的几种监控方法。
Web Console监控:
之因此先介绍这个,是由于Web Console是最简单的,不须要任何配置就能使用的监控方式。同时也是最直观的监控方式。
直接在浏览器访问http://activemq-host:8161/admin/。把localhost换成你activemq启动机器的ip,端口号默认是8161,能够在${ACTIVEMQ_HOME}/conf/jetty.xml中修改。默认的用户名和密码都是admin。
进入页面首先看到
其中下面的红色框中标示出的就是硬件物理空间。
而后点击上面红色框能够进入队列的监控页面。
能够看到上面所提到的队列的一些重要数据。点击傍边的Topics能够进入主题监控页面,大体差很少,就不截图了。
下面看一下订阅者监控界面。
须要重点关注的是中间红色框圈住的部分,是离线的订阅者。
这样的页面一目了然,很是适合人类观看。可是缺点是,不适合程序直接抓数据,写监控脚本,自动报警等。这时你必定发现了这张图右边红色框部分。分别提供了队列,主题和订阅者的xml数据,下图是队列的xml数据。
这样就便于程序去访问这些数据。可是缺点是数据不够全,且xml也不如json容易解析,用shell脚本解析的话比较麻烦。shell解析的话,命令行的方式才是最舒服的。
命令行监控:
ActiveMQ固然也提供了命令行监控的方式。执行${ACTIVEMQ_HOME}/bin/activemq,会列出命令行的使用帮助。请注意虽然Windows平台也可使用这个命令行,可是仅仅限于启动ActiveMQ实例,其余命令都不能很好的支持,因此这里所说的命令行方式,都是在Linux平台上的。
限于篇幅,这里只是截取了重要的部分。能够看到命令行提供了16个命令,包括start,stop,restart,console等启动中止实例相关的命令。还有一些控制ActiveMQ Broker的命令,如create,purge等。这里主要介绍几个监控可能用获得的命令
activemq status,显示当前的ActiveMQ是否运行正常,而且能显示pid。
activemq list,列出当前Broker名字。
activemq bstat,显示当前Broker的统计信息。
activemq query,根据筛选条件显示Broker的统计信息。如:activemq query -QQueue=string_queue,是只显示string_queue这个队列的统计信息。更多使用方法可使用activemq query --help显示帮助。
activemq browse,能够查询当前Broker为被消费的消息,会显示消息的详细信息,如消息头,消息内容,优先级等。相似于数据库的查询功能。有本身的一套查询语法可是不是很复杂,一样可使用activemq browse --help显示帮助。须要注意的是,只有Queue才能够查询,Topic是不能够的,因此这个功能虽然强大,可是有点鸡肋。
activemq dstat,比较有用的一个功能,能够用来查询队列的关键数值,如队列大小,生产者消费者数量,消息出队入队统计等。还能够支持经过类别查询,如只查询队列或者只查询主题。
我的认为,activemq status和activemq dstat是比较经常使用的两个监控命令,可使用shell,而后grep/awk解析。命令行虽然方便,可是明显缺失必要的信息,如硬件使用百分比,订阅者下线信息等。至少目前不能完成监控的所有工做,但愿之后能够持续完善功能。
JMX监控:
由Java开发的程序,通常都是支持JMX监控的,ActiveMQ也不例外。JMX监控是最全的,任何细节均可以经过JMX获取。若是远程链接JMX监控须要一些额外的配置。本机直接链接不须要,可是因为ActiveMQ是部署在linux上,因此应该不多有人会直接链接本地的JMX,除非是本地开发调试阶段。
1. 修改/etc/hosts 检查hosts文件设置,不用127.0.0.1,用实际IP地址。
2. 修改${ACTIVEMQ_HOME}/bin/active文件。找到下面几行,是连续的。应该都是注释掉的,解除注释,开启远程链接JMX,端口号默认是11099。
ACTIVEMQ_SUNJMX_START="-Dcom.sun.management.jmxremote.port=11099 " ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.password.file=${ACTIVEMQ_CONF}/jmx.password" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.access.file=${ACTIVEMQ_CONF}/jmx.access" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote.ssl=false" ACTIVEMQ_SUNJMX_START="$ACTIVEMQ_SUNJMX_START -Dcom.sun.management.jmxremote"
3. 修改JMX用户和密码文件,必须是当前用户只读,别的用户无权限。不然启动时会报异常。
chmod 400 ${ACTIVEMQ_HOME}/conf/jmx.*
其中jmx.access是用户权限配置文件,jmx.password是用户密码配置文件。
配置到此,就可使用jconsole等客户端链接了。启动jconsle,选择远程进程,填写remotehost:11099。其中remotehost是ActiveMQ所在机器的ip地址,11099是配置文件中开启的监听端口号。默认用户名是admin,密码是activemq。默认用户名和密码能够在jmx.access和jmx.password修改。链接以后以下图所示:
能够看到,从左侧树形菜单能够找到ActiveMQ的mbean,而后能够查看任何公开的JMX属性。
若是你配置完了前3步,仍然不能远程链接JMX,请继续下面的配置。
4. 查看${ACTIVEMQ_HOME}/conf/activemq.xml中的broker节点中useJmx="true"属性。这个属性能够没有或者为true,可是不能够是false。
5. 修改${ACTIVEMQ_HOME}/conf/activemq.xml中的broker节点中找到managementContext节点,修改以下:
<managementContext> <managementContext createConnector="true" connectorPort="11099" /> </managementContext>
其中connectorPort是你想发布的JMX端口号。注意端口号必须和以前${ACTIVEMQ_HOME}/bin/activemq里发布的端口号保持一致。
JMX可使用java开发程序,进行监测。可是对其余语言的支持有限。读到这里,你是否是以为,每种监控方式各有优缺点,可是很难找出一个都很完美的方式,既能够看到所有的信息,又能够轻松的用程序实现监控。若是你有这方面的需求,请你继续看下一个监控方式。
JMX REST API:
可能你还记得,以前提到的Web Console也有xml的数据展示形式,可是解析困难且数据不全。而命令行模式数据更加不全。因此,ActiveMQ提供把JMX导出为REST API。这样就最大限度的知足了各类需求,既有完整的数据,又能够方便编写程序监控。固然若是之后命令行的方式能提供更多的信息,那么这个JMX REST API就能够被替代了。可是至少如今来讲,他是不可替代的。
ActiveMQ使用一个开源的组件Jolokia来将JMX自动发布成为REST API。若是使用这个方式,你不须要配置那些上一节提到的繁琐远程JMX配置。他的原理是使用本地的JMX,而后经过HTTP发布出来,并非远程访问JMX。
在浏览器访问http://activemq-host:8161/api/jolokia/。默认的用户名和密码一样都是admin。能够看到浏览器会返回json信息来描述当前系统。
{"request":{"type":"version"},"value":{"agent":"1.2.1","protocol":"7.1","config":{"discoveryEnabled":"false","agentId":"xxx.xxx.xxx.xxx-29009-71a9b4c7-servlet","agentType":"servlet","agentDescription":"Apache ActiveMQ"},"info":{"product":"activemq","vendor":"Apache","version":"5.10.0"}},"timestamp":1405499528,"status":200}
经过Jolokia API能够访问JMX发布的任何mbean。
http://activemq-host:8161/api/jolokia/list 显示当前全部的mbean。
http://activemq-host:8161/api/jolokia/read/<mbean name >/<attribute name> 显示某个mbean的某个属性
还有不少其余的操做,如http://activemq-host:8161/api/jolokia/write/<mbean name >/<attribute name>能够动态执行方法。因为本篇文章只涉及监控,因此其余的操做先不深刻。
咱们重点关注http://activemq-host:8161/api/jolokia/read/。
先说一下Mbean名字的规则。通常的MBean名字相似于:org.apache.activemq:type=Broker,brokerName=DemoBroker
org.apache.activemq:是ActiveMQ在这个Mbean的Domain名,能够修改managementContext的jmxDomainName中配置名称。
<managementContext> <managementContext createConnector="true" connectorPort="11099" jmxDomainName="MyBroker" /> </managementContext>
type=Broker是固定的。
brokerName=DemoBroker,其中DemoBroker是在配置文件中Broker所配置的名字。
后面会有一些自定义属性。如:destinationType=Queue,destinationName=pojo_queue。
看到这里你可能会比较迷惑,下面给出例子,请慢慢体会。
http://10.2activemq-host:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=DemoBroker/TotalEnqueueCount
获取入队的消息总数,返回结果以下:
{"request":{"mbean":"org.apache.activemq:brokerName=DemoBroker,type=Broker","attribute":"TotalEnqueueCount","type":"read"},"value":5672,"timestamp":1405501289,"status":200}
关键的数据是value的值5672,表示有5672个消息入队。
若是使用shell编写监控脚本,可使用命令:
wget --user admin --password admin --auth-no-challenge http://activemq-host:8161/api/jolokia/read/org.apache.activemq:type=Broker,brokerName=localhost/TotalEnqueueCount
下面列出几个关键的监控属性。
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,service=Health/CurrentStatus
获取当前系统状态
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/MemoryPercentUsage
获取内存使用量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/StorePercentUsage
获取硬盘空间使用量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost/TempPercentUsage
获取临时文件硬盘空间使用量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/QueueSize
获取队列pojo_queue的未消费消息数量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/ProducerCount
获取队列pojo_queue的生产者数量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/ConsumerCount
获取队列pojo_queue的消费者数量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/EnqueueCount
获取队列pojo_queue的已消费消息数量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Queue,destinationName=pojo_queue/DequeueCount
获取队列pojo_queue的已接收消息数量
<base_url>/read/org.apache.activemq:type=Broker,brokerName=localhost,destinationType=Topic,destinationName=pojo_topic,endpoint=Consumer,clientId=pojo_client_1,consumerId=Durable(pojo_client_1_pojo_client_1)/Active
获取主题pojo_topic的client id为pojo_client_1的订阅者是否已经下线
Advisory Message监控:
ActiveMQ提供了一些额外的信息帮助用户获取系统状态,这些额外信息都存在主题中,以ActiveMQ.Advisory.开头。这些信息能够经过前面说的任何一种方式查询。这些消息包括Queue/Topic建立销毁的次数,消费比较慢的消费者统计等等。能够参考官方文档查询每一个Advisory Message的意义。
插件监控:
ActiveMQ还提供了一些额外的插件来监控系统,主要有可视化插件监控和统计插件监控,须要在activemq.xml中进行配置,最主要的有<connectionDotFilePlugin/>,<destinationDotFilePlugin/>和<statisticsBrokerPlugin/>。对于一些生成图标的监控系统比较有用。下面是connectionDotFilePlugin的使用截图。
第三方监控:
最后一种监控方式就是第三方提供的监控,这种监控主要包括ActiveMQ Monitor,Apache ActiveMQBrowser ,HermesJMS等。因为是第三方提供的监控平台,因此一旦activemq升级,监控平台不升级,可能会带来兼容问题,因此请谨慎使用。
另外不得不提的是hawtio,也是一个第三方提供的监控平台,提供了HTML5的绚丽界面。已经在ActiveMQ 5.9的版本中内嵌入发布包。可是因为Apache内部的意见分歧,在ActiveMQ 5.9.1的版本中又将其删除。若是想用,只能本身下载hawtio部署到ActiveMQ的环境中。