prometheus jmx exporter原理

1、Prometheus經過JMX採集metrics有兩種方式:

一、in-process(推薦的),在進程內部讀取JMX數據,使用-javaagent的premain(),在main方法執行以前register JMX和一些默認的Explorer,並啓動一個HttpServer將從JMX收集過來的metrics轉換成Http協議,供Prometheus週期性的Pull抓取。java

二、獨立進程,經過JMX的RMI接口讀取數據並轉化成Http協議,優勢:有升級不用重啓被採集對象的進程,缺點:多維護一個進程且不能監控進程的metrics(如:內存、CPU,即in-process的默認Explorer)。bootstrap

2、javaagent(java探針:javaagent+字節碼操做框架,asm,javassist)

javaagent在java.long.instrument包中,可在java程序運行時動態修改系統中Class的類型。其中的premain方法是在java虛擬機啓動時在main()方法執行以前被調起,能夠攔截用戶類,可是有些系統類先於agent啓動會攔不到。框架

3、SystemClassLoader

java -cp **  HelloApp時的裝載順序,當執行java命令時SystemClassLoader會先進行裝載->連接->初始化而後再調用main(),由此推測premain應該是在main()的裝載類以前被調用的。spa

JVM有兩種加載器:啓動類加載器和用戶自定義加載器,啓動類加載器加載方向是從bootstramp->user-defined,用戶自定義:user-defined->bootstrap(雙親委派).net

4、premain和agentmain區別

pemain只能在類加載以前修改字節碼(類AOP的攔截),加載完成以後只能經過從新建立ClassLoader的方式從新加載。
agentmain能夠不用添加啓動參數,能夠在運行後(加載完成)修改,而且不須要從新建立加載器,很強大到用法限制比較多。htm

 

Ref:對象

https://www.jianshu.com/p/6096bfe19e41blog

https://www.jb51.net/article/91910.htm接口

相關文章
相關標籤/搜索