通过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: 403A:出现上述报错,说明输入的接入点信息不正确。请更正并重试。

