Java-based server application performance monitor(APM) 建立
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