当前位置: 首页 > news >正文

Gin框架接入Prometheus,grafana辅助pprof检测内存泄露

prometheus与grafana的安装

grom接入Prometheus,grafana-CSDN博客

Prometheus 动态加载

我们想给Prometheus新增监听任务新增ginapp项目只需要在原来的配置文件下面新增ginapp相关metric

在docker compose文件下面新增

执行

docker-compose up -d 
curl -X POST http://localhost:9090/-/reload

granfa配置新的job

配置golang dashboard模版

配置之后我们看以在dashboard看到

Gin框架中间件配置

package initializationimport ("awesomeProject3/middware""awesomeProject3/router""github.com/Depado/ginprom""github.com/gin-gonic/gin"_ "net/http/pprof"
)func Routers() *gin.Engine {r := gin.New()r.Use(middware.GinRecovery(true), middware.GinZapLogger())r.Use(middware.Cors())router.InitOrderRouter(r)p := ginprom.New(ginprom.Engine(r),ginprom.Subsystem("gin"),)r.Use(p.Instrument())return r
}

pprof配置

package routerimport ("awesomeProject3/api""github.com/gin-gonic/gin""net/http""net/http/pprof"
)func InitOrderRouter(Router *gin.Engine) {Router.GET("/health", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"code":    http.StatusOK,"success": true,})})// 定义一个简单的GET路由Router.GET("/v1/ping", func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "pong",})})Router.GET("/test", api.TestHandler) //pprofGroup := Router.Group("/debug/pprof"){pprofGroup.GET("/", gin.WrapF(pprof.Index))pprofGroup.GET("/cmdline", gin.WrapF(pprof.Cmdline))pprofGroup.GET("/profile", gin.WrapF(pprof.Profile))pprofGroup.GET("/symbol", gin.WrapF(pprof.Symbol))pprofGroup.GET("/trace", gin.WrapF(pprof.Trace))pprofGroup.GET("/allocs", gin.WrapH(pprof.Handler("allocs")))pprofGroup.GET("/block", gin.WrapH(pprof.Handler("block")))pprofGroup.GET("/goroutine", gin.WrapH(pprof.Handler("goroutine")))pprofGroup.GET("/heap", gin.WrapH(pprof.Handler("heap")))pprofGroup.GET("/mutex", gin.WrapH(pprof.Handler("mutex")))pprofGroup.GET("/threadcreate", gin.WrapH(pprof.Handler("threadcreate")))}
}

模拟内存泄露

之前我们生产项目中出现过一次严重的内存泄露,例子如下图所示,该接口qps非常高

对当前接口压测

pprof监控

Grafana监控

我们看到goroutine数量已经爆表了,我的mac风扇开始转了

这个时候可以点击pprof groutine很好定位哪一块出现了内存泄露

结论

我们在使用golang 高并行处理下游任务的时候,一定要对下游基础设施要有敬畏之心,调用时限制goroutine的运行数量并且设置上context超时控制,做好超时熔断措施,做好监控警告,下游基础设施如果达到瓶颈,我们可对下游基础进行主从 水平扩容等。

http://www.lryc.cn/news/424228.html

相关文章:

  • 上海凯泉泵业入职测评北森题库题型分析、备考题库、高分攻略
  • Linux:基础IO
  • 奥运奖牌窥视
  • RUST实现远程操作电脑手机
  • spring01-spring容器启动过程分析
  • RAG与LLM原理及实践(12)--- Milvus RRFRanker的使用场景及源码分析
  • Nginx与Tomcat的区别
  • LeetCode 3151.特殊数组 I
  • 【产品那些事】The OX Active ASPM Platform
  • 欢迪迈手机商城设计与开发
  • Endnote与word关联 解决方案: COM加载项-----》CWYW插件安装
  • 用R语言运用 Shiny 包打造基于鸢尾花数据集的交互式数据可视化应用
  • Upload-Lab第3关:如何巧妙应对黑名单文件后缀检测?
  • SSLVPN对比IPSECVPN安全设备的起源、发展、以及目前行业使用场景
  • Hadoop大数据集群搭建
  • 【技术前沿】MetaGPT入门安装部署——用多个大语言模型解决任务!一键安装,只需填写OpenAI API
  • #compsoer基本使用01#
  • 基于c++的yolov5推理之前处理详解及代码(一)
  • Oracle(55)什么是并行查询(Parallel Query)?
  • 关于 Lora中 Chirp Spread Spectrum(CSS)调制解调、发射接收以及同步估计的分析
  • Java - API
  • 力扣 3152. 特殊数字Ⅱ
  • 识别和缓解软件安全威胁的最佳工具
  • Linux下的压缩与解压:掌握核心命令行工具
  • BGP选路实验
  • 白骑士的C#教学高级篇 3.3 网络编程
  • AI大模型赋能游戏:更智能、更个性化的NPC
  • pymysql的上下文管理器:简化数据库操作
  • AI秘境-墨小黑奇遇记 - 修炼成神经(二)
  • 计算机网络之分组交换时延的计算