通过Jaeger为应用埋点并上报链路数据至可观测链路 OpenTelemetry 版后,可观测链路 OpenTelemetry 版即可开始监控应用,您可以查看应用拓扑、调用链路、异常事务、慢事务和SQL分析等一系列监控数据。本文介绍如何使用Jaeger SDK和Jaeger Agent埋点并上报Go应用数据。
为获得更丰富的功能、更先进的链路追踪能力,以及最佳使用体验,建议您使用OpenTelemetry协议将应用接入可观测链路 OpenTelemetry 版。我们为您提供了详细的OpenTelemetry接入指南和最佳实践,帮助您快速上手可观测链路 OpenTelemetry 版。更多信息,请参见接入应用。
ARMS应用监控针对Golang语言提供了商业化版本的自研探针,提供了无侵入的埋点能力,拥有更加丰富的功能和更高的稳定性。详细信息,请参见开始监控Golang应用。
前提条件
背景信息
方式一:通过Jaeger SDK上报数据
此处以依赖管理工具Go Modules为例,您可以通过Jaeger SDK埋点直接将数据上报到可观测链路 OpenTelemetry 版服务端。若使用其他依赖管理工具,请按实际情况操作。
go get github.com/uber/jaeger-client-go
创建Tracer对象。
说明请将
<endpoint>
替换成可观测链路 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:出现上述报错,说明输入的接入点信息不正确。请更正并重试。