pinpoint:源码地址:https://github.com/pinpoint-apm/pinpoint.git
定义:基于Google的Dapper理论,通过在程序内部的class的方法,构造方法等地方埋点,通过Java-agent技术实现类增强的一种链路追踪的监控(APM)工具,由韩国navercorp公司的团队开发并开源。
原理:我们先以简单的main方法打印1+2语句为例,来介绍一下pinpoint中使用的类增强方法。
public class aaa {
public static void main(String[] args) {
System.out.println(add(1,2));
}
public static int add(int a ,int b){
return a+b;
}
}
这个对于任何一位程序员或者程序初学者来说,都是再熟悉不过的一段代码。那pinpoint如果要监控这一段代码应该怎么做呢?
我们做监控的话理所当然的要很明了的知道这段代码是执行了什么方法,执行该方法花了多长时间,执行的方法的traceid(读者可自行谷歌了解一下)是什么?等等。
Java-agent的类增强技术有一个prmain方法,这个即在被增强的方法执行前先执行要增强的方法。
那我找到埋点的方法,在埋点方法前下个探针,扎他一下,在埋点前(before)记录一下时间,这段程序执行完(after)再记录一下时间,时间差就是这段程序执行了多久。在before和after上再做另外的操作,比如记录一下taceid,连接数据库的库名,程序执行时执行的语句是啥等等。
那我们在上面的例子上就可以埋点 add方法,在类增强里面做其他处理。
以pinpoint上的已有的来看一下
首先是plugin 核心的插件类:箭头所指表示埋点com.mysql.jdbc.NonRegisteringDriver,方框表示埋点的方法是:connect,椭圆的框表示connect方法里面的构造参数
再来看一下他的拦截器:DriverConnectInterceptorV2,如我上面所提的,before prepare after
这两个文件算是pinpoint的核心类文件。
当然笔者如果要开发一个新的插件的话还需要在这里占一个坑位,这里的2100就跟mysql插件对应
这个是他的agent代码,你新增一个新的插件要去pinpoint的web代码上添加上对应的代号就行了,这里的代号不能重复,是一一对应的,需要注意一下。笔者能力有限,关于pinpoint方面目前就这么多的领悟,如果有什么疑问的话可以邮件我讨论一下,我在空闲的时候会对好问题去一一回复。 本人邮箱:1262828055@qq.com