通過Jaeger上報(bào)Go應(yīng)用數(shù)據(jù)
通過Jaeger為應(yīng)用埋點(diǎn)并上報(bào)鏈路數(shù)據(jù)至可觀測(cè)鏈路 OpenTelemetry 版后,可觀測(cè)鏈路 OpenTelemetry 版即可開始監(jiān)控應(yīng)用,您可以查看應(yīng)用拓?fù)洹⒄{(diào)用鏈路、異常事務(wù)、慢事務(wù)和SQL分析等一系列監(jiān)控?cái)?shù)據(jù)。本文介紹如何使用Jaeger SDK和Jaeger Agent埋點(diǎn)并上報(bào)Go應(yīng)用數(shù)據(jù)。
為獲得更豐富的功能、更先進(jìn)的鏈路追蹤能力,以及最佳使用體驗(yàn),建議您使用OpenTelemetry協(xié)議將應(yīng)用接入可觀測(cè)鏈路 OpenTelemetry 版。我們?yōu)槟峁┝嗽敿?xì)的OpenTelemetry接入指南和最佳實(shí)踐,幫助您快速上手可觀測(cè)鏈路 OpenTelemetry 版。更多信息,請(qǐng)參見接入應(yīng)用。
ARMS應(yīng)用監(jiān)控針對(duì)Golang語(yǔ)言提供了商業(yè)化版本的自研探針,提供了無侵入的埋點(diǎn)能力,擁有更加豐富的功能和更高的穩(wěn)定性。詳細(xì)信息,請(qǐng)參見開始監(jiān)控Golang應(yīng)用。
前提條件
登錄ARMS控制臺(tái),在左側(cè)導(dǎo)航欄單擊接入中心。
在服務(wù)端應(yīng)用區(qū)域單擊Jaeger卡片。
在彈出的Jaeger面板中選擇數(shù)據(jù)需要上報(bào)的地域。
說明初次接入的地域?qū)?huì)自動(dòng)進(jìn)行資源初始化。
選擇連接方式和上報(bào)方式,然后復(fù)制接入點(diǎn)信息。
連接方式:若您的服務(wù)部署在阿里云上,且所屬地域與選擇的接入地域一致,推薦使用阿里云內(nèi)網(wǎng)方式,否則選擇公網(wǎng)方式。
上報(bào)方式:根據(jù)客戶端支持的協(xié)議類型選擇HTTP或gRPC協(xié)議上報(bào)數(shù)據(jù)。
背景信息
不通過Jaeger Agent而直接上報(bào)數(shù)據(jù)的原理如下圖所示。
通過Jaeger Agent上報(bào)數(shù)據(jù)的原理如下圖所示。
方式一:通過Jaeger SDK上報(bào)數(shù)據(jù)
此處以依賴管理工具Go Modules為例,您可以通過Jaeger SDK埋點(diǎn)直接將數(shù)據(jù)上報(bào)到可觀測(cè)鏈路 OpenTelemetry 版服務(wù)端。若使用其他依賴管理工具,請(qǐng)按實(shí)際情況操作。
go get github.com/uber/jaeger-client-go
創(chuàng)建Tracer對(duì)象。
說明請(qǐng)將
<endpoint>
替換成可觀測(cè)鏈路 OpenTelemetry 版控制臺(tái)接入點(diǎn)信息頁(yè)面上相應(yīng)客戶端和相應(yīng)地域的接入點(diǎn)。關(guān)于獲取接入點(diǎn)信息的方法,請(qǐng)參見本文前提條件。func NewJaegerTracer(service string) (opentracing.Tracer, io.Closer) { sender := transport.NewHTTPTransport( // 設(shè)置網(wǎng)關(guān),網(wǎng)關(guān)因地域而異。 "<endpoint>", ) tracer, closer:= jaeger.NewTracer(service, jaeger.NewConstSampler(true), jaeger.NewRemoteReporter(sender)) return tracer, closer }
創(chuàng)建span實(shí)例對(duì)象和數(shù)據(jù)透?jìng)鳌?/span>
如果沒有parentSpan:
// 創(chuàng)建Span。 span := tracer.StartSpan("myspan") // 設(shè)置Tag。 clientSpan.SetTag("mytag", "123") // 透?jìng)?span id="z68uejxpaoma" class="help-letter-space">traceId。 tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header)) ... defer span.Finish()
如果有parentSpan:
// 從HTTP/RPC對(duì)象解析出spanCtx。 spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx)) ... defer span.Finish()
更多詳細(xì)使用方法,請(qǐng)參見Go Doc。
方式二:通過Jaeger Agent上報(bào)數(shù)據(jù)
啟動(dòng)Jaeger Agent。具體操作,請(qǐng)參見安裝Jaeger Agent。
go get github.com/uber/jaeger-client-go
創(chuàng)建Tracer對(duì)象。
func NewJaegerTracer(serviceName string) (opentracing.Tracer, io.Closer) { sender, _ := jaeger.NewUDPTransport("",0) tracer, closer:= jaeger.NewTracer(serviceName, jaeger.NewConstSampler(true), jaeger.NewRemoteReporter(sender)) return tracer, closer }
創(chuàng)建span實(shí)例對(duì)象和數(shù)據(jù)透?jìng)鳌?/span>
如果沒有parentSpan:
// 創(chuàng)建Span。 span := tracer.StartSpan("myspan") // 設(shè)置Tag。 clientSpan.SetTag("mytag", "123") // 透?jìng)?span id="z68uejxpaoma" class="help-letter-space">traceId。 tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header)) ... defer span.Finish()
如果有parentSpan:
// 從HTTP/RPC對(duì)象解析出spanCtx。 spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx)) ... defer span.Finish()
更多詳細(xì)使用方法,請(qǐng)參見Go Doc。
使用示例
通過Jaeger SDK直接上報(bào)
獲取接入點(diǎn)信息。具體操作方法,請(qǐng)參見本文前提條件。
運(yùn)行以下命令,下載示例文件。
wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip
打開示例文件夾中的examples/settings.go文件,配置TracingAnalysisEndpoint,將圖示①替換為步驟1中獲取的接入點(diǎn)信息。
使用
go mod tidy
命令整理依賴。使用
go run tracingdemo
命令運(yùn)行示例。
通過Jaeger Agent上報(bào)
獲取接入點(diǎn)信息。具體操作方法,請(qǐng)參見本文前提條件。
運(yùn)行以下命令,下載示例文件。
wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip
啟動(dòng)Jaeger Agent。具體操作,請(qǐng)參見安裝Jaeger Agent。
打開示例文件夾中的examples/settings.go文件,將
AgentSwitch
修改為true
。使用
go mod tidy
命令整理依賴。使用
go run tracingdemo
命令運(yùn)行示例。
常見問題
Q:在運(yùn)行過程中,為什么會(huì)出現(xiàn)以下報(bào)錯(cuò)?
2021/06/28 21:11:54 ERROR: error when flushing the buffer: error from collector: 403
A:出現(xiàn)上述報(bào)錯(cuò),說明輸入的接入點(diǎn)信息不正確。請(qǐng)更正并重試。