初始化jaeger

​ 系统中使用Jaeger非常简单,只需要在原有程序中插入少量代码。以下代码模拟了一个查询用户账户余额,执行扣款的业务场景:

 

4.1 初始化jaeger函数

​ 主要是按照实际需要配置有关参数,例如服务名称、采样模式、采样比例等等。

 

func initJaeger() (tracer opentracing.Tracer, closer io.Closer, err error) {

// 构造配置信息

cfg := &config.Configuration{

// 设置服务名称

ServiceName: "ServiceAmount",

// 设置采样参数

Sampler: &config.SamplerConfig{

Type:  "const", // 全采样模式

Param: 1,       // 开启状态

},

}

 

// 生成一条新tracer

tracer, closer, err = cfg.NewTracer()

if err == nil {

// 设置tracer为全局单例对象

opentracing.SetGlobalTracer(tracer)

}

return

}

4.2 检测用户余额函数

​ 用于检测用户余额,模拟一个子任务Span。

 

func CheckBalance(request string, ctx context.Context) {

// 创建子span

span, _ := opentracing.StartSpanFromContext(ctx, "CheckBalance")

 

// 模拟系统进行一系列的操作,耗时1/3秒

time.Sleep(time.Second / 3)

 

// 示例:将需要追踪的信息放入tag

span.SetTag("request", request)

span.SetTag("reply", "CheckBalance reply")

 

// 结束当前span

span.Finish()

 

log.Println("CheckBalance is done")

}

4.3 从用户账户扣款函数

​ 从用户账户扣款,模拟一个子任务span。

 

func Reduction(request string, ctx context.Context) {

// 创建子span

span, _ := opentracing.StartSpanFromContext(ctx, "Reduction")

 

// 模拟系统进行一系列的操作,耗时1/2秒

time.Sleep(time.Second / 2)

 

// 示例:将需要追踪的信息放入tag

span.SetTag("request", request)

span.SetTag("reply", "Reduction reply")

 

// 结束当前span

span.Finish()

 

log.Println("Reduction is done")

}

4.4 主函数

​ 初始化jaeger环境,生成tracer,创建父span,以及调用查询余额和扣款两个子任务span。

 

package main

 

import (

"context"

"fmt"

"github.com/opentracing/opentracing-go"

"github.com/uber/jaeger-client-go/config"

"io"

"log"

"time"

)

 

func main() {

// 初始化jaeger,创建一条新tracer

tracer, closer, err := initJaeger()

if err != nil {

panic(fmt.Sprintf("ERROR: cannot init Jaeger: %v\n", err))

}

defer closer.Close()

 

// 创建一个新span,作为父span,开始计费过程

span := tracer.StartSpan("CalculateFee")

 

// 生成父span的context

ctx := opentracing.ContextWithSpan(context.Background(), span)

 

// 示例:设置一个span标签信息

span.SetTag("db.instance", "customers")

// 示例:输出一条span日志信息

span.LogKV("event", "timed out")

 

// 将父span的context作为参数,调用检测用户余额函数

CheckBalance("CheckBalance request", ctx)

 

// 将父span的context作为参数,调用扣款函数

Reduction("Reduction request", ctx)

 

// 结束父span

span.Finish()

}

上一篇:当 .NET 5 遇上OpenTelemetry,会碰撞出怎样的火花?


下一篇:[jaeger] 二、客户端使用 (Java版本)