Gin整合Prometheus监控

如何在Gin框架中整合Prometheus监控?目前想在自己的Gin项目中加入性能监控,但不太清楚具体该如何配置Prometheus客户端和Gin的中间件。主要遇到以下问题:

  1. 需要哪些依赖包,该如何引入?
  2. Gin的中间件应该如何编写才能暴露metrics接口?
  3. Prometheus的配置文件中该怎么设置才能正确抓取Gin应用的指标?
  4. 如何验证监控是否正常工作? 希望能得到具体的代码示例和配置说明,最好能涵盖常见的监控指标采集方式。
3 回复

要在Gin框架中整合Prometheus监控,首先需要引入github.com/prometheus/client_golang/prometheus/promhttp库。步骤如下:

  1. 引入依赖:
go get github.com/prometheus/client_golang/prometheus/promhttp
  1. 在Gin的路由中添加Prometheus的处理:
package main

import (
    "net/http"

    "github.com/gin-gonic/gin"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
    r := gin.Default()

    // 普通接口
    r.GET("/ping", func(c *gin.Context) {
        c.JSON(200, gin.H{
            "message": "pong",
        })
    })

    // Prometheus监控接口
    r.GET("/metrics", gin.WrapH(promhttp.Handler()))

    r.Run(":8080") // 监听并在 0.0.0.0:8080 上启动服务
}

这样,当你访问/metrics时,会返回Prometheus可抓取的监控数据。这些数据可以用来监控HTTP请求的延迟、数量等指标。


要整合Gin框架与Prometheus监控,首先需要引入github.com/prometheus/client_golang/prometheusgithub.com/gin-gonic/contrib/prometheus这两个库。

  1. 安装依赖:
go get github.com/prometheus/client_golang/prometheus
go get github.com/gin-gonic/contrib/prometheus
  1. 在Gin应用中使用Prometheus:
package main

import (
	"github.com/gin-contrib/prometheus"
	"github.com/gin-gonic/gin"
	"github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
	r := gin.Default()

	// 初始化Prometheus中间件
	p := prometheus.New()
	r.Use(p)

	// 默认路由处理
	r.GET("/", func(c *gin.Context) {
		c.JSON(200, gin.H{"message": "Hello World!"})
	})

	// Prometheus metrics路径
	r.GET("/metrics", gin.WrapH(promhttp.Handler()))

	r.Run(":8080")
}

这段代码为Gin框架添加了Prometheus监控支持。访问/metrics即可获取监控数据,方便集成到Prometheus服务器进行可视化分析。

Gin 整合 Prometheus 监控

在 Gin 框架中整合 Prometheus 监控可以通过以下步骤实现:

1. 安装必要的依赖

go get github.com/prometheus/client_golang/prometheus
go get github.com/prometheus/client_golang/prometheus/promhttp

2. 基本实现代码

package main

import (
	"github.com/gin-gonic/gin"
	"github.com/prometheus/client_golang/prometheus"
	"github.com/prometheus/client_golang/prometheus/promhttp"
	"net/http"
	"strconv"
	"time"
)

var (
	httpRequestsTotal = prometheus.NewCounterVec(
		prometheus.CounterOpts{
			Name: "http_requests_total",
			Help: "Total number of HTTP requests",
		},
		[]string{"method", "path", "status"},
	)

	httpRequestDuration = prometheus.NewHistogramVec(
		prometheus.HistogramOpts{
			Name:    "http_request_duration_seconds",
			Help:    "Duration of HTTP requests",
			Buckets: []float64{0.1, 0.3, 0.5, 1.0, 2.0, 5.0},
		},
		[]string{"method", "path"},
	)
)

func init() {
	prometheus.MustRegister(httpRequestsTotal)
	prometheus.MustRegister(httpRequestDuration)
}

func prometheusMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		start := time.Now()
		path := c.FullPath()

		c.Next()

		status := strconv.Itoa(c.Writer.Status())
		duration := time.Since(start).Seconds()

		httpRequestsTotal.WithLabelValues(c.Request.Method, path, status).Inc()
		httpRequestDuration.WithLabelValues(c.Request.Method, path).Observe(duration)
	}
}

func main() {
	r := gin.Default()

	// 应用Prometheus中间件
	r.Use(prometheusMiddleware())

	// Prometheus指标路由
	r.GET("/metrics", gin.WrapH(promhttp.Handler()))

	// 业务路由
	r.GET("/", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{"message": "Hello, Prometheus!"})
	})

	r.Run(":8080")
}

3. 配置Prometheus

在Prometheus配置文件中添加:

scrape_configs:
  - job_name: 'gin_app'
    static_configs:
      - targets: ['localhost:8080']

4. 监控指标说明

  • http_requests_total: 总请求数,按方法、路径和状态码分类
  • http_request_duration_seconds: 请求耗时分布

你可以根据需要添加更多自定义指标,如错误率、响应大小等。

回到顶部