参考 https://pkg.go.dev/go.elastic.co/apm/module 对常用客户端进行封装。
- gin
- gorm
- gormv2
- grpc(grpc已经实现的拦截器)
- http
- redis
- redisv8
go get -u github.com/blinkbean/jaeger-model
封装之后对调用方基本透明
- 新建连接 jaegergorm.Open
- 查询前调用WithContext
var db *gorm.DB
// 初始化只执行一次
func InitDB() *gorm.DB {
// dbType: mysql、postgres、sqlite3
db, err := jaegergorm.Open(dbType, dataSource)
if err != nil {
panic(err)
}
return db
}
// 可根据需要自行封装该方法
func DatabaseConn(ctx context.context) (*gorm.DB, err) {
db = jaegergorm.WithContext(ctx, db)
return db, nil
}
func DoSomeThingWithDB(ctx context.Context) {
// 绑定context
o, err := DatabaseConn(ctx)
if err != nil {
// log
return err
}
var datas = []*table{}
err = o.Model(&table{}).Where("status = 1 and user_id = 123").Find(&datas).Error
if err != nil {
// log
return err
}
fmt.Println(datas)
return nil
}
初始化的时候调用jaegerredis.Wrap方法包装redisClient对象,之后对调用方基本透明
var redisClient jaegerredis.Client
func newRedisClient() jaegerredis.Client {
clusterOptions := &redis.ClusterOptions{
// do something
}
clusterClient := redis.NewClusterClient(clusterOptions)
return jaegerredis.Wrap(clusterClient)
}
func InitRedis() {
redisClient = newRedisClient()
}
func DoSomethingWithRedis(ctx context.Context) {
key := "KH:CSR:C:TAG:{SID:26828551:T:5:S:2"
// 执行redis命令前绑定context
result, err := redisClient.WithContext(ctx).HGetAll(key).Result()
if err != nil {
if err != redis.Nil {
// log error
return
}
}
fmt.Println(result)
return
}
-
运行 docker all-in-one
docker run -d --name jaeger \ -e COLLECTOR_ZIPKIN_HOST_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:latest
-
启动本地redis
const HOSTPORT = "127.0.0.1:6831"
-
启动本地mysql
- 配置
const DATASOURCE = "root:root@tcp(127.0.0.1:3306)/jaeger?parseTime=true&loc=Local&charset=utf8mb4"
- 建表struct
type Jaeger struct { Id int64 `json:"id"` JaegerId int64 `json:"jaeger_id"` Text string `json:"text"` } func (j Jaeger) TableName() string { return "jaeger" }