如何使用gin作为服务器编写prometheus exporter metrics

How to use gin as a server to write prometheus exporter metrics

这是官方的prometheus golang-client示例:

package main

import (
    "log"
    "net/http"

    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

var cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{
        Name: "cpu_temperature_celsius",
        Help: "Current temperature of the CPU.",
    })


func init() {
    // Metrics have to be registered to be exposed:
    prometheus.MustRegister(cpuTemp)
}

func main() {
    cpuTemp.Set(65.3)

    // The Handler function provides a default handler to expose metrics
    // via an HTTP server. "/metrics" is the usual endpoint for that.
    http.Handle("/metrics", promhttp.Handler())
    log.Fatal(http.ListenAndServe(":8080", nil))
}

在此代码中,http 服务器使用 promhttp 库。

使用gin框架时如何修改metrics handler?我没有在 documentation.

中找到答案

我们只是利用 promhttp 处理程序。

package main

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

var cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{
    Name: "cpu_temperature_celsius",
    Help: "Current temperature of the CPU.",
})

func init() {
    prometheus.MustRegister(cpuTemp)
}

func prometheusHandler() gin.HandlerFunc {
    h := promhttp.Handler()

    return func(c *gin.Context) {
        h.ServeHTTP(c.Writer, c.Request)
    }
}

func main() {
    cpuTemp.Set(65.3)

    r := gin.New()

    r.GET("/", func(c *gin.Context) {
        c.JSON(200, "Hello world!")
    })

    r.GET("/metrics", prometheusHandler())

    r.Run()
}

或者我们总是可以切换到 Prometheus 中间件 - https://github.com/zsais/go-gin-prometheus

我正在将 prometheus 与其他库一起使用 https://github.com/Depado/ginprom:

package main

import (
    "github.com/Depado/ginprom"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()
    p := ginprom.New(
        ginprom.Engine(r),
        ginprom.Subsystem("gin"),
        ginprom.Path("/metrics"),
    )
    r.Use(p.Instrument())

    r.GET("/hello/:id", func(c *gin.Context) {})
    r.GET("/world/:id", func(c *gin.Context) {})
    r.Run("127.0.0.1:8080")
}

使用 gin 包装器

router.GET("/metrics", gin.WrapH(promhttp.Handler()))