日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈路跟蹤-基本示例

單進程示例

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

創(chuàng)新互聯(lián)堅持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時代的瑞麗網(wǎng)站設(shè)計、移動媒體設(shè)計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

Root Span

?root span?即鏈路中第一個?span?對象。在這里的單進程場景中,往往需要手動創(chuàng)建一個。隨后在方法內(nèi)部創(chuàng)建的?span?都會作為它的子級?span?。

在分布式架構(gòu)的服務(wù)間通信場景中,往往不需要開發(fā)者手動創(chuàng)建?root span?,而是由客戶端/服務(wù)端請求的攔截器來自動創(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)建了一個?root span?,并將該?span?通過?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
}

該示例代碼展示了多層級方法間的鏈路信息傳遞,即是把?ctx?上下文變量作為第一個方法參數(shù)傳遞即可。在方法內(nèi)部,我們通過的固定語法來創(chuàng)建/開始一個?Span?:

ctx, span := gtrace.NewSpan(ctx, "xxx")
defer span.End()

并通過?defer?的方式調(diào)用?span.End?來結(jié)束一個?Span?,這樣可以很好地記錄?Span?生命周期(開始和結(jié)束)信息,這些信息都將會展示到鏈路跟蹤系統(tǒng)中。其中?gtrace.NewSpan?方法的第二個參數(shù)?spanName?我們直接給定方法的名稱即可,這樣在鏈路展示中比較有識別性。

效果查看

執(zhí)行完上面的程序后,終端輸出:

打開?Jaeger UI?: http://localhost:16686/search,可以看到鏈路追蹤的結(jié)果:

點擊詳情可以查看具體信息,包括?span?的調(diào)用順序、調(diào)用關(guān)系,執(zhí)行時間軸,以及記錄一些?Attributes?和?Events?信息,極大的方便我們定位系統(tǒng)中的異常和發(fā)現(xiàn)性能瓶頸:

其中的?tracing-inprocess?是我們?tracer?的名稱,該名稱往往是服務(wù)名稱,由于我們這里只有一個進程和一個?tracer?,因此這里只看得到一個服務(wù)名稱。其中的?main?為我們創(chuàng)建的?root span?名稱,其他的?span?為基于該?root span?創(chuàng)建的子級?span?。由于我們在程序中調(diào)用了兩次?GetUser?方法,因此這里也展示了兩次?GetUser?方法的調(diào)用。每一次?GetUser?調(diào)用的內(nèi)部又分別去調(diào)用了?GetIndo?、?GetDetail?、?GetScores?三個方法,方法間的調(diào)用層級關(guān)系展示得非常清晰明了,并且每個方法的調(diào)用時長都可以看得到。

關(guān)于其中每個?span?記錄的?Tags?和?Process?信息其實對應(yīng)了?OpenTelemetry?中的?Attributes?和?Events?信息,這些信息我們放到后續(xù)章節(jié)去詳細介紹。


分享標題:創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈路跟蹤-基本示例
URL鏈接:http://www.dlmjj.cn/article/dphipgp.html