在追踪应用的链路数据之前,您需要通过客户端将应用数据上报至链路追踪服务端。本文介绍如何通过Jaeger客户端上报Go应用数据,包括使用Jaeger SDK上报和使用Jaeger
Agent上报两种方式,并在文末提供示例。
前提条件
获取接入点信息
登录链路追踪控制台 ,在页面顶部选择需要接入的地域。
在接入点信息 页签的集群信息 区域打开显示Token 开关。
在客户端采集工具 区域单击需要使用的链路数据采集客户端。
在下方表格的相关信息 列中,单击接入点信息末尾的复制图标。
说明:
对于ACK集群应用,建议通过ARMS OpenTelemetry Collector上报应用数据。ARMS OpenTelemetry Collector支持本地集群内的链路采样与指标无损统计,在降低链路传输、存储成本的同时,不影响监控或告警指标的准确性。更多信息,请参见ARMS OpenTelemetry Collector 。
如果应用部署于阿里云生产环境,则选择私网接入点,否则选择公网接入点。对于Zipkin,一般情况下请使用v2版接入点,v1版接入点仅限对Zipkin十分了解的高阶用户使用。
背景信息
数据是如何上报的?
不通过Jaeger Agent而直接上报数据的原理如下图所示。
通过Jaeger Agent上报数据的原理如下图所示。
方式一:通过Jaeger SDK上报数据
此处以依赖管理工具Go Modules为例,您可以通过Jaeger SDK埋点直接将数据上报到链路追踪服务端。若使用其他依赖管理工具,请按实际情况操作。
引入jaeger-client-go 。 go get github.com/uber/jaeger-client-go
创建Tracer对象。
说明 请将<endpoint>
替换成链路追踪控制台接入点信息 页面上相应客户端和相应地域的接入点。关于获取接入点信息的方法,请参见本文前提条件。
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()
方式二:通过Jaeger Agent上报数据
启动Jaeger Agent。具体操作,请参见安装Jaeger Agent 。
引入jaeger-client-go 。 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()
使用示例
通过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
2021/06/28 21:11:54 ERROR: error when flushing the buffer: error from collector: 403
A:出现上述报错,说明输入的接入点信息不正确。请更正并重试。