Contents

Simple-Gin

Contents

Simple Gin

package main

import (
        "fmt"
        "log/slog"
        "net/http"
        "time"

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

type msg struct {
        Count int64 `json:"count"`
}

var pingCounter = prometheus.NewCounter(
        prometheus.CounterOpts{
                Name: "ping_request_count",
                Help: "No of request handled by Ping handler",
        },
)
var httpReqs = prometheus.NewCounterVec(
        prometheus.CounterOpts{
                Name: "http_requests_total",
                Help: "How many HTTP requests processed, partitioned by status code and HTTP method.",
        },
        []string{"code", "method"},
)

func PromHandler(handler http.Handler) gin.HandlerFunc {
        return func(c *gin.Context) {
                handler.ServeHTTP(c.Writer, c.Request)
        }
}

func main() {

        prometheus.MustRegister(pingCounter)
        prometheus.MustRegister(httpReqs)
        gin.SetMode(gin.ReleaseMode)
        // router := gin.New()
        router := gin.Default()
        router.GET("/ping", func(c *gin.Context) {
                httpReqs.WithLabelValues("404", "POST").Add(42)
                c.JSON(200, gin.H{
                        "message": "pong",
                })
        })
        router.GET("/metrics", PromHandler(promhttp.Handler()))
        router.POST("/msg", func(c *gin.Context) {
                d := &msg{}
                pingCounter.Inc()
                httpReqs.WithLabelValues("200", "GET").Add(55)
                err := c.ShouldBind(d)
                if err != nil {
                        c.JSON(200, gin.H{
                                "message": "err",
                        })
                } else {
                        ch := make(chan int, 3)
                        go func() {
                                for i := 0; i < int(d.Count); i++ {
                                        time.Sleep(time.Millisecond * 300)
                                        ch <- i
                                        fmt.Println(len(ch))
                                }
                                close(ch)
                        }()
                        for v := range ch {
                                slog.Info("ch", "data", v)
                                time.Sleep(time.Millisecond * 300)
                        }
                        c.JSON(200, gin.H{
                                "message": "dddd",
                        })
                        // panic("ssss")
                }

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