gorm 集成opentelemetry

服务端代码:

package mainimport ("GoStart/telemetry/ch03/server/model""github.com/gin-gonic/gin""go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin""go.opentelemetry.io/otel""go.opentelemetry.io/otel/attribute""go.opentelemetry.io/otel/exporters/jaeger""go.opentelemetry.io/otel/propagation""go.opentelemetry.io/otel/sdk/resource""go.opentelemetry.io/otel/sdk/trace"semconv "go.opentelemetry.io/otel/semconv/v1.12.0""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/logger""gorm.io/gorm/schema""gorm.io/plugin/opentelemetry/tracing""log""os""time"
)var tp *trace.TracerProviderconst (TRACE_NAME = "mxshop-otel"
)func tracerProvider() error {url := "http://192.168.66.130:14268/api/traces"jexp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))if err != nil {panic(err)}tp = trace.NewTracerProvider(trace.WithBatcher(jexp),trace.WithResource(resource.NewWithAttributes(semconv.SchemaURL,semconv.ServiceNameKey.String("mxshop-user"),attribute.String("environment", "dev"),attribute.Int("ID", 1),),),)otel.SetTracerProvider(tp)otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))return nil
}
func Server(c *gin.Context) {dsn := "root:123456@tcp(127.0.0.1:3306)/mxshop_user_srv?charset=utf8mb4&parseTime=True&loc=Local"newLogger := logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), // io writerlogger.Config{LogLevel: logger.Info, // Log levelColorful: true,        // Disable color},)db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{NamingStrategy: schema.NamingStrategy{SingularTable: true,},Logger: newLogger,})if err != nil {panic(err)}if err := db.Use(tracing.NewPlugin()); err != nil {panic(err)}if err := db.WithContext(c.Request.Context()).Model(model.User{}).Where("id = ?", 1).First(&model.User{}).Error; err != nil {panic(err)}time.Sleep(500 * time.Millisecond)//span.End()c.JSON(200, gin.H{})
}func main() {_ = tracerProvider()r := gin.Default()r.Use(otelgin.Middleware("my-server"))r.GET("/", func(c *gin.Context) {})r.GET("/server", Server)r.Run(":8090")
}

客户端代码:

package mainimport ("context""encoding/json""fmt""github.com/valyala/fasthttp""go.opentelemetry.io/otel""go.opentelemetry.io/otel/attribute""go.opentelemetry.io/otel/exporters/jaeger""go.opentelemetry.io/otel/propagation""go.opentelemetry.io/otel/sdk/resource""go.opentelemetry.io/otel/sdk/trace"semconv "go.opentelemetry.io/otel/semconv/v1.12.0""sync""time"
)const (TRACE_NAME = "mxshop-otel"
)var tp *trace.TracerProviderfunc tracerProvider() error {url := "http://192.168.66.130:14268/api/traces"jexp, err := jaeger.New(jaeger.WithCollectorEndpoint(jaeger.WithEndpoint(url)))if err != nil {panic(err)}tp = trace.NewTracerProvider(trace.WithBatcher(jexp),trace.WithResource(resource.NewWithAttributes(semconv.SchemaURL,semconv.ServiceNameKey.String("mxshop-user"),attribute.String("environment", "dev"),attribute.Int("ID", 1),),),)otel.SetTracerProvider(tp)otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))return nil
}func funcA(ctx context.Context, wg *sync.WaitGroup) {defer wg.Done()tr := otel.Tracer(TRACE_NAME)_, span := tr.Start(ctx, "func-a")span.SetAttributes(attribute.String("name", "funA"))type _LogStruct struct {CurrentTime time.Time `json:"current_time"`PassWho     string    `json:"pass_who"`Name        string    `json:"name"`}logTest := _LogStruct{CurrentTime: time.Now(),PassWho:     "bobby",Name:        "func-a",}b, _ := json.Marshal(logTest)span.SetAttributes(attribute.Key("这是测试日志的key").String(string(b)))time.Sleep(time.Second)span.End()
}func funcB(ctx context.Context, wg *sync.WaitGroup) {defer wg.Done()tr := otel.Tracer("traceName")spanCtx, span := tr.Start(ctx, "func-b")fmt.Println("trace:", span.SpanContext().TraceID(), span.SpanContext().SpanID())time.Sleep(time.Second)req := fasthttp.AcquireRequest()req.SetRequestURI("http://192.168.0.4:8090/server")req.Header.SetMethod("GET")//拿起传播器p := otel.GetTextMapPropagator()//包裹headers := make(map[string]string)p.Inject(spanCtx, propagation.MapCarrier(headers))for key, value := range headers {req.Header.Set(key, value)}//req.Header.Set("trace-id", span.SpanContext().TraceID().String())//req.Header.Set("span-id", span.SpanContext().SpanID().String())fclient := fasthttp.Client{}fres := fasthttp.Response{}_ = fclient.Do(req, &fres)span.End()
}func main() {_ = tracerProvider()ctx, cancel := context.WithCancel(context.Background())defer func(ctx context.Context) {ctx, cancel = context.WithTimeout(ctx, time.Second*5)defer cancel()if err := tp.Shutdown(ctx); err != nil {panic(err)}}(ctx)tr := otel.Tracer(TRACE_NAME)spanCtx, span := tr.Start(ctx, "func-main")wg := &sync.WaitGroup{}wg.Add(2)go funcA(spanCtx, wg)go funcB(spanCtx, wg)span.AddEvent("this is an event")time.Sleep(time.Second)wg.Wait()span.End()
}

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

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

相关文章

【Linux】23、内存超详细介绍

文章目录 零、资料一、内存映射1.1 TLB1.2 多级页表1.3 大页 二、虚拟内存空间分布2.1 用户空间的段2.2 内存分配和回收2.2.1 小对象2.2.2 释放 三、查看内存使用情况3.1 Buffer 和 Cache3.1.1 proc 文件系统3.1.2 案例3.1.2.1 场景 1:磁盘和文件写案例3.1.2.2 场景…

【数据结构】顺序表---C语言版

【数据结构】顺序表 前言:一、线性表二、顺序表1.顺序表的概念及结构:2.顺序表的分类:3.顺序表缺陷: 三、顺序表的代码实现:1.头文件:2.函数文件:3.测试文件: 四、顺序表的相关OJ题&…

怎么给数据库某个字段建立一个前缀索引

说明:SQL调优中重要的一个环节是建立索引,其中有一条是字段值过长字段应该建立前缀索引,即根据字段值的前几位建立索引,像数据库中的密码字段、UUID字段。 因为其随机性,其实根据前几位就可以锁定某一条记录了。前缀索…

(附源码)SSM+成都大学体育场馆预约系统 计算机毕设37087

摘 要 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存…

Vatee万腾的数字探险之旅:vatee科技创新的新纪元

在数字时代的潮流中,Vatee万腾以其独特的数字探险之旅引领着科技创新的新纪元。这不仅是一次技术的进步,更是一场数字领域的探险,让我们一同探索Vatee在科技创新中的前沿地带。 Vatee万腾的数字探险起源于对未知的渴望和对创新的不懈追求。在…

【PUSDN】WebStorm中报错Switch language version to React JSX

简述 WebStorm中报错Switch language version to React JSX 可能本页面的写法是其他语法。所以可以不用管。 测试项目:ant design vue pro 前情提示 系统: 一说 同步更新最新版、完整版请移步PUSDN Powered By PUSDN - 平行宇宙软件开发者网www.pusdn…

《opencv实用探索·三》opencv Mat与数组互转

1、利用Mat来存储数据&#xff0c;避免使用数组等操作 //创建一个两行一列的矩阵cv::Mat mean (cv::Mat_<float>(2, 1) << 0.77, 0.33);std::cout() << mean << std::endl;float a mean.at<float>(0, 0); //0.77float b mean.at<float&…

使用vscode中编写c语言——无法打开 源 文件 “stdlib.h“C/C++(1696)问题

出现这个问题原因如下&#xff1a; 1、没有下载编辑器或者是没有配置好该编辑器的环境变量。 可以通过如下方法检查是否安装并配置好编辑器&#xff1a;打开终端&#xff1a;按winR cmd&#xff0c;然后输入gcc-v&#xff0c;查看是否有mingw64编辑器&#xff0c;如下图是已经…

python15日

作业1&#xff1a; # 某个人进入如下一个棋盘中&#xff0c;要求从左上角开始走&#xff0c;# 最后从右下角出来&#xff08;要求只能前进&#xff0c;不能后退&#xff09;&#xff0c;# 问题&#xff1a;共有多少种走法&#xff1f; # 0 0 0 0 0 0 0 0# 0 0 0 0 0 …

Hikari数据源配置

核心配置类 import javax.sql.DataSource;import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.spri…

TUP通信——与多个客户端同时通信

一&#xff0c;概括&#xff1a;可以通过多线程思想每加一个客户端由线程池中的主线程交给一个子线程管理 二&#xff0c;案例 &#xff08;1&#xff09;&#xff0c;线程池 &#xff08;2&#xff09;&#xff0c;服务端 &#xff08;3&#xff09;&#xff0c;客户端

【Qt】QStackedWidget、QRadioButton、QPushButton及布局实现程序首页自动展示功能

效果 在程序启动后&#xff0c;有时不会进入到工作页面&#xff0c;会进入到产品展示页面。 动画如下&#xff1a; 首页展示 页面操作 当不点击时&#xff0c;一秒自动刷新一次&#xff1b;当点击时&#xff0c;会自动跳转到对应页面&#xff1b;点击上一页、下一页、及跳转页…

自定义中间件

1.使用 app.use0来定义全局生效的中间件 // 导入 express 模块 const express require(express) // 创建 express的服务器实例 const app express() app.use(function(req, res, next) {// 中间件的业务逻辑 }) 2.监听 req 的 data 事件 在中间件中&#xff0c;需要监听 re…

03、K-means聚类实现步骤与基于K-means聚类的图像压缩

03、K-means聚类实现步骤与基于K-means聚类的图像压缩&#xff08;1&#xff09; K-means聚类实现步骤 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。对这个手写数字实部比较感兴趣&#xff0c;作为入门的素材非常合适。…

理解Android无埋点技术

首先什么是无埋点呢&#xff0c;其实所谓无埋点就是开发者无需再对追踪点进行埋码&#xff0c;而是脱离代码&#xff0c;只需面对应用界面圈圈点点即可追加随时生效的事件数据点。 无埋点的好处 其实无埋点并不是完全不用写代码&#xff0c;而是尽可能的少写代码。开发者将SDK集…

英伟达GPU型号与架构介绍

1、AI驱动下&#xff0c;英伟达数据中心业务蓬勃发展 英伟达是GPU的发明创造者。1999年&#xff0c;英伟达在纳斯达克挂牌上市&#xff0c;并于同年提出了GPU概念&#xff0c;发布了GeForce 256。这被业界视为现代计算机图形技术的开端。 最初&#xff0c;GPU主要应用于PC游戏…

python的Re模块学习

本文初步介绍 正则表达式的定义&#xff0c;分类的组成部分。并举例编码 一、什么是正则表达式 答&#xff1a;在unix系统中&#xff0c;用来表示规则的字符串。在开发语言中需要处理大量的字符串&#xff0c;引入了这个规则。 字符串的处理&#xff1a; 1. 过滤字符串&…

力扣101. 对称二叉树

递归 思路&#xff1a; 克隆这棵树&#xff0c;递归比较左右子树互为镜像&#xff1b;终止条件为&#xff1a; 都为nullptr&#xff0c;则返回 true&#xff1b;有一个为 nullptr&#xff0c;则返回 false&#xff1b;&#xff08;形状不一致&#xff09;形状一致情况下&#…

零基础学编程轻松学编程,分享一款中文编程工具,编程构件简介

零基础学编程轻松学编程&#xff0c;分享一款中文编程工具&#xff0c;编程构件简介 中文编程开发语言工具编辑区界面截图如上图。 给大家分享一款中文编程工具 零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#…

数据库应用:Ubuntu 20.04 安装MongoDB

目录 一、理论 1.MongoDB 二、实验 1.Ubuntu 20.04 安装MongoDB 三、问题 1.Ubuntu Linux的apt 包管理器更新安装软件报错 2.Ubuntu20.04安装vim报错 3.Ubuntu20.04如何更换阿里源 4.Ubuntu22.04如何更换阿里源 一、理论 1.MongoDB &#xff08;1&#xff09;概念 …