Golang XORM搭配OpenTracing+Jaeger链路监控让SQL执行一览无遗(附源码)
系统环境
go version go1.14.3 windows/amd64
⚠️注意
本文章使用的是 xorm 1.0.0
版本,同时实现的方式不是并发安全
的,xorm
新版本已经加入Hook
钩子函数,通过钩子函数可以实现并发安全
的分布式链路追踪,具体请点击:
🌇 Golang XORM实现分布式链路追踪(源码分析,分布式CRUD必学)
一、Docker运行JaegerTracing-All-In-One镜像
Docker命令
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 14250:14250 -p 9411:9411 jaegertracing/all-in-one:1.18
浏览器访问localhost:16686
,可以看到JaegerUI
界面,如下所示:
至此,以内存
作为数据寄存方式的OpenTracing+Jaeger
服务成功运行。
二、GoModule安装Xorm、OpenTracing和Jaeger
Xorm - 需要 1.0
版本及以上才能支持传递Context上下文
go get xorm.io/xorm
OpenTracing和Jaeger - 只需要安装Jaeger-Client
就会依赖Opentracing
go get github.com/uber/jaeger-client-go
三、初始化Opentracing和Jaeger
func initJaeger() (closer io.Closer, err error) {
// 根据配置初始化Tracer 返回Closer
tracer, closer, err := (&config.Configuration{
ServiceName: "xormWithTracing",
Disabled: false,
Sampler: &config.SamplerConfig{
Type: jaeger.SamplerTypeConst,
// param的值在0到1之间,设置为1则将所有的Operation输出到Reporter
Param: 1,
},
Reporter: &config.ReporterConfig{
LogSpans: true,
LocalAgentHostPort: "localhost:6831",
},
}).NewTracer()
if err != nil {
return
}
// 设置全局Tracer - 如果不设置将会导致上下文无法生成正确的Span
opentracing.SetGlobalTracer(tracer)
return
}
四、通过日志模块将链路监控侵入到XORM执行逻辑中
XORM
通过其中Log包里面的ContextLogger
接口定义了它需要的日志实例是怎么样的,我们可以在外部实现该接口就可以将链路监控
的逻辑侵入到XORM
的执行过程
// xorm.io\xorm@v1.0.2\log
// ContextLogger represents a logger interface with context
type ContextLogger interface {
SQLLogger
Debugf(format