diff --git a/serializer/serializer.go b/serializer/serializer.go index bb5f160dd..dd6619be3 100644 --- a/serializer/serializer.go +++ b/serializer/serializer.go @@ -2,29 +2,56 @@ package serializer import ( "github.com/TykTechnologies/tyk-pump/analytics" - logger "github.com/TykTechnologies/tyk-pump/logger" + "github.com/TykTechnologies/tyk-pump/logger" + "github.com/sirupsen/logrus" ) -var log = logger.GetLogger() - type AnalyticsSerializer interface { Encode(record *analytics.AnalyticsRecord) ([]byte, error) Decode(analyticsData interface{}, record *analytics.AnalyticsRecord) error GetSuffix() string } -const MSGP_SERIALIZER = "msgpack" -const PROTOBUF_SERIALIZER = "protobuf" +const ( + MSGP_SERIALIZER = "msgpack" + PROTOBUF_SERIALIZER = "protobuf" +) + +type analyticsSerializerOptions struct { + logger *logrus.Logger +} + +type NewAnalyticsSerializerOpt func(*analyticsSerializerOptions) + +func NewAnalyticsSerializer( + serializerType string, + options ...NewAnalyticsSerializerOpt, +) AnalyticsSerializer { + opt := analyticsSerializerOptions{ + logger: logger.GetLogger(), + } + + for _, apply := range options { + apply(&opt) + } -func NewAnalyticsSerializer(serializerType string) AnalyticsSerializer { switch serializerType { case PROTOBUF_SERIALIZER: serializer := &ProtobufSerializer{} - log.Debugf("Using serializer %v for analytics \n", PROTOBUF_SERIALIZER) + opt.logger.Debugf("Using serializer %v for analytics \n", PROTOBUF_SERIALIZER) return serializer case MSGP_SERIALIZER: + fallthrough default: - log.Debugf("Using serializer %v for analytics \n", MSGP_SERIALIZER) + opt.logger.Debugf("Using serializer %v for analytics \n", MSGP_SERIALIZER) + return &MsgpSerializer{} + } +} + +// WithLogger +// Overrides default logger. +func WithLogger(logger *logrus.Logger) NewAnalyticsSerializerOpt { + return func(o *analyticsSerializerOptions) { + o.logger = logger } - return &MsgpSerializer{} } diff --git a/serializer/serializer_test.go b/serializer/serializer_test.go index b4d27d68b..3f3c31c66 100644 --- a/serializer/serializer_test.go +++ b/serializer/serializer_test.go @@ -9,6 +9,8 @@ import ( "github.com/TykTechnologies/tyk-pump/analytics/demo" "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/sirupsen/logrus" + logrustest "github.com/sirupsen/logrus/hooks/test" "github.com/stretchr/testify/assert" ) @@ -207,6 +209,29 @@ func TestSerializer_OriginalPathAndListenPathRoundTrip(t *testing.T) { } } +func Test_WithLogger(t *testing.T) { + logger, hook := logrustest.NewNullLogger() + logger.SetLevel(logrus.DebugLevel) + + t.Run("writes logs to provided logger in case MSGP_SERIALIZER", func(t *testing.T) { + hook.Reset() + _ = NewAnalyticsSerializer(MSGP_SERIALIZER, WithLogger(logger)) + assert.True(t, len(hook.AllEntries()) > 0) + }) + + t.Run("writes logs to provided logger in case PROTOBUF_SERIALIZER", func(t *testing.T) { + hook.Reset() + _ = NewAnalyticsSerializer(PROTOBUF_SERIALIZER, WithLogger(logger)) + assert.True(t, len(hook.AllEntries()) > 0) + }) + + t.Run("writes logs to provided logger in case wrong string", func(t *testing.T) { + hook.Reset() + _ = NewAnalyticsSerializer("dummy", WithLogger(logger)) + assert.True(t, len(hook.AllEntries()) > 0) + }) +} + func BenchmarkProtobufEncoding(b *testing.B) { serializer := NewAnalyticsSerializer(PROTOBUF_SERIALIZER) records := []analytics.AnalyticsRecord{