俠夢說pinpoint--左側服務地圖調用量和WasOn過濾

前言

  • 這篇文章主要是從pinpoint-web界面入手,咱們的目標是弄清楚兩個問題:node

    • 一、 pinpoint左側服務地圖上的調用量數據是怎麼查詢的?
    • 二、界面查詢條件WasOnly是什麼意思?

左側服務地圖調用量來源

從下圖能夠看出,A顯示被USER調用299次,線上數值表明着調用量。

file

咱們F12跟蹤一下接口地址:web

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則對調用者生成以下消息:api

emeroad-app (TOMCAT) -> MySQL_DB_ID (MYSQL)[10.25.141.69:3306]

而對被調用者MYSQL生成:app

MySQL (MYSQL) <- emeroad-app (TOMCAT)[localhost:8080]
hbase存儲

file

hbase存儲結構如上圖所示,由於都是二進制,因此列1,其實也是byte,而不是固定的字符名。spa

#### 何時存儲這個雙向關係?設計

  • 知道數據的底層存儲結構了,下面,咱們繼續來跟蹤,它是如何存進來的,咱們搜索一下引用,發現,有5個地方調用了這個存儲的api。
    filecode

  • 簡單明瞭,那咱們就逐個擊破把!blog

①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方法相信你們,應該會有所敏感,這應該是用來判斷過濾條件的.
file

  • 從代碼中能夠看出,這裏和Application有關,經過getServiceType
    的兩個方法來判斷是否過濾。

  • 有了這兩個方法,就好辦了,咱們直接找它的實現就好了。
    根據依賴關係,咱們定位到了ServiceTypeFactory這個工廠類、DefaultServiceType及ServiceTypeProperty,具體查找方式能夠經過觀察這幾個類瞭解,關係以下:

file

結論

  • 粗略的理解:WAS ONLY會過濾相似於數據庫、或者是位置的節點,讓界面展現清楚一些。

  • 用程序思惟理解是:它會過濾掉serviceType爲Unknown或者是Terminal的節點,具體哪些節點會有這兩個屬性呢,我想你們能夠去自行研究研究。

  • 我這裏貼一個Unknown的,這個只有一個類型。
// Callee node that agent hasn't been installed
ServiceType UNKNOWN = of(1, "UNKNOWN", RECORD_STATISTICS);
  • 研究的時候,貼的圖文太多,我整理了word,這裏就再也不多敘述了,有須要的小夥伴,能夠加我,我發給你。歡迎關注俠夢的開發筆記

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

相關文章
相關標籤/搜索