Skip to content

Commit

Permalink
recover request body before dumping request in error logger
Browse files Browse the repository at this point in the history
  • Loading branch information
kdivanov committed Sep 26, 2024
1 parent 954ccbe commit db77d25
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 10 deletions.
4 changes: 0 additions & 4 deletions recovery.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package hitrix

import (
"bytes"
"io"
"net/http"

"github.com/gin-gonic/gin"
Expand All @@ -15,8 +13,6 @@ func recovery() gin.HandlerFunc {
defer func() {
if r := recover(); r != nil {
c.Status(http.StatusInternalServerError)
c.Request.Body = io.NopCloser(
bytes.NewReader(c.Request.Context().Value(service.RequestBodyKey).([]byte)))

service.DI().ErrorLogger().LogPanicWithRequest(c, r)
}
Expand Down
29 changes: 23 additions & 6 deletions service/component/error_logger/error_logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package errorlogger

import (
"bytes"
"io"

//nolint //G501: Blocklisted import crypto/md5: weak cryptographic primitive
"crypto/md5"
"encoding/hex"
Expand Down Expand Up @@ -49,14 +51,27 @@ type ErrorMessage struct {
}

type RedisErrorLogger struct {
redisStorage *beeorm.RedisCache
sentryService sentry.ISentry
slackService slack.Slack
appService *app.App
redisStorage *beeorm.RedisCache
sentryService sentry.ISentry
slackService slack.Slack
appService *app.App
requestBodyKey interface{}
}

func NewRedisErrorLogger(appService *app.App, ormService *beeorm.Engine, slackService slack.Slack, sentryService sentry.ISentry) ErrorLogger {
return &RedisErrorLogger{redisStorage: ormService.GetRedis(), slackService: slackService, appService: appService, sentryService: sentryService}
func NewRedisErrorLogger(
appService *app.App,
ormService *beeorm.Engine,
slackService slack.Slack,
sentryService sentry.ISentry,
requestBodyKey interface{},
) ErrorLogger {
return &RedisErrorLogger{
redisStorage: ormService.GetRedis(),
slackService: slackService,
appService: appService,
sentryService: sentryService,
requestBodyKey: requestBodyKey,
}
}

func (e *RedisErrorLogger) LogError(errData interface{}) {
Expand Down Expand Up @@ -99,6 +114,8 @@ func (e *RedisErrorLogger) log(errData interface{}, callerSkip int, c *gin.Conte
}

if c != nil {
c.Request.Body = io.NopCloser(bytes.NewReader(c.Request.Context().Value(e.requestBodyKey).([]byte)))

requestID, has := c.Get(requestlogger.ID)
if has {
value.Request = []byte("X-Request-ID: " + fmt.Sprint(requestID) + "\n\n")
Expand Down
1 change: 1 addition & 0 deletions service/registry/error_logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ func ServiceProviderErrorLogger() *service.DefinitionGlobal {
ctn.Get(service.ORMEngineGlobalService).(*beeorm.Engine),
slackAPIService,
sentryService,
service.RequestBodyKey,
), nil
},
}
Expand Down

0 comments on commit db77d25

Please sign in to comment.