go zero 是如何追蹤你的請求鏈路的

2021-10-10 05:23:55 字數 3435 閱讀 8995

追蹤的方法就是在乙個請求開始時生成乙個自己的spanid,隨著整個請求鏈路傳下去。我們則通過這個spanid檢視整個鏈路的情況和效能問題。

下面來看看go-zero的鏈路實現。

在介紹span之前,先引入context。spancontext 儲存了分布式追蹤的上下文資訊,包括 trace id,span id 以及其它需要傳遞到下游的內容。opentracing 的實現需要將 spancontext 通過某種協議 進行傳遞,以將不同程序中的 span 關聯到同乙個 trace 上。對於 http 請求來說,spancontext 一般是採用 http header 進行傳遞的。

下面是go-zero預設實現的spancontext

type spancontext struct
同時開發者也可以實現spancontext提供的介面方法,實現自己的上下文資訊傳遞:

type spancontext inte***ce
乙個 rest 呼叫或者資料庫操作等,都可以作為乙個spanspan是分布式追蹤的最小跟蹤單位,乙個 trace 由多段 span 組成。追蹤資訊包含如下資訊:

type span struct
span的定義結構來看:在微服務中, 這就是乙個完整的子呼叫過程,有呼叫開始starttime,有標記自己唯一屬性的上下文結構spancontext以及 fork 的子節點數。

go-zero中http,rpc中已經作為內建中介軟體整合。我們以 http,rpc 中,看看tracing是怎麼使用的:

// 標記為server

flag: serverflag,}}

將 header -> carrier,獲取 header 中的traceid等資訊

開啟乙個新的 span,並把「traceid,spanid」封裝在context中

從上述的 carrier「也就是header」獲取traceid,spanid。

request中產生新的ctx,並將相應的資訊封裝在 ctx 中,返回

從上述的 context,拷貝乙份到當前的request

這樣就實現了span的資訊隨著request傳遞到下游服務。

在 rpc 中存在client, server,所以從tracing上也有clienttracing, servertracingservetracing的邏輯基本與 http 的一致,來看看clienttracing是怎麼使用的?

func tracinginterceptor(ctx context.context, method string, req, reply inte***ce{},

cc *grpc.clientconn, invoker grpc.unaryinvoker, opts ...grpc.calloption) error )

// **3** 將 pair 中的data以map的形式加入 ctx

return invoker(ctx, method, req, reply, cc, opts...)

}func startclientspan(ctx context.context, servicename, operationname string) (context.context, tracespec.trace)

return ctx, emptynoopspan

}

獲取上游帶下來的 span 上下文資訊

從獲取的 span 中建立新的 ctx,span「繼承父span的traceid」

將生成 span 的data加入ctx,傳遞到下乙個中介軟體,流至下游

go-zero通過攔截請求獲取鏈路traceid,然後在中介軟體函式入口會分配乙個根span,然後在後續操作中會**出子span,每個span都有自己的具體的標識,finsh之後就會匯集在鏈路追蹤系統中。

開發者可以通過elk工具追蹤traceid,看到整個呼叫鏈。同時go-zero並沒有提供整套trace鏈路方案,開發者可以封裝go-zero已有的span結構,做自己的上報系統,接入jaeger, zipkin等鏈路追蹤工具。

go zero 是如何追蹤你的請求鏈路的

追蹤的方法就是在乙個請求開始時生成乙個自己的spanid,隨著整個請求鏈路傳下去。我們則通過這個spanid檢視整個鏈路的情況和效能問題。下面來看看go zero的鏈路實現。在介紹span之前,先引入context。spancontext 儲存了分布式追蹤的上下文資訊,包括 trace id,spa...

你是如何自學 Python 的?

知乎 這是我在過去幾家公司招聘到工程師,python入職培訓的過程。時間分為4周,全部自學,僅提供大綱。適用於web方向 1 week1 讀完 簡明python教程 適應python開發環境 2 week2 寫個爬蟲,需要深入了解re urllib2 sqlite3 threading,queue等...

你是如何自學Python的

作為一名python愛好者,我也想跟大家分享分享我自學python的一些小經驗。搬來你的小板凳,聽聽看吧。也許,你會很有收穫,也許你也走上了自學python的不歸路。開講啦 然後就是要打好基礎,要想成為一名優秀的python程式設計師,最重要的是掌握程式設計思想。有了思想,我們就可以觸類旁通。在學習...