JAVA 监控内容收集之 Jmxtrans Agent

自从运维TOMCAT 服务,一直令我很困恼的事情是如何对JVM 的健康状况去监控?如何获取这些健康状况的数据?


到底如何去监控JVM 的健康状况?

我想这个最起码要对JVM有个基础的了解,知道它的内存情况、GC情况 等一些细节信息。 有了大体轮廓的了解,对JVM健康状况的监控将不会再茫然。


如何获取JVM 的健康状态数据呢? 

网络上的一些方法,基本上都需要开启一个AGENT ,通过这个AGENT 去获取数据。 但这种方式,有时候我想获取到的数据,往往不知道要怎么去表达获取。


比如使用了 cmdline-jmxclient 这个jar 工具 

java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:9999 java.lang:type=Memory NonHeapMemoryUsage

可以轻松的去获取到一些 JVM 的简单信息,但是我想获取Mbeans 中的更详细的信息,如 Tomcat 相关的一些信息,真是不知道该如何去书写、表达。

尝试了一些表达形式,根本就获取不到信息(不知道这个东西是否支持这些信息的获取)。


但当你遇到了jmxtrans 和 jmxtrans-agent 后,这种感觉突然有了改观。在这里简单的去介绍一下jmxtrans-agent 的使用,有关详细的说明,还需要大家去github上自己去啃readme。


首先列举出github的地址吧(有可能你要翻墙才能看的到)

Jmxtrans:  https://github.com/jmxtrans/jmxtrans

Jmxtrans-agent:  https://github.com/jmxtrans/jmxtrans-agent


jmxtrans-agent 是什么?

是一个替代jmxtrans 集中式JVM 收集信息的工具,它不需要任何依赖即可使用。

如何去使用 jmxtrans-agent ?

以在  Tomcat 上的使用为例子,在 setenv.sh 中加入如下:


export JAVA_OPTS="$JAVA_OPTS -javaagent:/path/to/jmxtrans-agent-1.1.0.jar=jmxtrans-agent.xml"


注:

  • javaagent 的路径可以相对于工作目录的路径

  • jmxtrans-anget.xml 配置文件的路径可以是一个http(s)的 url 或 为一个相对于classpath 的路径 或为一个具体的路径


如何去书写jmxtrans-agent 的配置文件 ?


使用attribute 和 attributes 去收集单个或者多个属性值,多个属性值以逗号分割。

若不指定这个属性,则收集这个objeName 下的所有的属性。

使用 resultAlias 去制定metric 的名称,在resultAlias 中使用关键字 #attribute#" 时, 将指定 metric 的名字为attribute 或 attributes 中使用的值


以下是摘取的官方Example:


Example - collect the ThreadCount attribute from the Threading MBean:

<query objectName="java.lang:type=Threading" attribute="ThreadCount"
   resultAlias="jvm.thread.count"/>


Example - collect ThreadCount and TotalStartedThreadCount from the Threading MBean:

<query objectName="java.lang:type=Threading" attributes="ThreadCount,TotalStartedThreadCount"
  resultAlias="jvm.threads.#attribute#"/>


Example - collect all attributes from the Threading MBean:

<query objectName="java.lang:type=Threading" resultAlias="jvm.threads.#attribute#"/>



收集属性的单值(收集JVM threading 的 ThreadCount 数据)

技术分享

<query objectName="java.lang:type=Threading" attribute="ThreadCount"
   resultAlias="jvm.thread"/>


收集属性中的多值(收集 JVM Memory 的 HeapMemoryUsage 中的used 数据)

技术分享

使用关键字key 去指定到底收集属性中的那个值。

 

 <query objectName="java.lang:type=Memory" attribute="HeapMemoryUsage" key="used" resultAlias="jvm.heapMemoryUsage.used"/>


同样可以忽略key去收集所有的值。并在resultAlias 中使用 #key# 去动态的描述metric的名称

<query objectName="java.lang:type=Memory" attribute="HeapMemoryUsage" resultAlias="jvm.heapMemoryUsage.#key#"/>



官方提供的一个简单的jmxtrans-agent.xml

<jmxtrans-agent>
    <queries>        <!-- OS -->
        <query objectName="java.lang:type=OperatingSystem" attribute="SystemLoadAverage" resultAlias="os.systemLoadAverage"/>        <!-- JVM -->
        <query objectName="java.lang:type=Memory" attribute="HeapMemoryUsage" key="used"
               resultAlias="jvm.heapMemoryUsage.used"/>
        <query objectName="java.lang:type=Memory" attribute="HeapMemoryUsage" key="committed"
               resultAlias="jvm.heapMemoryUsage.committed"/>
        <query objectName="java.lang:type=Memory" attribute="NonHeapMemoryUsage" key="used"
               resultAlias="jvm.nonHeapMemoryUsage.used"/>
        <query objectName="java.lang:type=Memory" attribute="NonHeapMemoryUsage" key="committed"
               resultAlias="jvm.nonHeapMemoryUsage.committed"/>
        <query objectName="java.lang:type=ClassLoading" attribute="LoadedClassCount" resultAlias="jvm.loadedClasses"/>

        <query objectName="java.lang:type=Threading" attribute="ThreadCount" resultAlias="jvm.thread"/>        <!-- TOMCAT -->
        <query objectName="Catalina:type=GlobalRequestProcessor,name=*" attribute="requestCount"
               resultAlias="tomcat.requestCount"/>
        <query objectName="Catalina:type=GlobalRequestProcessor,name=*" attribute="errorCount"
               resultAlias="tomcat.errorCount"/>
        <query objectName="Catalina:type=GlobalRequestProcessor,name=*" attribute="processingTime"
               resultAlias="tomcat.processingTime"/>
        <query objectName="Catalina:type=GlobalRequestProcessor,name=*" attribute="bytesSent"
               resultAlias="tomcat.bytesSent"/>
        <query objectName="Catalina:type=GlobalRequestProcessor,name=*" attribute="bytesReceived"
               resultAlias="tomcat.bytesReceived"/>        <!-- APPLICATION -->
        <query objectName="Catalina:type=Manager,context=/,host=localhost" attribute="activeSessions"
               resultAlias="application.activeSessions"/>
    </queries>
    <outputWriter class="org.jmxtrans.agent.GraphitePlainTextTcpOutputWriter">
        <host>localhost</host>
        <port>2003</port>
        <namePrefix>app_123456.servers.i876543.</namePrefix>
    </outputWriter>
    <outputWriter class="org.jmxtrans.agent.ConsoleOutputWriter"/>
    <collectIntervalInSeconds>20</collectIntervalInSeconds>
</jmxtrans-agent>


以上描述了了所有常用的数据采集方式。


既然我们采集数据有了目标,知道了该采集什么样的数据,那么如何获取结果呢?

jmxtrans-agent 支持一下几种结果的存储形式:

  • GraphitePlainTextTcpOutputWriter

  • FileOverwriterOutputWriter

  • SummarizingFileOverwriterOutputWriter

  • ConsoleOutputWriter

  • SummarizingConsoleOutputWriter

  • RollingFileOutputWriter

  • StatsDOutputWriter


假如说就是为了测试,我们可以尝试使用 ConsoleOutputWriter、FileOverwriterOutputWriter、RollingFileOutputWriter  这三种格式。

ConsoleOutputWriter : 顾名思义,应该是将结果输出到了终端上吧(这个我没有去测试)。


FileOverwriterOutputWriter、RollingFileOutputWriter : 这两种格式将结果存储到了文件中,而RollingFileOutputWriter 这个又更高级一些,支持文件的切割的一些功能。


StatsDOutputWriter、GraphitePlainTextTcpOutputWriter : 这些应该结合 StatsD  和  Graphite 这样的开源画图工具去展示的吧。


暂时写这么多,也是初步的去了解。期望共同学习进步。多谢!

本文出自 “诡迹” 博客,请务必保留此出处http://unixman.blog.51cto.com/10163040/1734975

文章来自:http://unixman.blog.51cto.com/10163040/1734975
© 2021 jiaocheng.bubufx.com  联系我们
ICP备案:鲁ICP备09046678号-3