forked from gsn/predictor
44 lines
1.1 KiB
Go
44 lines
1.1 KiB
Go
package middleware
|
|
|
|
import (
|
|
"time"
|
|
|
|
"git.intra.yksa.space/gsn/predictor/internal/pkg/errcodes"
|
|
"git.intra.yksa.space/gsn/predictor/internal/pkg/log"
|
|
"github.com/ogen-go/ogen/middleware"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
func Logging() middleware.Middleware {
|
|
return func(req middleware.Request, next func(req middleware.Request) (middleware.Response, error)) (middleware.Response, error) {
|
|
lg := log.Ctx(req.Context).With(
|
|
zap.String("operationId", req.OperationID),
|
|
)
|
|
|
|
lg.Info("started request")
|
|
|
|
req.Context = log.ToCtx(req.Context, lg)
|
|
|
|
start := time.Now()
|
|
resp, err := next(req)
|
|
dur := time.Since(start).Microseconds()
|
|
|
|
if err != nil {
|
|
if errcode, ok := err.(*errcodes.ErrorCode); ok {
|
|
lg.Error("request error",
|
|
zap.Int("status_code", errcode.StatusCode),
|
|
zap.String("message", errcode.Message),
|
|
zap.String("details", errcode.Details),
|
|
)
|
|
} else {
|
|
lg.Error("request internal error",
|
|
zap.Error(err),
|
|
)
|
|
}
|
|
}
|
|
|
|
lg.Info("done request", zap.Float64("duration_ms", float64(dur)/float64(1000)))
|
|
|
|
return resp, err
|
|
}
|
|
}
|