59 lines
1.2 KiB
Go
59 lines
1.2 KiB
Go
package grpc
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"lendry-erp/media/pkg/logger"
|
|
|
|
"github.com/google/uuid"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/metadata"
|
|
)
|
|
|
|
// RequestLoggerInterceptor логирует время выполнения каждого gRPC запроса
|
|
func RequestLoggerInterceptor(
|
|
ctx context.Context,
|
|
req interface{},
|
|
info *grpc.UnaryServerInfo,
|
|
handler grpc.UnaryHandler,
|
|
) (interface{}, error) {
|
|
|
|
start := time.Now()
|
|
resp, err := handler(ctx, req)
|
|
|
|
status := "✅"
|
|
if err != nil {
|
|
status = "❌"
|
|
}
|
|
|
|
logger.Info("%s %s %v", status, info.FullMethod, time.Since(start))
|
|
return resp, err
|
|
}
|
|
|
|
// TraceIDInterceptor добавляет уникальный ID для отслеживания запроса
|
|
func TraceIDInterceptor(
|
|
ctx context.Context,
|
|
req interface{},
|
|
info *grpc.UnaryServerInfo,
|
|
handler grpc.UnaryHandler,
|
|
) (interface{}, error) {
|
|
md, ok := metadata.FromIncomingContext(ctx)
|
|
if !ok {
|
|
md = metadata.New(nil)
|
|
}
|
|
|
|
ids := md.Get("x-trace-id")
|
|
var traceID string
|
|
if len(ids) == 0 {
|
|
traceID = uuid.New().String()
|
|
md.Set("x-trace-id", traceID)
|
|
} else {
|
|
traceID = ids[0]
|
|
}
|
|
|
|
ctx = metadata.NewIncomingContext(ctx, md)
|
|
ctx = context.WithValue(ctx, "traceID", traceID)
|
|
|
|
return handler(ctx, req)
|
|
} |