新聞中心
單進(jìn)程示例
單進(jìn)程的鏈路跟蹤即進(jìn)程內(nèi)方法之間的調(diào)用鏈關(guān)系。這種場(chǎng)景的跟蹤沒(méi)有涉及到分布式跟蹤,比較簡(jiǎn)單,以該示例作為我們?nèi)腴T(mén)的一個(gè)例子吧。示例代碼地址:https://github.com/GOgf/gf/tree/master/example/trace/inprocess

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的瑞麗網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
Root Span
?root span?即鏈路中第一個(gè)?span?對(duì)象。在這里的單進(jìn)程場(chǎng)景中,往往需要手動(dòng)創(chuàng)建一個(gè)。隨后在方法內(nèi)部創(chuàng)建的?span?都會(huì)作為它的子級(jí)?span?。
在分布式架構(gòu)的服務(wù)間通信場(chǎng)景中,往往不需要開(kāi)發(fā)者手動(dòng)創(chuàng)建?root span?,而是由客戶端/服務(wù)端請(qǐng)求的攔截器來(lái)自動(dòng)創(chuàng)建。
創(chuàng)建?tracer?,生成?root span?:
func main() {
var ctx = gctx.New()
tp, err := jaeger.Init(ServiceName, JaegerUdpEndpoint)
if err != nil {
g.Log().Fatal(ctx, err)
}
defer tp.Shutdown(ctx)
ctx, span := gtrace.NewSpan(ctx, "main")
defer span.End()
// Trace 1.
user1 := GetUser(ctx, 1)
g.Dump(user1)
// Trace 2.
user100 := GetUser(ctx, 100)
g.Dump(user100)
}上述代碼創(chuàng)建了一個(gè)?root span?,并將該?span?通過(guò)?context?傳遞給?GetUser?方法,以便在?GetUser?方法中將追蹤鏈繼續(xù)延續(xù)下去。
方法間Span創(chuàng)建
// GetUser retrieves and returns hard coded user data for demonstration.
func GetUser(ctx context.Context, id int) g.Map {
ctx, span := gtrace.NewSpan(ctx, "GetUser")
defer span.End()
m := g.Map{}
gutil.MapMerge(
m,
GetInfo(ctx, id),
GetDetail(ctx, id),
GetScores(ctx, id),
)
return m
}
// GetInfo retrieves and returns hard coded user info for demonstration.
func GetInfo(ctx context.Context, id int) g.Map {
ctx, span := gtrace.NewSpan(ctx, "GetInfo")
defer span.End()
if id == 100 {
return g.Map{
"id": 100,
"name": "john",
"gender": 1,
}
}
return nil
}
// GetDetail retrieves and returns hard coded user detail for demonstration.
func GetDetail(ctx context.Context, id int) g.Map {
ctx, span := gtrace.NewSpan(ctx, "GetDetail")
defer span.End()
if id == 100 {
return g.Map{
"site": "https://GoFrame.org",
"email": "john@goframe.org",
}
}
return nil
}
// GetScores retrieves and returns hard coded user scores for demonstration.
func GetScores(ctx context.Context, id int) g.Map {
ctx, span := gtrace.NewSpan(ctx, "GetScores")
defer span.End()
if id == 100 {
return g.Map{
"math": 100,
"english": 60,
"chinese": 50,
}
}
return nil
}該示例代碼展示了多層級(jí)方法間的鏈路信息傳遞,即是把?ctx?上下文變量作為第一個(gè)方法參數(shù)傳遞即可。在方法內(nèi)部,我們通過(guò)的固定語(yǔ)法來(lái)創(chuàng)建/開(kāi)始一個(gè)?Span?:
ctx, span := gtrace.NewSpan(ctx, "xxx")
defer span.End()并通過(guò)?defer?的方式調(diào)用?span.End?來(lái)結(jié)束一個(gè)?Span?,這樣可以很好地記錄?Span?生命周期(開(kāi)始和結(jié)束)信息,這些信息都將會(huì)展示到鏈路跟蹤系統(tǒng)中。其中?gtrace.NewSpan?方法的第二個(gè)參數(shù)?spanName?我們直接給定方法的名稱即可,這樣在鏈路展示中比較有識(shí)別性。
效果查看
執(zhí)行完上面的程序后,終端輸出:
打開(kāi)?Jaeger UI?: http://localhost:16686/search,可以看到鏈路追蹤的結(jié)果:
點(diǎn)擊詳情可以查看具體信息,包括?span?的調(diào)用順序、調(diào)用關(guān)系,執(zhí)行時(shí)間軸,以及記錄一些?Attributes?和?Events?信息,極大的方便我們定位系統(tǒng)中的異常和發(fā)現(xiàn)性能瓶頸:
其中的?tracing-inprocess?是我們?tracer?的名稱,該名稱往往是服務(wù)名稱,由于我們這里只有一個(gè)進(jìn)程和一個(gè)?tracer?,因此這里只看得到一個(gè)服務(wù)名稱。其中的?main?為我們創(chuàng)建的?root span?名稱,其他的?span?為基于該?root span?創(chuàng)建的子級(jí)?span?。由于我們?cè)诔绦蛑姓{(diào)用了兩次?GetUser?方法,因此這里也展示了兩次?GetUser?方法的調(diào)用。每一次?GetUser?調(diào)用的內(nèi)部又分別去調(diào)用了?GetIndo?、?GetDetail?、?GetScores?三個(gè)方法,方法間的調(diào)用層級(jí)關(guān)系展示得非常清晰明了,并且每個(gè)方法的調(diào)用時(shí)長(zhǎng)都可以看得到。
關(guān)于其中每個(gè)?span?記錄的?Tags?和?Process?信息其實(shí)對(duì)應(yīng)了?OpenTelemetry?中的?Attributes?和?Events?信息,這些信息我們放到后續(xù)章節(jié)去詳細(xì)介紹。
文章題目:創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈路跟蹤-基本示例
當(dāng)前URL:http://www.5511xx.com/article/dphipgp.html


咨詢
建站咨詢
