点击上方蓝色“飞雪无情”关注我,设个星标,第一时间看文章
最近需要对NodeJS中的调用进行链路跟踪,所以需要使用Jaeger进行跟踪,这里我们选用的是阿里云ARMS中的Jaeger链路跟踪,但是在Golang项目中使用没问题的链路跟踪,却在NodeJS踩了个大坑。
什么是Jaeger
Jaeger 是用于追踪分布式服务之间事务的开源软件。它用来监控复杂的微服务环境并对其进行故障排除。它实现了OpenTracing API,非常好用,同时它也是CNCF毕业的项目,使用Go语言编写。类似的开源软件还有skywalking等。
接入Jaeger
在Golang语言中接入Jaeger非常简单,仅需几行代码就可以搞定:
// SDK上报需要:设置链路追踪的网关(不同region对应不同的值,从http://tracing.console.aliyun.com/ 的配置查看中获取)
const TracingAnalysisEndpoint = "http://tracing-analysis-dc-hz.aliyuncs.com/adapt_xxxxxx_xxxxx/api/traces"
sender := transport.NewHTTPTransport(
TracingAnalysisEndpoint,
)
tracer, _ := jaeger.NewTracer(service,
jaeger.NewConstSampler(true),
jaeger.NewRemoteReporter(sender, jaeger.ReporterOptions.Logger(jaeger.StdLogger)),
)
这里的TracingAnalysisEndpoint 是链路跟踪的接入点,我这里是以阿里云的为例,你也可以换成自己的。service
表示微服务的名称,同时我这里使用ConstSampler固定采样率
有了 tracer
后就可以使用它来创建自己的span进行链路跟踪了:
// 创建Span。
span := tracer.StartSpan("myspan")
// 设置Tag。
clientSpan.SetTag("mytag", "123")
// 透传traceId。
tracer.Inject(span.Context(), opentracing.HTTPHeaders, opentracing.HTTPHeadersCarrier(req.Header))
...
defer span.Finish()
这里不再对链路跟踪展开讲,感兴趣的可以参考 OpenTracing API。
远程采样策略配置
在上面的示例中,我们使用的是固定的采样率,但是这种方式很不灵活,粒度也比较粗,针对这样情况,jaeger支持远程采样策略配置,其实就是在服务端配置后,客户端拉取使用,这样方式可以让服务端控制客户端的采样率,同时也可以根据每个span定制不同的采样率,所以非常方便。
在Go语言中,使用远程采样策略配置同样简单,客户端把上面示例中的 jaeger.NewConstSampler
换成 jaeger.N