diff --git a/send/interceptor.go b/send/interceptor.go new file mode 100644 index 0000000..2fe8a39 --- /dev/null +++ b/send/interceptor.go @@ -0,0 +1,28 @@ +package send + +import "github.com/cdr/grip/message" + +type interceptor struct { + Sender + filter func(message.Composer) +} + +// NewInterceptor constructs an intercepting sender implementation +// that wraps another sender, and passes all messages (regardless of +// loggability or level,) through a filtering function. +// +// This implementation and the filtering function exist mostly to be +// able to inject metrics collection into existing logging pipelines, +// though the interceptor may be used for filtering or pre-processing +// as well. +func NewInterceptor(sender Sender, ifn func(message.Composer)) Sender { + return &interceptor{ + Sender: sender, + filter: ifn, + } +} + +func (s *interceptor) Send(m message.Composer) { + s.filter(m) + s.Sender.Send(m) +} diff --git a/send/interceptor_test.go b/send/interceptor_test.go new file mode 100644 index 0000000..99e36ff --- /dev/null +++ b/send/interceptor_test.go @@ -0,0 +1,29 @@ +package send + +import ( + "testing" + + "github.com/cdr/grip/level" + "github.com/cdr/grip/message" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestInterceptor(t *testing.T) { + base, err := NewInternalLogger("test", LevelInfo{Threshold: level.Info, Default: level.Debug}) + require.NoError(t, err) + + var count int + filter := func(m message.Composer) { count++ } + + icept := NewInterceptor(base, filter) + + assert.Equal(t, 0, base.Len()) + icept.Send(message.NewSimpleStringMessage(level.Info, "hello")) + assert.Equal(t, 1, base.Len()) + assert.Equal(t, 1, count) + + icept.Send(message.NewSimpleStringMessage(level.Trace, "hello")) + assert.Equal(t, 1, base.Len()) + assert.Equal(t, 2, count) +}