Java-based server application performance monitor(APM) 建立

starzodiac
4 min readMar 19, 2021

--

關鍵字: jconsole, java tool, jmx, jvm info, logstash, es, elasticsearch, apm

最近碰到一個需求,需要非常的完整地把 APM 系統建立起來,當初以為是等 user 開需求我再去兜系統就好,結果其實是要把菜都先準備好給 user 挑XD

還好之前有先 survey 過 SRE,大概知道那東西是幹嘛用的,至於細節之後會再發一篇文來介紹

不得不說 logstash 真的很狂,大部分的 input 就有涵蓋,但是獨缺 web server 或是 java,然後去 google 好像也沒有特別有用的資訊

研究了很久才發現,jconsole 是用 jmx 把 Mbean 丟出來,但是一直找不到比較方便的方法把 Mbean 的內容 dump 出來,寫一支 java 太 adhoc 了

最後才回想起 logstash 好像有支援 jmx,用了一下沒想到半小時就搞定了...

操作步驟:

1. 執行 java 時加入以下參數

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

2. 設定 logstash(為了方便,先output 到 stdout)

input {
jmx {
path => "<path_to_jmx_conf>"
polling_frequency => 5
type => "jmx"
nb_thread => 4
}
}
output {
stdout { codec => rubydebug }
}

3. 設定 jmx.conf(注意 port 要跟 jmxremote.port 相同)

{
"host" : "<IP>",
"port" : 9000,
"username" : "<account>",
"password": "<password>",
"queries" : [
{
"object_name" : "java.lang:type=Memory",
"object_alias" : "Memory"
}, {
"object_name" : "java.lang:type=Threading",
"object_alias" : "Threading"
}, {
"object_name" : "java.lang:type=Runtime",
"attributes" : [ "Uptime", "StartTime" ],
"object_alias" : "Runtime"
}]
}

4. 執行 logstash

bin/logstash -f <logstash.conf>

4-1. 如果出現 error,可以嘗試

bin/logstash-plugin install logstash-input-jmx

5. 確認結果

{
"@version" => "1",
"host" => "<IP>",
"path" => "<path>",
"metric_path" => "<IP>_<PORT>.Threading.ObjectMonitorUsageSupported_bool",
"@timestamp" => 2021-03-18T10:20:15.911Z,
"metric_value_number" => 1,
"type" => "jmx"
}

主要參考:

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jmx.html

--

--

No responses yet