通過Jaeger為應用埋點並上報鏈路資料至Managed Service for OpenTelemetry後,Managed Service for OpenTelemetry即可開始監控應用,您可以查看應用拓撲、調用鏈路、異常事務、慢事務和SQL分析等一系列監控資料。本文介紹如何使用Jaeger SDK和Jaeger Agent埋點並上報Go應用資料。
為獲得更豐富的功能、更先進的鏈路追蹤能力,以及最佳使用體驗,建議您使用OpenTelemetry協議將應用接入Managed Service for OpenTelemetry。我們為您提供了詳細的OpenTelemetry接入指南和最佳實務,協助您快速上手Managed Service for OpenTelemetry。更多資訊,請參見接入應用。
ARMS應用監控針對Golang語言提供了商業化版本的自研探針,提供了無侵入的埋點能力,擁有更加豐富的功能和更高的穩定性。詳細資料,請參見開始監控Golang應用。
前提條件
背景資訊
方式一:通過Jaeger SDK上報資料
此處以依賴管理工具Go Modules為例,您可以通過Jaeger SDK埋點直接將資料上報到Managed Service for OpenTelemetry服務端。若使用其他依賴管理工具,請按實際情況操作。
go get github.com/uber/jaeger-client-go
建立Tracer對象。
說明請將
<endpoint>
替換成Managed Service for OpenTelemetry控制台存取點資訊頁面上相應用戶端和相應地區的存取點。關於擷取存取點資訊的方法,請參見本文前提條件。func NewJaegerTracer(service string) (opentracing.Tracer, io.Closer) { sender := transport.NewHTTPTransport( // 設定網關,網關因地區而異。 "<endpoint>", ) tracer, closer:= jaeger.NewTracer(service, jaeger.NewConstSampler(true), jaeger.NewRemoteReporter(sender)) return tracer, closer }
建立span執行個體對象和資料透傳。
如果沒有parentSpan:
// 建立Span。 span := tracer.StartSpan("myspan") // 設定Tag。 clientSpan.SetTag("mytag", "123") // 透傳traceId。 tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header)) ... defer span.Finish()
如果有parentSpan:
// 從HTTP/RPC對象解析出spanCtx。 spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx)) ... defer span.Finish()
更多詳細使用方法,請參見Go Doc。
方式二:通過Jaeger Agent上報資料
啟動Jaeger Agent。具體操作,請參見安裝Jaeger Agent。
go get github.com/uber/jaeger-client-go
建立Tracer對象。
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 }
建立span執行個體對象和資料透傳。
如果沒有parentSpan:
// 建立Span。 span := tracer.StartSpan("myspan") // 設定Tag。 clientSpan.SetTag("mytag", "123") // 透傳traceId。 tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header)) ... defer span.Finish()
如果有parentSpan:
// 從HTTP/RPC對象解析出spanCtx。 spanCtx, _ := tracer.Extract(opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(r.Header)) span := tracer.StartSpan("myspan", opentracing.ChildOf(spanCtx)) ... defer span.Finish()
更多詳細使用方法,請參見Go Doc。
使用樣本
通過Jaeger SDK直接上報
擷取存取點資訊。具體操作方法,請參見本文前提條件。
運行以下命令,下載樣本檔案。
wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip
開啟樣本檔案夾中的examples/settings.go檔案,配置TracingAnalysisEndpoint,將圖示①替換為步驟1中擷取的存取點資訊。
使用
go mod tidy
命令整理依賴。使用
go run tracingdemo
命令運行樣本。
通過Jaeger Agent上報
擷取存取點資訊。具體操作方法,請參見本文前提條件。
運行以下命令,下載樣本檔案。
wget https://arms-apm-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/demo/tracing-demo.zip && unzip tracing-demo.zip
啟動Jaeger Agent。具體操作,請參見安裝Jaeger Agent。
開啟樣本檔案夾中的examples/settings.go檔案,將
AgentSwitch
修改為true
。使用
go mod tidy
命令整理依賴。使用
go run tracingdemo
命令運行樣本。
常見問題
Q:在運行過程中,為什麼會出現以下報錯?
2021/06/28 21:11:54 ERROR: error when flushing the buffer: error from collector: 403
A:出現上述報錯,說明輸入的存取點資訊不正確。請更正並重試。