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 數據)

wKiom1aXNeaTgCcjAABoTJSVMXI565.png

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


收集屬性中的多值(收集 JVM Memory 的 HeapMemoryUsage 中的used 數據)

wKioL1aXN07AOiHBAAChS6HPM40421.png

使用關鍵字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 這樣的開源畫圖工具去展示的吧。


暫時寫這麼多,也是初步的去了解。期望共同學習進步。多謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章