分布式链路追踪系统:Jaeger在golang中的应用
背景
随着应用容器化和微服务的兴起,借由Docker和 Kubernetes 等工具, 服务的快速开发和部署成为可能,构建微服务应用变得越来越简单。但是随着大型单体应用拆分为微服务,服务之间的依赖和调用变得极为复杂,这些服务可能是不同团队开发的,可能基于不同的语言,微服务之间可能是利用RPC, RESTful API, 也可能是通过消息队列实现调用或通讯。如何理清服务依赖调用关系,如何在这样的环境下快速debug, 追踪服务处理耗时,查找服务性能瓶颈, 合理对服务的容量评估都变成一个棘手的事情。
OpenTracing 标准
云原生基金会(CNCF) 推出了 OpenTracing 标准,推进Tracing协议和工具的标准化, 统一 Trace 数据结构和格式。 OpenTracing 通过提供平台无关、厂商无关的 API,使得开发人员能够方便的添加(或更换)追踪系统的实现。比如从Zipkin替换成Jaeger/Skywalking等后端。
在OpenTracing中,有两个主要概念:
1、Trace(调用链): OpenTracing中的Trace(调用链)通过归属于此调用链的Span来隐性的定义。一条Trace(调用链)可以被认为是一个由多个Span组成的有向无环图(DAG图), Span与Span的关系被命名为References。
2、Span(跨度):可以被理解为一次方法调用, 一个程序块的调用, 或者一次RPC/数据库访问. 只要是一个具有完整时间周期的程序访问,都可以被认为是一个Span。
单个Trace中,Span间的因果关系如下图:
image
实践
这里使用目前比较流行的Tracing开源方案Jaeger进行实践,使用jaeger-client-go这个库作为client
github地址: GitHub - jaegertracing/jaeger-client-go: Jaeger Bindings for Go OpenTracing API.
官方文档的demo: example
首先,本地起一个jaeger服务作为测试用的服务端,官方提供了”All in One”的docker镜像, 启动Jaeger服务只需要一行代码:
docker run -d --name jaeger \ -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \ -p 5775:5775/udp \ -p 6831:6831/udp \ -p 6832:6832/udp \ -p 5778:5778 \ -p 16686:16686 \ -p 14268:14268 \ -p 9411:9411 \ jaegertracing/all-in-one:1.12
All in One只使用于test环境,如果是生产环境,请参照官方文档部署
之后访问 http://localhost:16686/ ,会看到下面的页面:
image.png
接下来就要编写客户端了,最近正在学习go语言,所以这里用go语言来实现
tracer.go:
package tracer import ( "fmt" "github.com/opentracing/opentracing-go" log "github.com/sirupsen/logrus" "github.com/uber/jaeger-client-go/config" "io" ) const JaegerSamplerParam = 1 # 采样所有追踪(不能再online环境使用) const JaegerReportingHost = "127.0.0.1:6831" type TraceHandler struct { Tracer opentracing.Tracer Closer io.Closer } # 将GlobalTracerHandler作为全局变量使用,这样保证代码中使用同一个tracer var GlobalTracerHandler *TraceHandler func init() { GlobalTracerHandler = InitTracer() } # 封装了初始化tracer的方法 func InitTracer() *TraceHandler { cfg := config.Configuration{ Sampler: &config.SamplerConfig{ Type: "const", Param: JaegerSamplerParam, }, Reporter: &config.ReporterConfig{ LogSpans: true, LocalAgentHostPort: JaegerReportingHost, }, } # 设置服务名称 cfg.ServiceName = "jaeger_test" # 创建tracer tracer, closer, err := cfg.NewTracer() if err != nil { log.WithFields(log.Fields{"error": err.Error()}).Errorf("NewTracer失败") } return &TraceHandler{ Tracer: tracer, Closer: closer, } }
api.go(项目里使用了gin框架,这里把它理解为一个函数即可)
这里展示了span在函数之间是如何传递的
func Video(c *gin.Context) { # 设置全局tracer opentracing.SetGlobalTracer(tracer.GlobalTracerHandler.Tracer) # 创建父span span := opentracing.StartSpan("span_video") # 在函数返回的时候调用finish结束这个span defer span.Finish() # 创建上下文,使用上下文来传递span ctx := opentracing.ContextWithSpan(context.Background(), span) # 下面为你的业务代码 videoURL := c.DefaultPostForm("url", "") # 将ctx上下文传到调用的函数里 video, err := service.ExtractVideo(strings.TrimSpace(videoURL), ctx) 业务代码... return xxx }
video.go
func ExtractVideo(videoURL string, ctx context.Context) (models.Video, error) { # 创建子span span, _ := opentracing.StartSpanFromContext(ctx, "解析视频地址") defer func() { span.SetTag("videoURL", videoURL) span.Finish() }() # 业务代码 return xxx }
这样,span在tracer中就串连起来了
版权声明:
作者: freeclashnode
链接: https://www.freeclashnode.com/news/article-1959.htm
来源: FreeClashNode
文章版权归作者所有,未经允许请勿转载。
热门文章
- 3月4日|22M/S,V2ray/Clash(小猫咪)/SSR免费节点订阅链接每天更新
- 3月5日|20.2M/S,SSR/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 3月6日|20.1M/S,V2ray/SSR/Clash(小猫咪)免费节点订阅链接每天更新
- 3月1日|19.4M/S,V2ray/Clash(小猫咪)/Shadowrocket(小火箭)免费节点订阅链接每天更新
- 3月2日|21.9M/S,Shadowrocket(小火箭)/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 3月7日|18M/S,Clash(小猫咪)/V2ray/Shadowrocket(小火箭)免费节点订阅链接每天更新
- 2月27日|21.1M/S,SSR/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 2月26日|22.8M/S,Clash(小猫咪)/SSR/V2ray免费节点订阅链接每天更新
- 3月9日|22.9M/S,Clash(小猫咪)/V2ray/Shadowrocket(小火箭)免费节点订阅链接每天更新
- 3月8日|22.6M/S,Clash(小猫咪)/SSR/V2ray免费节点订阅链接每天更新
最新文章
- 3月24日|22.4M/S,V2ray/Clash(小猫咪)/SSR免费节点订阅链接每天更新
- 3月23日|18.8M/S,Shadowrocket(小火箭)/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 3月22日|19.8M/S,Clash(小猫咪)/V2ray/SSR免费节点订阅链接每天更新
- 3月21日|22.2M/S,V2ray/Clash(小猫咪)/SSR免费节点订阅链接每天更新
- 3月20日|22.8M/S,V2ray/SSR/Clash(小猫咪)免费节点订阅链接每天更新
- 3月19日|21.1M/S,V2ray/Clash(小猫咪)/SSR免费节点订阅链接每天更新
- 3月18日|18.7M/S,V2ray/Shadowrocket(小火箭)/Clash(小猫咪)免费节点订阅链接每天更新
- 3月17日|20.1M/S,SSR/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 3月16日|18.9M/S,Shadowrocket(小火箭)/Clash(小猫咪)/V2ray免费节点订阅链接每天更新
- 3月15日|22.4M/S,Shadowrocket(小火箭)/Clash(小猫咪)/V2ray免费节点订阅链接每天更新