k8sgpt/pkg/server/log.go
Alex Jones 02fa109429
feat: refactoring to the new schema (#1219)
* feat: refactoring to the new schema

Signed-off-by: AlexsJones <alexsimonjones@gmail.com>

* chore: updated readme with grpc commands

Signed-off-by: AlexsJones <alexsimonjones@gmail.com>

* chore: updated deps

Signed-off-by: AlexsJones <alexsimonjones@gmail.com>

---------

Signed-off-by: AlexsJones <alexsimonjones@gmail.com>
Co-authored-by: Matthis <matthish29@gmail.com>
2024-08-15 14:42:55 +01:00

53 lines
1.3 KiB
Go

package server
import (
"context"
"fmt"
"time"
"go.uber.org/zap"
"google.golang.org/grpc"
"google.golang.org/grpc/peer"
"google.golang.org/grpc/status"
)
func LogInterceptor(logger *zap.Logger) grpc.UnaryServerInterceptor {
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
start := time.Now()
// Call the handler to execute the gRPC request
response, err := handler(ctx, req)
duration := time.Since(start).Milliseconds()
fields := []zap.Field{
zap.Int64("duration_ms", duration),
zap.String("method", info.FullMethod),
zap.Any("request", req),
}
// Get the remote address from the context
peer, ok := peer.FromContext(ctx)
if ok {
fields = append(fields, zap.String("remote_addr", peer.Addr.String()))
}
if err != nil {
fields = append(fields, zap.Int32("status_code", int32(status.Code(err))))
}
message := "request completed"
if err != nil {
message = fmt.Sprintf("request failed. %s", err.Error())
}
logRequest(logger, fields, int(status.Code(err)), message)
return response, err
}
}
func logRequest(logger *zap.Logger, fields []zap.Field, statusCode int, message string) {
if statusCode >= 400 {
logger.Error(message, fields...)
} else {
logger.Info(message, fields...)
}
}