1. 程式人生 > >pinpoint Agent-TCP連線分析

pinpoint Agent-TCP連線分析

核心的程式碼入口都在DefaultAgent的構造方法中,所以從此方法入口。


主要是createTcpDataSender方法,在此方法中首先建立PinpointClientFactory。


而在createPinpointClientFactory方法中,就是建立netty的實現,註冊監聽的事件。


而在建立PinpointClientFactory的具體程式碼中,就是建立一個標準的netty例項,增加Handler

而在增加的Handler中核心的程式碼就是建立DefaultPinpointClientHandler


建立連線時,觸發channelConnected事件。在channelConnected方法中連線collector寫入資料。其中有一些定時任務,比如執行ping的等。在此方法中。建立handshakeJob和collector握手


Collector接收到資料儲存AgentLifeCycle和AgentEvent兩個表的資料,(web查詢時(拓撲結構),會從AgentLifeCycle中過濾所有狀態為Running的資料)。

TCP傳輸資料還有一部分是,這部分程式碼有意思,就是執行緒之間的呼叫,並非start,首先構建agentInfoSender,讓後啟動執行緒,呼叫Start(在defaultAgent的start方法中)


在agentInfoSender的start中有一個單執行緒定時執行sumbit函式。然後包裝AgentInfoSendRunnable,最終呼叫的是AgentInfoSendRunnable的run方法(只是呼叫,並沒有start執行緒),最終呼叫dataSender的request方法。


TCPDatasender中的executor也是比較有意思的一個執行緒。其初始化時在建立tcpDataSender時,而AgentInfoSendRunnable執行緒中的exector方法只是簡單的把資料加到佇列中。


具體實現可以看一下。

首先是建立一個,然後註冊監聽的事件。


其建立的程式碼如下,核心的this.createExecuteThread(executorName)就是此方法。此方法建立一個執行緒,並且啟動執行緒。而此方法的實現就是呼叫監聽事件的方法。而最終呼叫的是TCPDataSender的sendPacket方法。而引數物件就是AgentInfoSendRunnable 傳遞的兩個引數構造的RequestMarker物件,然後請求collector。


Pinpoint 
TCP 握手,第一次握手管理Agent的生命週期,寫入AgentLifeCycle表和AgentEvent表。
request請求傳送agentInfo資訊 application_REQUEST包 寫入AgentInfo表ApplicationIndex表
當呼叫具體外掛類,進行二進位制轉換時,當快取時會request到collector中。