pinpoint源碼學(xué)習(xí)--agent的啟動(dòng)過(guò)程

1.根據(jù)官方啟動(dòng)腳本佩脊,我們發(fā)現(xiàn)這樣一行

-javaagent:$AGENT_PATH/pinpoint-bootstrap-$VERSION.jar
-Dpinpoint.agentId=xxx
-Dpinpoint.applicationName=xxx
  • javaagent
    pinpoint基于java instrument實(shí)現(xiàn),java instrument定義:開(kāi)發(fā)者可以構(gòu)建一個(gè)獨(dú)立于應(yīng)用程序的代理程序(Agent)顶吮,用來(lái)監(jiān)測(cè)和協(xié)助運(yùn)行在 JVM 上的程序,甚至能夠替換和修改某些類(lèi)的定義粪薛。
    參考文檔:https://blog.csdn.net/GV7lZB0y87u7C/article/details/79860776
  • pinpoint-bootstrap-$VERSION.jar
    找到pinpoint-bootstrap源碼包悴了,我們找到帶有premain方法的類(lèi)PinpointBootStrap
classPathResolver.verify()

在這個(gè)方法里,可以知道加載了這四個(gè)jar

static final Pattern DEFAULT_AGENT_PATTERN = Pattern.compile("pinpoint-bootstrap" +VERSION_PATTERN + "\\.jar");
static final Pattern DEFAULT_AGENT_COMMONS_PATTERN = Pattern.compile("pinpoint-commons" + VERSION_PATTERN + "\\.jar");
static final Pattern DEFAULT_AGENT_CORE_PATTERN = Pattern.compile("pinpoint-bootstrap-core" + VERSION_PATTERN + "\\.jar");
static final Pattern DEFAULT_AGENT_CORE_OPTIONAL_PATTERN = Pattern.compile("pinpoint-bootstrap-core-optional" + VERSION_PATTERN + "\\.jar");

利用1.6之后的java新特性加載pinpoint-commons,bootstrap-core,pinpoint-bootstrap-core-optional三個(gè)jar

appendToBootstrapClassLoader(instrumentation, bootstrapJarFile);

PinpointStarter.java加載插件

// PinpointStarter的start方法加載插件的路徑
URL[] pluginJars = classPathResolver.resolvePlugins();
...
// 加載插件
TraceMetadataLoaderService typeLoaderService = new DefaultTraceMetadataLoaderService(pluginJars, loggerFactory);

通過(guò)PluginLoader加載违寿,封裝ClassLoader

public static <T> List<T> load(Class<T> serviceType, URL[] urls) {
        URLClassLoader classLoader = createPluginClassLoader(urls, ClassLoader.getSystemClassLoader());
        return load(serviceType, classLoader);
    }

這里加載的是TraceMetadataProvider.class這個(gè)接口的所有插件里面的實(shí)現(xiàn)類(lèi)并執(zhí)行setup方法
然后將setup加載的svicetype與code加載進(jìn)來(lái)并存儲(chǔ)

 ServiceTypeRegistryService serviceTypeRegistryService  = new DefaultServiceTypeRegistryService(typeLoaderService, loggerFactory);
 AnnotationKeyRegistryService annotationKeyRegistryService = new DefaultAnnotationKeyRegistryService(typeLoaderService, loggerFactory);

之后加載你的額外配置让禀,默認(rèn)加載pinpoint.config

// 加載pinpoint額外配置,先從虛擬機(jī)獲取配置文件地址陨界,沒(méi)有默認(rèn)pinpoint.config位置
String configPath = getConfigPath(classPathResolver);
...
// 日志地址存入系統(tǒng)
saveLogFilePath(classPathResolver);
// 版本存入系統(tǒng)
savePinpointVersion();
// 加載配置并賦值
ProfilerConfig profilerConfig = DefaultProfilerConfig.load(configPath);
 // 創(chuàng)建pinpoint-commons,bootstrap-core,pinpoint-bootstrap-core-optional三個(gè)jar的類(lèi)加載器
AgentClassLoader agentClassLoader = new AgentClassLoader(libUrlList.toArray(new URL[libUrlList.size()]));

創(chuàng)建pinpointAgent

// 創(chuàng)建代理選項(xiàng)
AgentOption option = createAgentOption(agentId, applicationName, profilerConfig, instrumentation, pluginJars, bootstrapJarFile, serviceTypeRegistryService, annotationKeyRegistryService);
// 獲取代理類(lèi),默認(rèn)DefaultAgent
Agent pinpointAgent = agentClassLoader.boot(option);

創(chuàng)建過(guò)程中涉及字節(jié)碼加載技術(shù)的選擇與插件的執(zhí)行

// 攔截器初始大小設(shè)置
createInterceptorRegistry(agentOption)
// 指定字節(jié)碼加載技術(shù),支持ASM與JAVASSIST
this.classPool = createInstrumentEngine(agentOption, interceptorRegistryBinder);
...
// 生成插件
final List<ProfilerPlugin> plugins = PluginLoader.load(ProfilerPlugin.class, new URL[] { jar });
// 插件setup方法執(zhí)行
PluginConfig pluginConfig = new PluginConfig(jar, plugin, agent.getInstrumentation(), agent.getClassPool(), agent.getBootstrapJarPaths(), pluginFilterChain);
final DefaultProfilerPluginContext context = setupPlugin(pluginConfig);
// 插件注入TransformTemplate
final TransformTemplate transformTemplate = new TransformTemplate(guardInstrumentContext);
((TransformTemplateAware) plugin).setTransformTemplate(transformTemplate);
// 執(zhí)行插件類(lèi)setup方法痛阻,里面組裝寫(xiě)好的Interceptor信息并放入攔截器鏈InterceptorRegistry
plugin.setup(guardPluginContext);
...

DefaultAgent的start方法處理信息的收集與發(fā)送

// 定時(shí)任務(wù)收集與發(fā)送(兩個(gè)定時(shí)任務(wù)處理)
pinpointAgent.start();

最后優(yōu)雅停機(jī)

// 優(yōu)雅停機(jī)
registerShutdownHook(pinpointAgent);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菌瘪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俏扩,老刑警劉巖糜工,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異录淡,居然都是意外死亡捌木,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)嫉戚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)刨裆,“玉大人,你說(shuō)我怎么就攤上這事彬檀》校” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵窍帝,是天一觀的道長(zhǎng)努潘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)坤学,這世上最難降的妖魔是什么疯坤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮深浮,結(jié)果婚禮上压怠,老公的妹妹穿的比我還像新娘。我一直安慰自己略号,他們只是感情好刑峡,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著玄柠,像睡著了一般突梦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上羽利,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天宫患,我揣著相機(jī)與錄音,去河邊找鬼这弧。 笑死娃闲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匾浪。 我是一名探鬼主播皇帮,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蛋辈!你這毒婦竟也來(lái)了属拾?” 一聲冷哼從身側(cè)響起将谊,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渐白,沒(méi)想到半個(gè)月后尊浓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纯衍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年栋齿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片襟诸。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瓦堵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出励堡,到底是詐尸還是另有隱情谷丸,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布应结,位于F島的核電站刨疼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鹅龄。R本人自食惡果不足惜揩慕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扮休。 院中可真熱鬧迎卤,春花似錦、人聲如沸玷坠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)八堡。三九已至樟凄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兄渺,已是汗流浹背缝龄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挂谍,地道東北人叔壤。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像口叙,于是被迫代替她去往敵國(guó)和親炼绘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345