微服务追踪SQL(支持Isto管控下的gorm查询追踪)
效果图
SQL的追踪正确插入到微服务的调用链之间

详细记录了SQL的执行内容和消耗时间

搜索SQL的类型

多线程(goroutine)下的追踪效果

在 Kubernetes 中部署微服务后,通过 Istio 管控微服务之间的流量,Istio 默认会将微服务之间的调用关系生成追踪,放入追踪收集器。但他不支持更细化的SQL操作,比如执行了哪些SQL,每条SQL消耗多长时间。为此,我写了一个简单的支持gorm查询并生成追踪的插件:istio-gorm-tracing
微服务追踪 gorm 插件
在kubernetes上使用Istio管控微服务后,微服务之间的调用会自动上传到Jaeger的收集器。但只能追踪到服务层,这是我不能接受的,我希望能进一步追踪到服务中的所有MySQL查询,记录每个 sql 的耗时,所以,我简单写了这个插件。
特性
支持Istio
在Istio管控下的容器请求之间,会自动携带x-b3-traceid、x-b3-parentspanid、x-b3-spanid、x-b3-sampled等请求头,这些请求头都是与zipkin对齐的。此插件中会根据传递进来的请求头信息,自动解析出父span,并绑定上下服务之间的调用关系。
记录SQL信息
每次查询都会记录下执行的SQL语句以及执行耗时等信息,作为后期微服务追踪的依据。
使用
package main
import (
istiogormtracing "github.com/liamhao/istio-gorm-tracing"
"log"
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func main() {
router := gin.Default()
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local", "dbuser", "dbpswd", "dbhost", 3306, "dbname")
gormDb, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Println("mysql连接出现了问题:", err.Error())
} else {
log.Println("mysql连接成功:", dsn)
}
// 这一步很关键,一定要加上,为了启用我们的插件
gormDb.Use(istiogormtracing.NewDefault(
// 你的微服务名称
"istiogormtracing-service",
// 你的 Jaeger 收集器地址
"http://127.0.0.1:14268/api/traces",
))
router.GET("/", func(c *gin.Context) {
// 这一步很关键,一定要加上,为了SQL能与上下游服务做关联
istiogormtracing.H = c.Request.Header
list := []map[string]interface{}{}
gormDb.Table("users").Where("name = 'xiaoming'").Find(&list)
c.JSON(http.StatusOK, map[string]interface{}{
"istiogormtracing": "ok",
})
})
router.Run(":7000")
}
然后即可在Jaeger面板中看到我们记录的SQL了。
微服务追踪SQL(支持Isto管控下的gorm查询追踪)的更多相关文章
- 在微服务框架Demo.MicroServer中添加SkyWalking+SkyApm-dotnet分布式链路追踪系统
1.APM工具的选取 Apm监测工具很多,这里选用网上比较火的一款Skywalking. Skywalking是一个应用性能监控(APM)系统,Skywalking分为服务端Oap.管理界面UI.以及 ...
- 微服务网关从零搭建——(六)ocelot配置追踪功能
butterfly 准备工作 首先下载buterfly release版本 解压并通过命令启动:dotnet Butterfly.Web.dll --EnableHttpCollector=true ...
- go微服务框架Kratos笔记(三)引入GORM框架
介绍 GORM是一个使用Go语言编写的ORM框架.中文文档齐全,对开发者友好,支持主流数据库. GORM官方文档 安装 go get -u github.com/jinzhu/gorm 在kratos ...
- 微服务监控druid sql
参考该文档 保存druid的监控记录 把日志保存的关系数据数据库(mysql,oracle等) 或者nosql数据库(redis,芒果db等) 保存的时候可以增加微服务名称标识好知道是哪个微服务的sq ...
- 【星云测试】Devops微服务架构下具有代码级穿透能力的精准测试
微服务是Devops场景下热门的开发框架,在大型项目中被广泛采用.它把一个大型的单个应用程序和服务拆分为数十个的支持微服务,独立部署.互相隔离,通过扩展组件来处理功能瓶颈问题,比传统的应用程序更能有效 ...
- .NET Core微服务之基于Ocelot+Butterfly实现分布式追踪
Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.什么是Tracing? 微服务的特点决定了功能模块的部署是分布式的,以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错 ...
- 第三代微服务架构:基于 Go 的博客微服务实战案例,支持分布式事务
这是一个可一键部署在 Kubernetes-Istio 集群中的,基于 Golang 的博客微服务 Demo,支持分布式事务. 项目地址:https://github.com/jxlwqq/blog- ...
- SpringCloud微服务(07):Zipkin组件,实现请求链路追踪
本文源码:GitHub·点这里 || GitEE·点这里 一.链路追踪简介 1.Sleuth组件简介 Sleuth是SpringCloud微服务系统中的一个组件,实现了链路追踪解决方案.可以定位一个请 ...
- 多云架构下,JAVA微服务技术选型实例解析
[摘要] 本文介绍了基于开源自建和适配云厂商开发框架两种构建多云架构的思路,以及这些思路的优缺点. 微服务生态 微服务生态本质上是一种微服务架构模式的实现,包括微服务开发SDK,以及微服务基础设施. ...
随机推荐
- Java第十周作业
1.编写一个方法,实现冒泡排序(由小到大),并调用该方法 package gc; public class gc { /** * @param args */ public static void m ...
- SpringAOP的源码解析
一.SpringAOP的概念 一.AOP的基本概念 1.连接点(Joinpoint):可以被增强的方法. 2.切点(Pointcut):实际被增强的方法. 3.通知(Advice)(增强): 3.1. ...
- python-django搭建页面步骤
一.配置环境1.file>>New project 创建文件名,配置python.exe执行路径2.setting.py配置①建立static文件夹,最后一行添加STATICFILES_D ...
- 1.1 Qt Creater使用Python开发桌面软件的操作流程
Qt Creater及Python的下载与安装过程不再赘述,读者可自行在网上搜索相应的下载与安装方法. 首先我们打开Qt Creater,单击"Create Project"按钮或 ...
- TCP 连接的建立 & 断开
TCP 连接的建立过程 一开始,客户端和服务端都处于 close 状态. 先是服务端监听某个端口,此时服务端处于 listen 状态. 这个时候客户端就可以发送连接请求报文了. 第一次握手 客户端会主 ...
- Linux-ls-cp-tr-命令拓展及通配符
显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录 [11:23:02 root@centos8 ~]#ls -d /etc/[^[:alpha:]][[:alph ...
- 从 Notion 分片 Postgres 中吸取的教训(Notion 工程团队)
https://www.notion.so/blog/sharding-postgres-at-notion 今年(2021)早些时候,我们对 Notion 进行了五分钟的定期维护. 虽然我们的声明指 ...
- 关于win10安装wsl子系统Ubuntu图形界面的错误解决
解决了https://blog.csdn.net/weixin_30834783/article/details/102144314Xserver个人使用的是VcXsrv. 在WSL中配置环境变量DI ...
- Java泛型类型擦除问题
以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List 和 List 在编译成字 ...
- unity---脚本代码报错
同版本编辑器在不同VS版本下会报错问题解决 解决方法 报错情况 解决方法 打开Unity --->Preferences--->External Tools然后点击:Regenerate ...