俠夢說pinpoint--界面上的圖標之AgetnInfo數據研究

前言
  • 在啓動一個掛載pinpoint的springboot項目的時候,界面上顯示成了jboss的圖標,因此今天研究了一下這個數據是怎麼來的。spring

  • 咱們知道不一樣圖標和服務類型有關,服務不一樣,圖標就不一樣,這在代碼裏面使用一個ServiceType屬性來描述。springboot

file

從agent啓動開始
  • 咱們都知道pinpoint採用的是字節碼注入來實現APM監控,由Agent採集數據上報給Collector,因此咱們的研究入口是agent下面的日誌,啓動過程當中輸出以下:
Sending AgentInfo TAgentInfo....
 hostname:izwz98jc3nwxdjxg1yfd1hz, ip:172.xx.xx, ports:, 
 agentId:testboot_agentId, applicationName:testboot_45, 
 serviceType:1210, pid:28277, agentVersion:1.8.0,

 AgentInfo sent.
  • 這裏會顯示咱們配置的服務名,agentId、ip等參數。
  • agent信息由AgentInfoSendTask這個類定時生成發送。
  • 這幾個數據在代碼裏面都是經過註解來獲取的:
@AgentId String agentId, 
@ApplicationName String applicationName, 
@Container boolean isContainer, 
@AgentStartTime long agentStartTime, 
@ApplicationServerType ServiceType serverType
  • 那麼由此可知,找到注入@ApplicationServerType的地方就是真相!

file

  • 研究出依賴關係以下:

file

  • 這裏咱們只關注服務類型,讀代碼可知,啓動時會讀取agent配置,因此若是你想顯示的指定服務類型,那麼在agent的pinpoint.config中配置這個屬性便可。
// service type
        this.applicationServerType = readString("profiler.applicationservertype", null);
  • 帶着疑問繼續,那麼咱們通常也沒有配置,它是如何識別不一樣的類型的呢?
插件聲明類型
  • 上一篇文章有說過ServiceType,不一樣的插件須要聲明一個code碼來惟一標識。
  • 若是咱們沒有顯式配置profiler.applicationservertype,pinpoint會怎麼處理呢?
  • 繼續來看日誌

file

  • 沒錯,就是UNDEFINED。沒定義確定取不到值呀。app

  • 此時,pinpoint會獲取全部已經註冊的插件,調用他們的detect方法。若是校驗經過,則直接返回插件中配置的serviceType。maven

boolean detect(ConditionProvider provider);
  • 若是都找不到就會返回:STAND_ALONE
ServiceType STAND_ALONE = of(1000, "STAND_ALONE", RECORD_STATISTICS);

file

  • 那爲文章開頭的那個圖標不是springboot呢?
  • 借用下羣友圖片,咱們知道若是不配置,默認會去檢測MAIN-CLASS的值有沒有和pinpoint.config中的配置對應上。
    fileide

  • 一旦檢測到,就返回對應插件的serverType,也就是SpringBoot。this

file

  • 我這裏沒有顯示boot的緣由是,我使用maven原生的方式打包,將依賴包lib分離開了,啓動的main-class不是上述配置哪些。
  • 至於爲何顯示成了jboss,是因爲我配置了
profiler.jboss.traceEjb=false
profiler.applicationservertype=JBOSS

歡迎來公衆號【俠夢的開發筆記】 一塊兒交流進步插件

相關文章
相關標籤/搜索