新聞中心
一、OpenTelemetry
分布式鏈路跟蹤( ?Distributed Tracing? )的概念最早是由?GOogle?提出來的,發(fā)展至今技術(shù)已經(jīng)比較成熟,也是有一些協(xié)議標(biāo)準(zhǔn)可以參考。目前在?Tracing?技術(shù)這塊比較有影響力的是兩大開源技術(shù)框架:?Netflix?公司開源的?OpenTracing?和?Google?開源的?OpenCensus?。兩大框架都擁有比較高的開發(fā)者群體。為形成統(tǒng)一的技術(shù)標(biāo)準(zhǔn),兩大框架最終磨合成立了?OpenTelemetry?項目,簡稱?otel?。具體可以參考:

創(chuàng)新互聯(lián)建站成都網(wǎng)站建設(shè)定制開發(fā),是成都網(wǎng)站維護(hù)公司,為生料攪拌車提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計、前端HTML5制作、后臺程序開發(fā)等。成都網(wǎng)站建設(shè)熱線:13518219792
- OpenTracing介紹
- OpenTelemetry介紹
因此,我們的?Tracing?技術(shù)方案以?OpenTelemetry?為實施標(biāo)準(zhǔn),協(xié)議標(biāo)準(zhǔn)的一些Golang實現(xiàn)開源項目:
https://github.com/open-telemetry/opentelemetry-go
https://github.com/open-telemetry/opentelemetry-go-contrib
其他第三方的框架和系統(tǒng)(如?Jaeger/Prometheus/Grafana?等)也會按照標(biāo)準(zhǔn)化的規(guī)范來對接?OpenTelemetry?,使得系統(tǒng)的開發(fā)和維護(hù)成本大大降低。
二、重要概念
我們先看看?OpenTelemetry?的架構(gòu)圖,我們這里不會完整介紹,只會介紹其中大家常用的幾個概念。關(guān)于?OpenTelemetry?的內(nèi)部技術(shù)架構(gòu)設(shè)計介紹,可以參考 ?OpenTelemetry?架構(gòu) ,關(guān)于語義約定請參考:https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/api.md
TracerProvider
主要負(fù)責(zé)創(chuàng)建?Tracer?,一般是需要第三方的分布式鏈路跟蹤管理平臺提供具體的實現(xiàn)。默認(rèn)情況是一個空的?TracerProvider (NoopTracerProvider)?,雖然也能創(chuàng)建?Tracer?但是內(nèi)部其實不會執(zhí)行具體的數(shù)據(jù)流傳輸邏輯。
Tracer
?Tracer?表示一次完整的追蹤鏈路,?tracer?由一個或多個?span?組成。下圖示例表示了一個由8個?span?組成的?tracer?:
[Span A] ←←←(the root span)
|
+------+------+
| |
[Span B] [Span C] ←←←(Span C is a `ChildOf` Span A)
| |
[Span D] +---+-------+
| |
[Span E] [Span F] >>> [Span G] >>> [Span H]
↑
↑
↑
(Span G `FollowsFrom` Span F)時間軸的展現(xiàn)方式會更容易理解:
––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–––––––|–> time
[Span A···················································]
[Span B··············································]
[Span D··········································]
[Span C········································]
[Span E·······] [Span F··] [Span G··] [Span H··]我們通常通過以下方式創(chuàng)建一個?Tracer?:
gtrace.NewTracer(tracerName)Span
?Span?是一條追蹤鏈路中的基本組成要素,一個?span?表示一個獨立的工作單元,比如可以表示一次函數(shù)調(diào)用,一次?http?請求等等。?span?會記錄如下基本要素:
- 服務(wù)名稱(?
operation name?) - 服務(wù)的開始時間和結(jié)束時間
- ?
K/V?形式的?Tags? - ?
K/V?形式的?Logs? - ?
SpanContext?
?Span?是這么多對象中使用頻率最高的,因此創(chuàng)建?Span?也非常簡便,例如:
gtrace.NewSpan(ctx, spanName, opts...)Attributes
?Attributes?以?K/V?鍵值對的形式保存用戶自定義標(biāo)簽,主要用于鏈路追蹤結(jié)果的查詢過濾。例如:http.method="GET",http.status_code=200?。其中?key?值必須為字符串,?value?必須是字符串,布爾型或者數(shù)值型。 ?span?中的?Attributes?僅自己可見,不會隨著?SpanContext?傳遞給后續(xù)?span?。 設(shè)置?Attributes?方式例如:
span.SetAttributes(
label.String("http.remote", conn.RemoteAddr().String()),
label.String("http.local", conn.LocalAddr().String()),
)
Events
?Events?與?Attributes?類似,也是?K/V?鍵值對形式。與?Attributes?不同的是,?Events?還會記錄寫入?Events?的時間,因此?Events?主要用于記錄某些事件發(fā)生的時間。?Events?的?key?值同樣必須為字符串,但對?value?類型則沒有限制。例如:
span.AddEvent("http.request", trace.WithAttributes(
label.Any("http.request.header", headers),
label.Any("http.request.baggage", gtrace.GetBaggageMap(ctx)),
label.String("http.request.body", bodyContent),
))
SpanContext
?SpanContext?攜帶著一些用于跨服務(wù)通信的(跨進(jìn)程)數(shù)據(jù),主要包含:
- 足夠在系統(tǒng)中標(biāo)識該?
span?的信息,比如:?span_id?, ?trace_id?。 - ?
Baggage?-為整條追蹤連保存跨服務(wù)(跨進(jìn)程)的?K/V?格式的用戶自定義數(shù)據(jù)。?Baggage? 與 ?Attributes? 類似,也是 ?K/V? 鍵值對。與Attributes不同的是: - 其?
key?跟?value?都只能是字符串格式 - ?
Baggage?不僅當(dāng)前?span?可見,其會隨著?SpanContext?傳遞給后續(xù)所有的子?span?。要小心謹(jǐn)慎的使用?Baggage- 因為在所有的?span?中傳遞這些?K,V?會帶來不小的網(wǎng)絡(luò)和?CPU?開銷。
Propagator
?Propagator?傳播器用于端對端的數(shù)據(jù)編碼/解碼,例如:?Client?到?Server?端的數(shù)據(jù)傳輸,?TraceId?、?SpanId?和?Baggage?也是需要通過傳播器來管理數(shù)據(jù)傳輸。業(yè)務(wù)端開發(fā)者往往對?Propagator?無感知,只有中間件/攔截器的開發(fā)者需要知道它的作用。?OpenTelemetry?的標(biāo)準(zhǔn)協(xié)議實現(xiàn)庫提供了常用的?TextMapPropagator?,用于常見的文本數(shù)據(jù)端到端傳輸。此外,為保證?TextMapPropagator?中的傳輸數(shù)據(jù)兼容性,不應(yīng)當(dāng)帶有特殊字符,具體請參考:https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/context/api-propagators.md
?GoFrame?框架通過?gtrace 模塊使用了以下傳播器對象,并全局設(shè)置到了?OpenTelemetry?中:
// defaultTextMapPropagator is the default propagator for context propagation between peers.
defaultTextMapPropagator = propagation.NewCompositeTextMapPropagator(
propagation.TraceContext{},
propagation.Baggage{},
)三、支持組件
?GoFrame?的核心組件都已經(jīng)全面支持?OpenTelemetry?標(biāo)準(zhǔn),并且自動開啟了鏈路跟蹤特性,開發(fā)者無需顯示調(diào)用、使用無感知。在沒有注入外部?TracerProvider?的情況下,框架會使用默認(rèn)的?TracerProvider?,該?TracerProvider?只會自動創(chuàng)建?TraceID?及?SpanID?,并不會執(zhí)行復(fù)雜邏輯。
包括但不限于以下核心組件:
- ?
Http Client?
?HTTP?客戶端自動啟用了鏈路跟蹤特性。
- ?
Http Server?
?HTTP?服務(wù)端自動啟用了鏈路跟蹤特性。
- ?
gRPC Client?
?gRPC?客戶端自動啟用了鏈路跟蹤特性。
- ?
gRPC Server?
?gRPC?服務(wù)端自動啟用了鏈路跟蹤特性。
- ?
Logging?
日志內(nèi)容中需要注入當(dāng)前請求的?TraceId?,以方便通過日志快速查找定位問題點。該特性是由?glog?組件實現(xiàn),這需要開發(fā)者在輸出日志的時候調(diào)用?Ctx?鏈?zhǔn)讲僮鞣椒▽?context.Context?上下文變量傳遞到當(dāng)前輸出日志操作鏈路中,沒有傳遞?context.Context?上下文變量,就會丟失日志內(nèi)容中的?TraceId?。
- ?
ORM?
數(shù)據(jù)庫的執(zhí)行是很重要的鏈路環(huán)節(jié),?Orm?組件需要將自身的執(zhí)行情況投遞到鏈路中,作為執(zhí)行鏈路的一部分。
- ?
Redis?
?Redis?的執(zhí)行也是很重要的鏈路環(huán)節(jié),?Redis?需要將自身的執(zhí)行情況投遞到鏈路中,作為執(zhí)行鏈路的一部分。
- ?
Utils?
對于?Tracing?特性的管理需要做一定的封裝,主要考慮的是可擴(kuò)展性和易用性兩方面。該封裝由?gtrace?模塊實現(xiàn),文檔地址:https://pkg.go.dev/github.com/gogf/gf/v2/net/gtrace
網(wǎng)頁題目:創(chuàng)新互聯(lián)GoFrame教程:GoFrame鏈路跟蹤-背景知識
標(biāo)題來源:http://m.fisionsoft.com.cn/article/copgecd.html


咨詢
建站咨詢
