俠夢說pinpoint--左側服務地圖呼叫量和WasOn過濾
前言
這篇文章主要是從pinpoint-web介面入手,我們的目標是弄清楚兩個問題:
- 1、 pinpoint左側服務地圖上的呼叫量資料是怎麼查詢的?
- 2、介面查詢條件WasOnly是什麼意思?
左側服務地圖呼叫量來源
從下圖可以看出,A顯示被USER呼叫299次,線上數值代表著呼叫量。
我們F12跟蹤一下介面地址:
http://webip:port/getServerMapDataV2.pinpoint?applicationName=A &from=1575337980000&to=1575338040000 &callerRange=1&calleeRange=1 &bidirectional=false&wasOnly=false &serviceTypeName=SPRING_BOOT &_=1575337947426
web上顯示的資料,都是從hbase查詢出來的,所以跟蹤後端pinpoint-web工程原始碼,我們可以定位到hbase的一張表:ApplicationMapStatisticsCallee_Ver2。
呼叫者(caller)和被呼叫者callee
rowKey生成規則
- 細節可以跟蹤原始碼瞭解
rowKey生成規則:
ApplicationMapStatisticsUtils.makeRowKey(...);
Qualify列名生成規則:
ApplicationMapStatisticsUtils.makeColumnName(...);
我們都知道,介面查詢的時候可以選擇Inboud和outboud,並且最大顯示4X4的關係圖,
所以在pinpoint設計的時候,就選擇儲存雙向關係:(目的就是構造介面左側的服務地圖)。比如:
TOMCAT ===》呼叫 MYSQL則對呼叫者生成如下訊息:
emeroad-app (TOMCAT) -> MySQL_DB_ID (MYSQL)[10.25.141.69:3306]
而對被呼叫者MYSQL生成:
MySQL (MYSQL) <- emeroad-app (TOMCAT)[localhost:8080]
hbase儲存
hbase儲存結構如上圖所示,因為都是二進位制,所以列1,其實也是byte,而不是固定的字元名。
#### 什麼時候儲存這個雙向關係?
知道資料的底層儲存結構了,下面,我們繼續來跟蹤,它是如何存進來的,我們搜尋一下引用,發現,有5個地方呼叫了這個儲存的api。
簡單明瞭,那我們就逐個擊破把!
①SpanChunkHandler中
在chunk的結構中,要求有spanEventList這個資料,(因為呼叫量 和它內部的EVENTBo 條數 是1:1),並且需要滿足isRecordStatistics記錄條件。
當滿足這兩個條件時,就會生成 A->B, B<--A, 兩個關係,使其左側服務地圖呼叫量+1。
其他位置邏輯類似,篇幅原因,這裡不再細說。② SpanHandler,112行
③ SpanHandler,117行
④ SpanHandler,127行
⑤ SpanHandler,189行
#### wasOnly的含義
- 還是通過上述的介面,我們可以跟蹤到,請求的引數,被封裝到了一個這些引數都被封裝到了SearchOption這個類。
private final int callerSearchDepth;
private final int calleeSearchDepth;
private final LinkSelectorType linkSelectorType;
private final boolean wasOnly;
怎麼去看呢?這裡提供一種思路,可能不適合所有人,大家參考一下。
從定義的變數,去理解它的含義,然後去“猜”。
callerSearchDepth: 呼叫者查詢深度。
calleeSearchDepth:被呼叫者搜尋深度。
除了wasOnly 和linkSelectorType不知道具體含義,上面兩個應該就是用來控制搜尋深度的。那我們繼續跟蹤程式碼:
這裡通過判斷是否是Was,新建了一個處理器。也就是說具體使用方法應該是在這個:
callerLinkDataMapProcessor 類中。
if (searchOption.isWasOnly()) {
callerLinkDataMapProcessor = new WasOnlyProcessor();
}
看到這個類的accept方法相信大家,應該會有所敏感,這應該是用來判斷過濾條件的.
從程式碼中可以看出,這裡和Application有關,通過getServiceType
的兩個方法來判斷是否過濾。有了這兩個方法,就好辦了,我們直接找它的實現就行了。
根據依賴關係,我們定位到了ServiceTypeFactory這個工廠類、DefaultServiceType及ServiceTypeProperty,具體查詢方式可以通過觀察這幾個類瞭解,關係如下:
結論
粗略的理解:WAS ONLY會過濾類似於資料庫、或者是位置的節點,讓介面展示清楚一些。
用程式思維理解是:它會過濾掉serviceType為Unknown或者是Terminal的節點,具體哪些節點會有這兩個屬性呢,我想大家可以去自行研究研究。
- 我這裡貼一個Unknown的,這個只有一個型別。
// Callee node that agent hasn't been installed
ServiceType UNKNOWN = of(1, "UNKNOWN", RECORD_STATISTICS);
研究的時候,貼的圖文太多,我整理了word,這裡就不再多敘述了,有需要的小夥伴,可以加我,我發給你。歡迎關注俠夢的開發筆記
歡迎來公眾號【俠夢的開發筆記】 一起交流進步