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 initialization

import (
	"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 router

import (
	"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超时控制,做好超时熔断措施,做好监控警告,下游基础设施如果达到瓶颈,我们可对下游基础进行主从 水平扩容等。

相关推荐
Code季风9 小时前
Gin Web 层集成 Viper 配置文件和 Zap 日志文件指南(下)
前端·微服务·架构·go·gin
Code季风9 小时前
Gin Web 服务集成 Consul:从服务注册到服务发现实践指南(下)
java·前端·微服务·架构·go·gin·consul
ac.char1 天前
Golang读取ZIP压缩包并显示Gin静态html网站
golang·html·gin
zhuyasen2 天前
定义即代码!这个框架解决了90%的Go开发者还在低效开发项目的问题
架构·go·gin
码上淘金2 天前
【Prometheus 】通过 Pushgateway 上报指标数据
prometheus
程序员爱钓鱼2 天前
Go语言项目工程化 — 常见开发工具与 CI/CD 支持
开发语言·后端·golang·gin
Code季风3 天前
深入比较 Gin 与 Beego:Go Web 框架的两大选择
开发语言·golang·go·gin·beego
Code季风3 天前
Gin 中间件详解与实践
学习·中间件·golang·go·gin
博同学4 天前
Nginx + ELK + Grafana 全球访问热力图
nginx·elk·grafana
小诸葛的博客4 天前
gin如何返回html
前端·html·gin