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端如何获取客户端

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/604735.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序 蓝牙连接与回连过程

小程序蓝牙连接过程包括扫描设备、连接设备和发送数据等步骤 具体步骤如下: 打开蓝牙:在小程序中调用wx.openBluetoothAdapter()函数打开蓝牙适配器。 监听蓝牙适配器状态:使用wx.onBluetoothAdapterStateChange()函数监听蓝牙适配器的状态…

2023年12 月电子学会Python等级考试试卷(一级)答案解析

青少年软件编程(Python)等级考试试卷(一级) 分数:100 题数:37 一、单选题(共25题,共50分) 1. 下列程序运行的结果是?( ) print(hello) print(world) A. helloworld

部署可道云网盘的一个漏洞解决

目录 1漏洞展示 2.防范措施 1漏洞展示 因为可道云网盘的上传文档有保存在 /data/Group/public/home/文档/ 中,当别有用心之人知道个人部署的域名与上次的文件后,可以进行访问拿到uid。例我在我部署的网盘上上次一个aa.php 文件,然后拿来演示 然后通过…

LeetCode刷题笔记之栈与队列

一、队列与栈相互转换 1. 232【用栈实现队列】 题目: 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(int x) 将元素 x 推到队列的末…

Java SE入门及基础(5)

变量的定义与使用 1. 变量的概念 从字面意思看,变量就是会变化的量。 从计算机专业角度看,变量就是一个内存空间地址的表示。 在Java中,内存分为栈内存和堆内存两大块 2. 变量的声明 语法 数据类型 变量名 ; 变量名 变量值…

Python笔记07-异常、模块和包

文章目录 异常及捕获方法python模块python包安装第三方包 异常及捕获方法 当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”, 也就是我们常说的BUG 例如:以r方式打开一个不存在的…

LNMP架构及应用部署

目录 简介 1、构建LNMP网站平台 1.1、安装MySQL数据库 (1)编译安装MySQL (2)优化调整 (3)初始化数据库 (4)启动mysql服务 1.2、安装PHP解析环境 (1&#xf…

【pytorch学习】 深度学习 教程 and 实战

pytorch编程实战博主:https://github.com/lucidrains https://github.com/lucidrains/vit-pytorch

K8S-环境部署

1 基础环境配置 主机名规划 序号主机ip主机名规划110.0.0.12kubernetes-master.sswang.com kubernetes-master210.0.0.15kubernetes-node1.sswang.com kubernetes-node1310.0.0.16kubernetes-node2.sswang.com kubernetes-node2410.0.0.17kubernetes-node3.sswang.com kubern…

【Java】设计模式之两阶段终止

两阶段终止 两阶段终止,即Two Phase Termination。是用来终止线程的套路。 它的思想是,如何在一个线程T1中优雅地终止线程T2?这里的【优雅】指的是给T2一个料理后事的机会。 错误思路: 使用stop方法。stop 方法会真正杀死线程…

uniapp上传文件时用到的api是什么?格式是什么?

在UniApp中,你可以使用uni.uploadFile()方法来上传文件。这是一个异步方法,用于将本地资源上传到服务器。 该方法的基本格式如下: uni.uploadFile({url: 上传接口地址,filePath: 要上传的文件路径,name: 后端接收的文件参数名,formData: {/…

58. 最后一个单词的长度(Java)

题目描述 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 输入: s “luffy is still joyboy” 输出: 6 解释&am…

[足式机器人]Part3 机构运动学与动力学分析与建模 Ch00-1 坐标系与概念基准

本文仅供学习使用,总结很多本现有讲述运动学或动力学书籍后的总结,从矢量的角度进行分析,方法比较传统,但更易理解,并且现有的看似抽象方法,两者本质上并无不同。 2024年底本人学位论文发表后方可摘抄 若有…

“华为杯“第十三届中国研究生数学建模竞赛-A题:关于跳台跳水体型系数设置的建模分析(续)

目录 5.4.1 问题分析与建模 5.4.2 计算与求解 5.5 结论 5.5.2 当空中存在两个动作时

双指针算法,python求解给定数组的三数之和问题

对于双指针算法,一般是用于解决对数组等数据结构进行遍历的问题的一种编程思路,其主要是使用两个指针共同配合工作,对数组等数据结构进行搜索并返回得到想要搜索的结果,针对给定问题,三数之和问题,这是一个…

Java集合框架深度解析:HashSet

Java集合框架是Java编程中不可或缺的一部分,提供了丰富的数据结构和算法,以支持各种场景下的数据存储和操作。在这个系列的深度解析中,我们将聚焦于其中之一的**HashSet**,深入了解它的实现原理、使用场景、可能遇到的问题以及并发…

Vue实现加减法验证码

引入Vue.js 在HTML文件的<head>标签中引入Vue.js的CDN链接&#xff1a; <script src"https://cdn.jsdelivr.net/npm/vue2.6.11/dist/vue.min.js"></script>创建Vue实例 接下来&#xff0c;我们要创建一个Vue实例&#xff0c;并将其挂载到HTML文…

HTTP一些状态码的记录

首先先理解一下什么是HTTP,HTTP&#xff08;超文本传输协议&#xff09;是一个简单的请求-响应协议&#xff0c;通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。 从100开始到500的一些状态码 一&#xff0c;1xx&#xff08;信息性状态…

特斯拉难挽倒退?比亚迪为中国汽车市场改写历史

对于电动汽车这个新兴产业&#xff0c;特斯拉长期以来一直处于领头羊的位置&#xff0c;近年来也面临诸多测试。去年底欧洲报道特斯拉在瑞典遭遇罢工冲击&#xff0c;运营陷入诸多困扰&#xff0c;实在出人意料。更让人讶异的是&#xff0c;年终宣布新王者比亚迪在全球销量首次…

图表分析网页模版 大数据可视化大屏电子沙盘合集

项目基于html/css/js&#xff0c;包含行业&#xff1a; 智慧政务 智慧社区 金融行业 智慧交通 智慧门店 智慧大厅 智慧物流 智慧医疗 通用模板 大数据分析平台 项目包含功能 (部分)&#xff1a; 实时数据K线图&#xff08;可自由配置多种行业模式&#xff09; 可切换式大屏展…