1. 程式人生 > >俠夢說pinpoint--介面上的圖示之AgetnInfo資料研究

俠夢說pinpoint--介面上的圖示之AgetnInfo資料研究

前言
  • 在啟動一個掛載pinpoint的springboot專案的時候,介面上顯示成了jboss的圖示,所以今天研究了一下這個資料是怎麼來的。

  • 我們知道不同圖示和服務型別有關,服務不同,圖示就不同,這在程式碼裡面使用一個ServiceType屬性來描述。

從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的地方就是真相!

  • 研究出依賴關係如下:

  • 這裡我們只關注服務型別,讀程式碼可知,啟動時會讀取agent配置,所以如果你想顯示的指定服務型別,那麼在agent的pinpoint.config中配置這個屬性即可。
   // service type
        this.applicationServerType = readString("profiler.applicationservertype", null);
  • 帶著疑問繼續,那麼我們一般也沒有配置,它是如何識別不同的型別的呢?
外掛宣告型別
  • 上一篇文章有說過ServiceType,不同的外掛需要宣告一個code碼來唯一標識。
  • 如果我們沒有顯式配置profiler.applicationservertype,pinpoint會怎麼處理呢?
  • 繼續來看日誌

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

  • 此時,pinpoint會獲取所有已經註冊的外掛,呼叫他們的detect方法。如果校驗通過,則直接返回外掛中配置的serviceType。

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

  • 那為文章開頭的那個圖示不是springboot呢?
  • 借用下群友圖片,我們知道如果不配置,預設會去檢測MAIN-CLASS的值有沒有和pinpoint.config中的配置對應上。

  • 一旦檢測到,就返回對應外掛的serverType,也就是SpringBoot。

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

歡迎來公眾號【俠夢的開發筆記】 一起交流進步