jaeger简单发送---链路追踪

2024-01-08 07:20

本文主要是介绍jaeger简单发送---链路追踪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

jaeger

go发送单个span

package mainimport ("fmt""github.com/uber/jaeger-client-go"jaegercfg "github.com/uber/jaeger-client-go/config"
)func main() {cfg := jaegercfg.Configuration{Sampler: &jaegercfg.SamplerConfig{ //采样类型Type:  jaeger.SamplerTypeConst,Param: 1,},Reporter: &jaegercfg.ReporterConfig{ //上报配置LogSpans:           true, //打印日志LocalAgentHostPort: "192.168.0.102:6831",},//Disabled:ServiceName: "chengpeng", //服务名}fmt.Println("chengpeng", cfg)tracer, closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))if err != nil {panic(err)}defer closer.Close()span := tracer.StartSpan("go-grpc-web")defer span.Finish()
}

相关功能讲解

go发送多级嵌套span

在这里插入图片描述
上图tracer相同

package mainimport ("github.com/opentracing/opentracing-go""github.com/uber/jaeger-client-go""time"jaegercfg "github.com/uber/jaeger-client-go/config"
)func main() {//var a []opentracing.Tag//a = append(a, opentracing.Tag{Key: "chengpeng", Value: 123})cfg := jaegercfg.Configuration{Sampler: &jaegercfg.SamplerConfig{ //采样类型Type:  jaeger.SamplerTypeConst,Param: 1,},Reporter: &jaegercfg.ReporterConfig{ //上报配置LogSpans:           true,                 //打印日志LocalAgentHostPort: "192.168.0.102:6831", //当前ip},//Disabled:ServiceName: "chengpeng", //服务名}tracer, closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))if err != nil {panic(err)}defer closer.Close()parentSpan := tracer.StartSpan("main")span := tracer.StartSpan("funcA", opentracing.ChildOf(parentSpan.Context()))time.Sleep(time.Millisecond * 500)span.Finish()time.Sleep(time.Millisecond * 50)span2 := tracer.StartSpan("funcB", opentracing.ChildOf(parentSpan.Context()))time.Sleep(time.Millisecond * 1000)span2.Finish()parentSpan.Finish()
}

go下通过grpc发送span

go-grpc-opentracing

package mainimport ("context""fmt""OldPackageTest/jaeger_test/otgrpc""github.com/opentracing/opentracing-go""github.com/uber/jaeger-client-go"jaegercfg "github.com/uber/jaeger-client-go/config""google.golang.org/grpc""OldPackageTest/grpc_test/proto"
)func main() {cfg := jaegercfg.Configuration{Sampler: &jaegercfg.SamplerConfig{Type:  jaeger.SamplerTypeConst,Param: 1,},Reporter: &jaegercfg.ReporterConfig{LogSpans:           true,LocalAgentHostPort: "192.168.0.104:6831",},ServiceName: "mxshop",}tracer, closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))if err != nil {panic(err)}opentracing.SetGlobalTracer(tracer)defer closer.Close()conn, err := grpc.Dial("127.0.0.1:50051", grpc.WithInsecure(), grpc.WithUnaryInterceptor(otgrpc.OpenTracingClientInterceptor(opentracing.GlobalTracer())))if err != nil {panic(err)}defer conn.Close()c := proto.NewGreeterClient(conn)r, err := c.SayHello(context.Background(), &proto.HelloRequest{Name: "bobby"})if err != nil {panic(err)}fmt.Println(r.Message)
}

修改资源绑定的代码

func OpenTracingClientInterceptor(tracer opentracing.Tracer, optFuncs ...Option) grpc.UnaryClientInterceptor {otgrpcOpts := newOptions()otgrpcOpts.apply(optFuncs...)return func(ctx context.Context,method string,req, resp interface{},cc *grpc.ClientConn,invoker grpc.UnaryInvoker,opts ...grpc.CallOption,) error {var err errorvar parentCtx opentracing.SpanContextif parent := opentracing.SpanFromContext(ctx); parent != nil {parentCtx = parent.Context()}//fmt.Println("chengpengtext", parentCtx)ginContext := ctx.Value("ginContext")switch ginContext.(type) {case *gin.Context:if itracer, ok := ginContext.(*gin.Context).Get("tracer"); ok {tracer = itracer.(opentracing.Tracer)}if parentSpan, ok := ginContext.(*gin.Context).Get("parentSpan"); ok {parentCtx = parentSpan.(*jaegerClient.Span).Context()}}//fmt.Println("chengpengtext1", ginContext)//fmt.Println("chengpengtext2", tracer)//fmt.Println("chengpengtext3", parentCtx)if otgrpcOpts.inclusionFunc != nil &&!otgrpcOpts.inclusionFunc(parentCtx, method, req, resp) {return invoker(ctx, method, req, resp, cc, opts...)}clientSpan := tracer.StartSpan(method,opentracing.ChildOf(parentCtx),ext.SpanKindRPCClient,gRPCComponentTag,)defer clientSpan.Finish()ctx = injectSpanContext(ctx, tracer, clientSpan)if otgrpcOpts.logPayloads {clientSpan.LogFields(log.Object("gRPC request", req))}err = invoker(ctx, method, req, resp, cc, opts...)if err == nil {if otgrpcOpts.logPayloads {clientSpan.LogFields(log.Object("gRPC response", resp))}} else {SetSpanTags(clientSpan, err, true)clientSpan.LogFields(log.String("event", "error"), log.String("message", err.Error()))}if otgrpcOpts.decorator != nil {otgrpcOpts.decorator(clientSpan, method, req, resp, err)}return err}
}

在这里插入图片描述
链路追踪

package middlewaresimport ("chengpeng_api/goods-web/global""fmt""github.com/gin-gonic/gin""github.com/uber/jaeger-client-go"jaegercfg "github.com/uber/jaeger-client-go/config"//"google.golang.org/grpc"
)// Trace 链路跟踪
func Trace() gin.HandlerFunc {return func(ctx *gin.Context) {cfg := jaegercfg.Configuration{Sampler: &jaegercfg.SamplerConfig{Type:  jaeger.SamplerTypeConst,Param: 1,},Reporter: &jaegercfg.ReporterConfig{LogSpans:           true,LocalAgentHostPort: fmt.Sprintf("%s:%d", global.ServerConfig.JaegerInfo.Host, global.ServerConfig.JaegerInfo.Port),},ServiceName: global.ServerConfig.JaegerInfo.Name,}tracer, closer, err := cfg.NewTracer(jaegercfg.Logger(jaeger.StdLogger))if err != nil {panic(err)}//opentracing.SetGlobalTracer(tracer) //设置为全局  这样使用就会出问题 不能放到同一个tracerdefer closer.Close()fmt.Println("chengpengTrace", ctx.Request.URL.Path) //每一个api都是tracestartSpan := tracer.StartSpan(ctx.Request.URL.Path) //起始的Spandefer startSpan.Finish()//放到ctx中 需要直接传递过去ctx.Set("tracer", tracer)ctx.Set("parentSpan", startSpan)ctx.Next()}
}

这样就会设置gin.conext中去,然后通过图片上的就可以放到context中
grpc的server端如何获取客户端

这篇关于jaeger简单发送---链路追踪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/582685

相关文章

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

利用Python编写一个简单的聊天机器人

《利用Python编写一个简单的聊天机器人》这篇文章主要为大家详细介绍了如何利用Python编写一个简单的聊天机器人,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 使用 python 编写一个简单的聊天机器人可以从最基础的逻辑开始,然后逐步加入更复杂的功能。这里我们将先实现一个简单的

Python手搓邮件发送客户端

《Python手搓邮件发送客户端》这篇文章主要为大家详细介绍了如何使用Python手搓邮件发送客户端,支持发送邮件,附件,定时发送以及个性化邮件正文,感兴趣的可以了解下... 目录1. 简介2.主要功能2.1.邮件发送功能2.2.个性签名功能2.3.定时发送功能2. 4.附件管理2.5.配置加载功能2.6.

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

使用IntelliJ IDEA创建简单的Java Web项目完整步骤

《使用IntelliJIDEA创建简单的JavaWeb项目完整步骤》:本文主要介绍如何使用IntelliJIDEA创建一个简单的JavaWeb项目,实现登录、注册和查看用户列表功能,使用Se... 目录前置准备项目功能实现步骤1. 创建项目2. 配置 Tomcat3. 项目文件结构4. 创建数据库和表5.

使用PyQt5编写一个简单的取色器

《使用PyQt5编写一个简单的取色器》:本文主要介绍PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16进制颜色编码,一款跟随鼠标刷新图像的RGB和16... 目录取色器1取色器2PyQt5搭建的一个取色器,一共写了两款应用,一款使用快捷键捕获鼠标附近图像的RGB和16

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

基于Qt开发一个简单的OFD阅读器

《基于Qt开发一个简单的OFD阅读器》这篇文章主要为大家详细介绍了如何使用Qt框架开发一个功能强大且性能优异的OFD阅读器,文中的示例代码讲解详细,有需要的小伙伴可以参考一下... 目录摘要引言一、OFD文件格式解析二、文档结构解析三、页面渲染四、用户交互五、性能优化六、示例代码七、未来发展方向八、结论摘要

Django中使用SMTP实现邮件发送功能

《Django中使用SMTP实现邮件发送功能》在Django中使用SMTP发送邮件是一个常见的需求,通常用于发送用户注册确认邮件、密码重置邮件等,下面我们来看看如何在Django中配置S... 目录1. 配置 Django 项目以使用 SMTP2. 创建 Django 应用3. 添加应用到项目设置4. 创建