Fix log levels + Minimise 500s

This commit is contained in:
rxdn 2023-09-10 17:13:50 +01:00
parent 644dcf0f3b
commit 6c41295476
4 changed files with 41 additions and 16 deletions

View File

@ -1,6 +1,7 @@
package api package api
import ( import (
"errors"
"github.com/TicketsBot/GoPanel/botcontext" "github.com/TicketsBot/GoPanel/botcontext"
"github.com/TicketsBot/GoPanel/database" "github.com/TicketsBot/GoPanel/database"
"github.com/TicketsBot/GoPanel/rpc" "github.com/TicketsBot/GoPanel/rpc"
@ -8,6 +9,7 @@ import (
"github.com/TicketsBot/common/premium" "github.com/TicketsBot/common/premium"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/rxdn/gdl/rest" "github.com/rxdn/gdl/rest"
"github.com/rxdn/gdl/rest/request"
"strconv" "strconv"
) )
@ -64,8 +66,11 @@ func DeletePanel(ctx *gin.Context) {
} }
if err := rest.DeleteMessage(botContext.Token, botContext.RateLimiter, panel.ChannelId, panel.MessageId); err != nil { if err := rest.DeleteMessage(botContext.Token, botContext.RateLimiter, panel.ChannelId, panel.MessageId); err != nil {
ctx.JSON(500, utils.ErrorJson(err)) var unwrapped request.RestError
return if !errors.As(err, &unwrapped) || unwrapped.StatusCode != 404 {
ctx.JSON(500, utils.ErrorJson(err))
return
}
} }
// Get premium tier // Get premium tier

View File

@ -9,19 +9,44 @@ import (
"strconv" "strconv"
) )
func Logging(minLevel sentry.Level) gin.HandlerFunc { type Level uint8
const (
LevelDebug Level = iota
LevelInfo
LevelWarning
LevelError
LevelFatal
)
func (l Level) sentryLevel() sentry.Level {
switch l {
case LevelDebug:
return sentry.LevelDebug
case LevelInfo:
return sentry.LevelInfo
case LevelWarning:
return sentry.LevelWarning
case LevelError:
return sentry.LevelError
case LevelFatal:
return sentry.LevelFatal
default:
return sentry.LevelDebug
}
}
func Logging(minLevel Level) gin.HandlerFunc {
return func(ctx *gin.Context) { return func(ctx *gin.Context) {
ctx.Next() ctx.Next()
statusCode := ctx.Writer.Status() statusCode := ctx.Writer.Status()
var level sentry.Level level := LevelInfo
if statusCode >= 500 { if statusCode >= 500 {
level = sentry.LevelError level = LevelError
} else if statusCode >= 400 { } else if statusCode >= 400 {
level = sentry.LevelWarning level = LevelWarning
} else {
level = sentry.LevelInfo
} }
if level < minLevel { if level < minLevel {
@ -49,7 +74,7 @@ func Logging(minLevel sentry.Level) gin.HandlerFunc {
"response": string(responseBody), "response": string(responseBody),
"stacktrace": string(debug.Stack()), "stacktrace": string(debug.Stack()),
}, },
Level: level, Level: level.sentryLevel(),
Message: fmt.Sprintf("HTTP %d on %s %s", statusCode, ctx.Request.Method, ctx.FullPath()), Message: fmt.Sprintf("HTTP %d on %s %s", statusCode, ctx.Request.Method, ctx.FullPath()),
Tags: map[string]string{ Tags: map[string]string{
"status_code": strconv.Itoa(statusCode), "status_code": strconv.Itoa(statusCode),

View File

@ -4,7 +4,6 @@ import (
"fmt" "fmt"
"github.com/TicketsBot/GoPanel/redis" "github.com/TicketsBot/GoPanel/redis"
"github.com/TicketsBot/GoPanel/utils" "github.com/TicketsBot/GoPanel/utils"
"github.com/getsentry/sentry-go"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/go-redis/redis_rate/v9" "github.com/go-redis/redis_rate/v9"
"hash/fnv" "hash/fnv"
@ -39,7 +38,7 @@ func CreateRateLimiter(rlType RateLimitType, max int, period time.Duration) gin.
res, err := limiter.Allow(redis.DefaultContext(), name, limit) res, err := limiter.Allow(redis.DefaultContext(), name, limit)
if err != nil { if err != nil {
ctx.AbortWithStatusJSON(500, utils.ErrorJson(err)) ctx.AbortWithStatusJSON(500, utils.ErrorJson(err))
Logging(sentry.LevelError)(ctx) Logging(LevelError)(ctx)
return return
} }
@ -60,7 +59,6 @@ func CreateRateLimiter(rlType RateLimitType, max int, period time.Duration) gin.
if res.Allowed <= 0 { if res.Allowed <= 0 {
ctx.AbortWithStatusJSON(429, utils.ErrorStr("You are being ratelimited")) ctx.AbortWithStatusJSON(429, utils.ErrorStr("You are being ratelimited"))
Logging(sentry.LevelWarning)(ctx)
return return
} }

View File

@ -19,7 +19,6 @@ import (
"github.com/TicketsBot/GoPanel/app/http/session" "github.com/TicketsBot/GoPanel/app/http/session"
"github.com/TicketsBot/GoPanel/config" "github.com/TicketsBot/GoPanel/config"
"github.com/TicketsBot/common/permission" "github.com/TicketsBot/common/permission"
"github.com/getsentry/sentry-go"
sentrygin "github.com/getsentry/sentry-go/gin" sentrygin "github.com/getsentry/sentry-go/gin"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/penglongli/gin-metrics/ginmetrics" "github.com/penglongli/gin-metrics/ginmetrics"
@ -42,7 +41,7 @@ func StartServer() {
router.Use(gin.Recovery()) router.Use(gin.Recovery())
router.Use(middleware.MultiReadBody, middleware.ReadResponse) router.Use(middleware.MultiReadBody, middleware.ReadResponse)
router.Use(middleware.Logging(sentry.LevelError)) router.Use(middleware.Logging(middleware.LevelError))
router.Use(sentrygin.New(sentrygin.Options{})) // Defaults are ok router.Use(sentrygin.New(sentrygin.Options{})) // Defaults are ok
router.Use(rl(middleware.RateLimitTypeIp, 60, time.Minute)) router.Use(rl(middleware.RateLimitTypeIp, 60, time.Minute))
@ -108,7 +107,6 @@ func StartServer() {
rl(middleware.RateLimitTypeGuild, 10, time.Second*30), rl(middleware.RateLimitTypeGuild, 10, time.Second*30),
rl(middleware.RateLimitTypeGuild, 75, time.Minute*30), rl(middleware.RateLimitTypeGuild, 75, time.Minute*30),
api.SearchMembers, api.SearchMembers,
middleware.Logging(sentry.LevelError), // TODO: Remove?
) )
// Must be readable to load transcripts page // Must be readable to load transcripts page
@ -148,7 +146,6 @@ func StartServer() {
rl(middleware.RateLimitTypeUser, 5, 5*time.Second), rl(middleware.RateLimitTypeUser, 5, 5*time.Second),
rl(middleware.RateLimitTypeUser, 20, time.Minute), rl(middleware.RateLimitTypeUser, 20, time.Minute),
api_transcripts.ListTranscripts, api_transcripts.ListTranscripts,
middleware.Logging(sentry.LevelError), // TODO: Remove?
) )
// Allow regular users to get their own transcripts, make sure you check perms inside // Allow regular users to get their own transcripts, make sure you check perms inside