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接口

相关文章
相关标签/搜索