有奖捉虫:行业应用 & 管理与支持文档专题 HOT
本文将为您介绍如何使用 go redis 中间件上报 Go 应用数据

操作步骤

步骤1:获取接入点和 Token

1. 登录 腾讯云可观测平台 控制台。
2. 在左侧菜单栏中选择应用性能监控 > 应用监控,单击应用列表 > 接入应用
3. 在右侧弹出的数据接入抽屉框中,单击 Go 语言。
4. 接入 Go 应用页面,选择您所要接入的地域以及业务系统
5. 选择接入协议类型Jaeger
6. 上报方式选择您所想要的上报方式,获取您的接入点Token
说明:
内网上报:使用此上报方式,您的服务需运行在腾讯云 VPC。通过 VPC 直接联通,在避免外网通信的安全风险同时,可以节省上报流量开销。
外网上报:当您的服务部署在本地或非腾讯云 VPC 内,可以通过此方式上报数据。请注意外网通信存在安全风险,同时也会造成一定上报流量费用。

步骤2:安装 Jaeger Agent

1. 下载 Jaeger Agent
2. 在控制台执行以下命令启动 Agent。
nohup ./jaeger-agent --reporter.grpc.host-port={{collectorRPCHostPort}} --agent.tags=token={{token}}


步骤3:选择上报端类型上报应用数据

选择上报端类型,通过 go redis 中间件上报 Go 应用数据:

客户端

1. 引入 opentracing-contrib/goredis 埋点依赖。
依赖路径:github.com/opentracing-contrib/goredis
版本要求: ≥ v0.0.0-20190807091203-90a2649c5f87
2. 配置 Jaeger,创建Trace对象并设置 GlobalTracer。示例如下:
cfg := &jaegerConfig.Configuration{
ServiceName: clientServerName, //对其发起请求的的调用链,叫什么服务
Sampler: &jaegerConfig.SamplerConfig{ //采样策略的配置
Type: "const",
Param: 1,
},
Reporter: &jaegerConfig.ReporterConfig{ //配置客户端如何上报trace信息,所有字段都是可选的
LogSpans: true,
LocalAgentHostPort: endPoint,
},
//Token配置
Tags: []opentracing.Tag{ //设置tag,token等信息可存于此
opentracing.Tag{Key: "token", Value: token}, //设置token
},
}
tracer, closer, err := cfg.NewTracer(jaegerConfig.Logger(jaeger.StdLogger)) //根据配置得到tracer

3. 初始化 Redis 连接,示例如下:
func InitRedisConnector() error {
redisClient = redis.NewUniversalClient(&redis.UniversalOptions{
Addrs: []string{redisAddress},
Password: redisPassword,
DB: 0,
})
if err := redisClient.Ping().Err(); err != nil {
log.Println("redisClient.Ping() error:", err.Error())
return err
}
return nil
}

4. 获取 Redis 连接,示例如下:
func GetRedisDBConnector(ctx context.Context) redis.UniversalClient {
client := apmgoredis.Wrap(redisClient).WithContext(ctx)
return client
}

完整代码如下
package main

import (
"context"
"fmt"
"github.com/go-redis/redis"
apmgoredis "github.com/opentracing-contrib/goredis"
"github.com/opentracing/opentracing-go"
"github.com/uber/jaeger-client-go"
jaegerConfig "github.com/uber/jaeger-client-go/config"
"log"
"time"
)

const (
redisAddress = "127.0.0.1:6379"
redisPassword = ""
clientServerName = "redis-client-demo"
testKey = "redis-demo-key"
endPoint = "xxxxx:6831" // HTTP 直接上报地址
token = "abc"
)

func main() {
cfg := &jaegerConfig.Configuration{
ServiceName: clientServerName, //对其发起请求的的调用链,叫什么服务
Sampler: &jaegerConfig.SamplerConfig{ //采样策略的配置
Type: "const",
Param: 1,
},
Reporter: &jaegerConfig.ReporterConfig{ //配置客户端如何上报trace信息,所有字段都是可选的
LogSpans: true,
LocalAgentHostPort: endPoint,
},
//Token配置
Tags: []opentracing.Tag{ //设置tag,token等信息可存于此
opentracing.Tag{Key: "token", Value: token}, //设置token
},
}
tracer, closer, err := cfg.NewTracer(jaegerConfig.Logger(jaeger.StdLogger)) //根据配置得到tracer
opentracing.SetGlobalTracer(tracer)
defer closer.Close()
if err != nil {
panic(fmt.Sprintf("ERROR: fail init Jaeger: %v\\n", err))
}
InitRedisConnector()
redisClient := GetRedisDBConnector(context.Background())
redisClient.Set(testKey, "redis-client-demo", time.Duration(1000)*time.Second)
redisClient.Get(testKey)
}

var (
redisClient redis.UniversalClient
)

func GetRedisDBConnector(ctx context.Context) redis.UniversalClient {
client := apmgoredis.Wrap(redisClient).WithContext(ctx)
return client
}
func InitRedisConnector() error {
redisClient = redis.NewUniversalClient(&redis.UniversalOptions{
Addrs: []string{redisAddress},
Password: redisPassword,
DB: 0,
})
if err := redisClient.Ping().Err(); err != nil {
log.Println("redisClient.Ping() error:", err.Error())
return err
}
return nil
}