From a3987fb5a7b71e91a241e91966b55cde168bcb65 Mon Sep 17 00:00:00 2001 From: Pedro Correa Date: Thu, 10 Jul 2025 21:15:04 -0300 Subject: [PATCH] :sparkles: improved logs for request --- cmd/app/main.go | 5 ++--- internal/providers/provider.go | 20 ++++++++++---------- internal/providers/provider_test.go | 9 +++------ internal/service/payment_service.go | 5 +---- internal/web/handler/payments_handler.go | 20 ++++++++++++-------- internal/web/server.go | 4 ++-- mocks/braintree.yml | 2 +- mocks/stripe.yml | 2 +- 8 files changed, 32 insertions(+), 35 deletions(-) diff --git a/cmd/app/main.go b/cmd/app/main.go index 78cffa9..05236d6 100644 --- a/cmd/app/main.go +++ b/cmd/app/main.go @@ -24,16 +24,15 @@ func main() { logger, _ := zap.NewDevelopment() defer logger.Sync() - sugar := logger.Sugar() providers := providers.NewUseProviders([]providers.Provider{ providers.NewBraintreeProvider(getEnv("BRAINTREE_URL", "http://localhost:8001")), providers.NewStripeProvider(getEnv("STRIPE_URL", "http://localhost:8002")), - }, sugar) + }, logger) paymentsService := service.NewPaymentService(providers) port := getEnv("PORT", "8000") - server := web.NewServer(paymentsService, port, sugar) + server := web.NewServer(paymentsService, port, logger) server.ConfigureRouter() srvErr := make(chan error, 1) diff --git a/internal/providers/provider.go b/internal/providers/provider.go index 073e5aa..4c102e7 100644 --- a/internal/providers/provider.go +++ b/internal/providers/provider.go @@ -9,7 +9,7 @@ import ( "go.uber.org/zap" ) -var thirtySecondTimout = 30 * time.Second +var thirtySecondTimout = 5 * time.Second type Provider interface { GetName() string @@ -19,14 +19,14 @@ type Provider interface { type UseProviders struct { providers []Provider timeout time.Duration - logger *zap.SugaredLogger + logger *zap.Logger } -func NewUseProviders(providers []Provider, logger *zap.SugaredLogger) *UseProviders { +func NewUseProviders(providers []Provider, logger *zap.Logger) *UseProviders { return ConfigurableUseProvider(providers, logger, thirtySecondTimout) } -func ConfigurableUseProvider(providers []Provider, logger *zap.SugaredLogger, timeout time.Duration) *UseProviders { +func ConfigurableUseProvider(providers []Provider, logger *zap.Logger, timeout time.Duration) *UseProviders { return &UseProviders{ providers: providers, logger: logger, @@ -41,15 +41,15 @@ func (p *UseProviders) Payment(ctx context.Context, payment *domain.Payment) (*d for _, provider := range p.providers { select { case data := <-p.charge(ctx, payment, provider): - p.logger.Debugw("[Payment] Sending request successfully", - "provider", provider.GetName(), - "attempt", attempts) + p.logger.Debug("[Payment] Received request successfully", + zap.String("provider", provider.GetName()), + zap.Int("attempt", attempts)) return data, nil case <-time.After(p.timeout): - p.logger.Errorw("[Payment] Timeout for provider to respond", - "provider", provider.GetName(), - "attempt", attempts) + p.logger.Error("[Payment] Timeout for provider to respond", + zap.String("provider", provider.GetName()), + zap.Int("attempt", attempts)) err = errors.New("Timeout") continue diff --git a/internal/providers/provider_test.go b/internal/providers/provider_test.go index fa2cb57..69f2b77 100644 --- a/internal/providers/provider_test.go +++ b/internal/providers/provider_test.go @@ -31,14 +31,13 @@ func TestProvider(t *testing.T) { t.Run("should make request for first provider", func(t *testing.T) { logger, _ := zap.NewDevelopment() defer logger.Sync() - sugar := logger.Sugar() spyFirst := &SpyProvider{Timeout: 10 * time.Millisecond, Response: &domain.Provider{Description: "First"}} spySecond := &SpyProvider{Timeout: 10 * time.Millisecond, Response: &domain.Provider{Description: "Second"}} payment, _ := domain.NewPayment(1000, "R$", "", "card", domain.PaymentCard{Number: "", HolderName: "", CVV: "", ExpirationDate: "02/2025", Installments: 1}) - useProvider := providers.ConfigurableUseProvider([]providers.Provider{spyFirst, spySecond}, sugar, 15*time.Millisecond) + useProvider := providers.ConfigurableUseProvider([]providers.Provider{spyFirst, spySecond}, logger, 15*time.Millisecond) data, err := useProvider.Payment(context.Background(), payment) if err != nil { @@ -56,14 +55,13 @@ func TestProvider(t *testing.T) { t.Run("should make request for second provider when first provider timeouts", func(t *testing.T) { logger, _ := zap.NewProduction() defer logger.Sync() - sugar := logger.Sugar() spyFirst := &SpyProvider{Timeout: 20 * time.Millisecond, Response: &domain.Provider{Description: "First"}} spySecond := &SpyProvider{Timeout: 10 * time.Millisecond, Response: &domain.Provider{Description: "Second"}} payment, _ := domain.NewPayment(1000, "R$", "", "card", domain.PaymentCard{Number: "", HolderName: "", CVV: "", ExpirationDate: "02/2025", Installments: 1}) - useProvider := providers.ConfigurableUseProvider([]providers.Provider{spyFirst, spySecond}, sugar, 15*time.Millisecond) + useProvider := providers.ConfigurableUseProvider([]providers.Provider{spyFirst, spySecond}, logger, 15*time.Millisecond) data, err := useProvider.Payment(context.Background(), payment) if err != nil { @@ -81,14 +79,13 @@ func TestProvider(t *testing.T) { t.Run("should return error when all providers timeout", func(t *testing.T) { logger, _ := zap.NewProduction() defer logger.Sync() - sugar := logger.Sugar() spyFirst := &SpyProvider{Timeout: 20 * time.Millisecond, Response: &domain.Provider{Description: "First"}} spySecond := &SpyProvider{Timeout: 20 * time.Millisecond, Response: &domain.Provider{Description: "Second"}} payment, _ := domain.NewPayment(1000, "R$", "", "card", domain.PaymentCard{Number: "", HolderName: "", CVV: "", ExpirationDate: "02/2025", Installments: 1}) - useProvider := providers.ConfigurableUseProvider([]providers.Provider{spyFirst, spySecond}, sugar, 5*time.Millisecond) + useProvider := providers.ConfigurableUseProvider([]providers.Provider{spyFirst, spySecond}, logger, 5*time.Millisecond) data, err := useProvider.Payment(context.Background(), payment) if data != nil { diff --git a/internal/service/payment_service.go b/internal/service/payment_service.go index 9cc50b6..3f88edf 100644 --- a/internal/service/payment_service.go +++ b/internal/service/payment_service.go @@ -2,7 +2,6 @@ package service import ( "context" - "fmt" "github.com/Tulkdan/payment-gateway/internal/domain" "github.com/Tulkdan/payment-gateway/internal/dto" @@ -23,12 +22,10 @@ func (p *PaymentService) CreatePayment(ctx context.Context, input dto.PaymentInp return nil, err } - data, err := p.providers.Payment(ctx, payment) + _, err = p.providers.Payment(ctx, payment) if err != nil { return nil, err } - fmt.Println(data) - return &dto.PaymentOutput{Message: "Processed successfully"}, nil } diff --git a/internal/web/handler/payments_handler.go b/internal/web/handler/payments_handler.go index 3813af7..c4214e0 100644 --- a/internal/web/handler/payments_handler.go +++ b/internal/web/handler/payments_handler.go @@ -12,10 +12,10 @@ import ( type PaymentsHandler struct { paymentService *service.PaymentService - logger *zap.SugaredLogger + logger *zap.Logger } -func NewPaymentsHandler(paymentsService *service.PaymentService, logger *zap.SugaredLogger) *PaymentsHandler { +func NewPaymentsHandler(paymentsService *service.PaymentService, logger *zap.Logger) *PaymentsHandler { return &PaymentsHandler{ paymentService: paymentsService, logger: logger.Named("PaymentHandler"), @@ -25,9 +25,9 @@ func NewPaymentsHandler(paymentsService *service.PaymentService, logger *zap.Sug func (p *PaymentsHandler) Create(w http.ResponseWriter, r *http.Request) { var body dto.PaymentInput if err := json.NewDecoder(r.Body).Decode(&body); err != nil { - p.logger.Errorw("Body incomplete", - "error", err.Error(), - "requestId", r.Context().Value("request-id").(string)) + p.logger.Error("Body incomplete", + zap.String("error", err.Error()), + zap.String("requestId", r.Context().Value("request-id").(string))) http.Error(w, err.Error(), http.StatusBadRequest) return @@ -35,14 +35,18 @@ func (p *PaymentsHandler) Create(w http.ResponseWriter, r *http.Request) { response, err := p.paymentService.CreatePayment(r.Context(), body) if err != nil { - p.logger.Errorw("Failed to create payment", - "error", err.Error(), - "requestId", r.Context().Value("request-id").(string)) + p.logger.Error("Failed to create payment", + zap.String("error", err.Error()), + zap.String("requestId", r.Context().Value("request-id").(string))) http.Error(w, err.Error(), http.StatusBadRequest) return } + p.logger.Debug("Processed request", + zap.Any("response", response), + zap.String("requestId", r.Context().Value("request-id").(string))) + w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) json.NewEncoder(w).Encode(response) diff --git a/internal/web/server.go b/internal/web/server.go index c3eb749..44e15fa 100644 --- a/internal/web/server.go +++ b/internal/web/server.go @@ -16,12 +16,12 @@ type Server struct { port string router *http.ServeMux server *http.Server - logger *zap.SugaredLogger + logger *zap.Logger paymentsService *service.PaymentService } -func NewServer(paymentsService *service.PaymentService, port string, logger *zap.SugaredLogger) *Server { +func NewServer(paymentsService *service.PaymentService, port string, logger *zap.Logger) *Server { return &Server{ port: port, paymentsService: paymentsService, diff --git a/mocks/braintree.yml b/mocks/braintree.yml index d0b35da..6a38ec7 100644 --- a/mocks/braintree.yml +++ b/mocks/braintree.yml @@ -5,7 +5,7 @@ content-type: application/json response: - status: 200 - latency: 5000 + latency: 15000 headers: content-type: application/json server: stubbedServer/4.2 diff --git a/mocks/stripe.yml b/mocks/stripe.yml index 864facb..866861e 100644 --- a/mocks/stripe.yml +++ b/mocks/stripe.yml @@ -5,7 +5,7 @@ content-type: application/json response: - status: 200 - latency: 5000 + latency: 500 headers: content-type: application/json server: stubbedServer/4.2 -- 2.51.2