2022-09-07 23:34:37 +08:00
|
|
|
package metrics
|
|
|
|
|
|
|
|
import (
|
2023-07-14 21:47:11 +08:00
|
|
|
"git.0x7f.app/WOJ/woj-server/internal/e"
|
|
|
|
"git.0x7f.app/WOJ/woj-server/pkg/utils"
|
2022-09-07 23:34:37 +08:00
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
"net/http"
|
|
|
|
"strings"
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
func (m *Metrics) SetLogPaths(paths []string) {
|
|
|
|
m.logPaths = paths
|
|
|
|
}
|
|
|
|
|
|
|
|
func (m *Metrics) Handler() gin.HandlerFunc {
|
|
|
|
return func(c *gin.Context) {
|
|
|
|
url := c.Request.URL.String()
|
|
|
|
method := c.Request.Method
|
|
|
|
|
|
|
|
if !utils.Contains(m.logPaths, func(path string) bool { return strings.HasPrefix(url, path) }) {
|
|
|
|
c.Next()
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
start := time.Now()
|
|
|
|
c.Next()
|
|
|
|
elapsed := float64(time.Since(start)) / float64(time.Millisecond)
|
|
|
|
|
|
|
|
status := c.Writer.Status()
|
|
|
|
success := !c.IsAborted() && (status == http.StatusOK)
|
|
|
|
errCode, _ := c.Get("err")
|
2022-09-20 14:15:21 +08:00
|
|
|
err, ok := errCode.(e.Status)
|
2022-09-07 23:34:37 +08:00
|
|
|
if !ok {
|
|
|
|
success = false
|
2022-09-17 09:23:36 +08:00
|
|
|
err = e.Unknown
|
2022-09-26 17:15:31 +08:00
|
|
|
} else if err != e.Success {
|
|
|
|
success = false
|
2022-09-07 23:34:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
m.Record(method, url, success, status, err, elapsed)
|
|
|
|
}
|
|
|
|
}
|