From 1672a1385e36436cee154df83a7352a9d14feaba Mon Sep 17 00:00:00 2001 From: Gustavo Inacio Date: Mon, 22 Jan 2024 22:14:37 -0300 Subject: [PATCH 1/5] feat: add default logger with slog --- consumer/logger/logger.go | 25 +++++++++++++++++++++++++ consumer/logger/logger_test.go | 16 ++++++++++++++++ consumer/sqsclient.go | 17 +++++++++++++---- 3 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 consumer/logger/logger.go create mode 100644 consumer/logger/logger_test.go diff --git a/consumer/logger/logger.go b/consumer/logger/logger.go new file mode 100644 index 0000000..f60c6db --- /dev/null +++ b/consumer/logger/logger.go @@ -0,0 +1,25 @@ +package logger + +import ( + "fmt" + "log/slog" + "os" +) + +type DefaultLogger struct { + *slog.Logger +} + +func New() *DefaultLogger { + logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) + + slog.SetDefault(logger) + + return &DefaultLogger{ + Logger: logger, + } +} + +func (l *DefaultLogger) Log(message string, v ...interface{}) { + l.Info(fmt.Sprintf(message, v...)) +} diff --git a/consumer/logger/logger_test.go b/consumer/logger/logger_test.go new file mode 100644 index 0000000..97a0f98 --- /dev/null +++ b/consumer/logger/logger_test.go @@ -0,0 +1,16 @@ +package logger_test + +import ( + "github.com/inaciogu/go-sqs/consumer/logger" + "github.com/stretchr/testify/suite" +) + +type UnitTestSuite struct { + suite.Suite +} + +func (ut *UnitTestSuite) TestNew() { + logger := logger.New() + + ut.NotNil(logger) +} diff --git a/consumer/sqsclient.go b/consumer/sqsclient.go index 07d5346..15015e3 100644 --- a/consumer/sqsclient.go +++ b/consumer/sqsclient.go @@ -1,13 +1,13 @@ package sqsclient import ( - "fmt" "strings" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/sqs" + "github.com/inaciogu/go-sqs/consumer/logger" "github.com/inaciogu/go-sqs/consumer/message" ) @@ -19,6 +19,10 @@ type SQSService interface { ListQueues(input *sqs.ListQueuesInput) (*sqs.ListQueuesOutput, error) } +type Logger interface { + Log(message string, v ...interface{}) +} + type SQSClientInterface interface { GetQueueUrl() *string ReceiveMessages(queueUrl string, ch chan *sqs.Message) error @@ -45,6 +49,7 @@ type SQSClientOptions struct { type SQSClient struct { Client SQSService ClientOptions *SQSClientOptions + Logger Logger } const ( @@ -72,9 +77,11 @@ func New(sqsService SQSService, options SQSClientOptions) *SQSClient { setDefaultOptions(&options) + logger := logger.New() return &SQSClient{ Client: sqsService, ClientOptions: &options, + Logger: logger, } } @@ -130,8 +137,10 @@ func (s *SQSClient) ReceiveMessages(queueUrl string, ch chan *sqs.Message) error queueName := splittedUrl[len(splittedUrl)-1] + s.Logger.Log("polling messages from queue %s", queueName) + for { - fmt.Printf("polling messages from queue %s\n", queueName) + s.Logger.Log("polling messages from queue %s\n", queueName) result, err := s.Client.ReceiveMessage(&sqs.ReceiveMessageInput{ QueueUrl: aws.String(queueUrl), @@ -167,7 +176,7 @@ func (s *SQSClient) ProcessMessage(sqsMessage *sqs.Message, queueUrl string) { panic(err) } - fmt.Printf("failed to handle message with ID: %s\n", message.Metadata.MessageId) + s.Logger.Log("failed to handle message with ID: %s\n", message.Metadata.MessageId) return } @@ -181,7 +190,7 @@ func (s *SQSClient) ProcessMessage(sqsMessage *sqs.Message, queueUrl string) { panic(err) } - fmt.Printf("message handled ID: %s\n", message.Metadata.MessageId) + s.Logger.Log("message handled ID: %s\n", message.Metadata.MessageId) } // Poll starts polling messages from the queue From 6244220681d2e6546d37af6a46c581a8736438da Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 23 Jan 2024 08:25:59 -0300 Subject: [PATCH 2/5] feat: add zap logger implementation --- consumer/logger/logger.go | 24 ++++++++++++++++++------ consumer/logger/logger_test.go | 14 ++++++++++++++ consumer/sqsclient.go | 4 +--- go.mod | 2 ++ go.sum | 4 ++++ 5 files changed, 39 insertions(+), 9 deletions(-) diff --git a/consumer/logger/logger.go b/consumer/logger/logger.go index f60c6db..679c45b 100644 --- a/consumer/logger/logger.go +++ b/consumer/logger/logger.go @@ -2,21 +2,33 @@ package logger import ( "fmt" - "log/slog" - "os" + + "go.uber.org/zap" + "go.uber.org/zap/zapcore" ) type DefaultLogger struct { - *slog.Logger + *zap.Logger } func New() *DefaultLogger { - logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) + logger := zap.Config{ + Level: zap.NewAtomicLevelAt(zapcore.InfoLevel), + OutputPaths: []string{"stdout"}, + Encoding: "json", + EncoderConfig: zapcore.EncoderConfig{ + MessageKey: "message", + TimeKey: "time", + LevelKey: "level", + EncodeTime: zapcore.ISO8601TimeEncoder, + EncodeLevel: zapcore.LowercaseLevelEncoder, + }, + } - slog.SetDefault(logger) + zapLogger, _ := logger.Build() return &DefaultLogger{ - Logger: logger, + Logger: zapLogger, } } diff --git a/consumer/logger/logger_test.go b/consumer/logger/logger_test.go index 97a0f98..e0a8e61 100644 --- a/consumer/logger/logger_test.go +++ b/consumer/logger/logger_test.go @@ -1,6 +1,8 @@ package logger_test import ( + "testing" + "github.com/inaciogu/go-sqs/consumer/logger" "github.com/stretchr/testify/suite" ) @@ -9,8 +11,20 @@ type UnitTestSuite struct { suite.Suite } +func TestUnitSuites(t *testing.T) { + suite.Run(t, new(UnitTestSuite)) +} + func (ut *UnitTestSuite) TestNew() { logger := logger.New() ut.NotNil(logger) } + +func (ut *UnitTestSuite) TestLog() { + logger := logger.New() + + logger.Log("test") + + ut.NotNil(logger) +} diff --git a/consumer/sqsclient.go b/consumer/sqsclient.go index 15015e3..5dd9e6b 100644 --- a/consumer/sqsclient.go +++ b/consumer/sqsclient.go @@ -137,10 +137,8 @@ func (s *SQSClient) ReceiveMessages(queueUrl string, ch chan *sqs.Message) error queueName := splittedUrl[len(splittedUrl)-1] - s.Logger.Log("polling messages from queue %s", queueName) - for { - s.Logger.Log("polling messages from queue %s\n", queueName) + s.Logger.Log("polling messages from queue %s", queueName) result, err := s.Client.ReceiveMessage(&sqs.ReceiveMessageInput{ QueueUrl: aws.String(queueUrl), diff --git a/go.mod b/go.mod index 542204e..e4f8b9e 100644 --- a/go.mod +++ b/go.mod @@ -13,5 +13,7 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.5.0 // indirect + go.uber.org/multierr v1.10.0 // indirect + go.uber.org/zap v1.26.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 1f5a5ea..6d72f79 100644 --- a/go.sum +++ b/go.sum @@ -21,6 +21,10 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= +go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo= +go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= From 3b9124b2179181a98e4ba5203f78e4a21bdc4db5 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 23 Jan 2024 08:28:31 -0300 Subject: [PATCH 3/5] feat: method to set custom logger --- consumer/sqsclient.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/consumer/sqsclient.go b/consumer/sqsclient.go index 5dd9e6b..20d1bf6 100644 --- a/consumer/sqsclient.go +++ b/consumer/sqsclient.go @@ -103,6 +103,10 @@ func setDefaultOptions(options *SQSClientOptions) { } } +func (s *SQSClient) SetLogger(logger Logger) { + s.Logger = logger +} + // GetQueueUrl returns the URL of the queue based on the queue name func (s *SQSClient) GetQueueUrl() *string { urlResult, err := s.Client.GetQueueUrl(&sqs.GetQueueUrlInput{ From 3ead8e3ee4272c11ee0c5dae6fb3c8fbd6d1dec7 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 23 Jan 2024 08:36:43 -0300 Subject: [PATCH 4/5] fix: remove line breaks from logs --- consumer/sqsclient.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/consumer/sqsclient.go b/consumer/sqsclient.go index 20d1bf6..c7c1f3c 100644 --- a/consumer/sqsclient.go +++ b/consumer/sqsclient.go @@ -178,7 +178,7 @@ func (s *SQSClient) ProcessMessage(sqsMessage *sqs.Message, queueUrl string) { panic(err) } - s.Logger.Log("failed to handle message with ID: %s\n", message.Metadata.MessageId) + s.Logger.Log("failed to handle message with ID: %s", message.Metadata.MessageId) return } @@ -192,7 +192,7 @@ func (s *SQSClient) ProcessMessage(sqsMessage *sqs.Message, queueUrl string) { panic(err) } - s.Logger.Log("message handled ID: %s\n", message.Metadata.MessageId) + s.Logger.Log("message handled ID: %s", message.Metadata.MessageId) } // Poll starts polling messages from the queue From a18858a7f779c43bea01b193d82dbf7af3982884 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 23 Jan 2024 08:38:15 -0300 Subject: [PATCH 5/5] chore: update README --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 0ba6543..b4f589b 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,9 @@ This is a simple package to help you consume messages from AWS SQS. - [x] Consume messages from different defined queues - [x] Consume messages from different queues by a prefix - [x] Error handling +- [x] Message unmarshalling +- [x] Message deletion +- [x] Logging ### Installation