From 492cd8bf4ca33a0f3b2a3811c11236559568fd94 Mon Sep 17 00:00:00 2001 From: Roman Dmytrenko Date: Thu, 6 Jun 2024 17:20:43 +0300 Subject: [PATCH 1/2] fix(audit): preserve audit log scheme Signed-off-by: Roman Dmytrenko --- internal/server/audit/events.go | 15 +++++++++++++++ internal/server/audit/log/log.go | 2 +- internal/server/audit/log/log_test.go | 4 ++-- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/internal/server/audit/events.go b/internal/server/audit/events.go index c5cb44395d..17b8f91664 100644 --- a/internal/server/audit/events.go +++ b/internal/server/audit/events.go @@ -9,6 +9,7 @@ import ( "go.flipt.io/flipt/rpc/flipt" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" + "go.uber.org/zap/zapcore" ) const ( @@ -131,6 +132,20 @@ func (e *Event) Valid() bool { return e.Version != "" && e.Action != "" && e.Type != "" && e.Timestamp != "" && e.Payload != nil } +func (e Event) MarshalLogObject(enc zapcore.ObjectEncoder) error { + enc.AddString("version", e.Version) + enc.AddString("type", e.Type) + enc.AddString("action", e.Action) + if err := enc.AddReflected("metadata", e.Metadata); err != nil { + return err + } + if err := enc.AddReflected("payload", e.Payload); err != nil { + return err + } + enc.AddString("timestamp", e.Timestamp) + return nil +} + var errEventNotValid = errors.New("event not valid") // decodeToEvent provides helper logic for turning to value of SpanEvents to diff --git a/internal/server/audit/log/log.go b/internal/server/audit/log/log.go index 8d47549efd..6f290ec63b 100644 --- a/internal/server/audit/log/log.go +++ b/internal/server/audit/log/log.go @@ -123,7 +123,7 @@ func newSink(opts logOptions) (audit.Sink, error) { func (l *Sink) SendAudits(_ context.Context, events []audit.Event) error { for _, e := range events { - l.logger.Info(auditKey, zap.Any("event", e)) + l.logger.Info(auditKey, zap.Inline(e)) } return nil diff --git a/internal/server/audit/log/log_test.go b/internal/server/audit/log/log_test.go index c35dd6e60d..af8619537b 100644 --- a/internal/server/audit/log/log_test.go +++ b/internal/server/audit/log/log_test.go @@ -58,7 +58,7 @@ func TestSink(t *testing.T) { assert.NotEmpty(t, lines) assert.NotEmpty(t, lines[0]) - assert.JSONEq(t, `{ "event": { "version": "0.1", "type": "flag", "action": "create", "metadata": {}, "payload": null, "timestamp": "" } }`, lines[0]) + assert.JSONEq(t, `{"version": "0.1", "type": "flag", "action": "create", "metadata": {}, "payload": null, "timestamp": ""}`, lines[0]) } func TestSink_DirNotExists(t *testing.T) { @@ -113,7 +113,7 @@ func TestSink_DirNotExists(t *testing.T) { assert.NotEmpty(t, lines) assert.NotEmpty(t, lines[0]) - assert.JSONEq(t, `{ "event": { "version": "0.1", "type": "flag", "action": "create", "metadata": {}, "payload": null, "timestamp": "" } }`, lines[0]) + assert.JSONEq(t, `{"version": "0.1", "type": "flag", "action": "create", "metadata": {}, "payload": null, "timestamp": ""}`, lines[0]) }) } } From 985ba48360c349388dc2112cde19305fd9b697ce Mon Sep 17 00:00:00 2001 From: Roman Dmytrenko Date: Fri, 7 Jun 2024 12:54:14 +0300 Subject: [PATCH 2/2] improve test coverage Signed-off-by: Roman Dmytrenko --- internal/server/audit/events_test.go | 31 ++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 internal/server/audit/events_test.go diff --git a/internal/server/audit/events_test.go b/internal/server/audit/events_test.go new file mode 100644 index 0000000000..ef939914c3 --- /dev/null +++ b/internal/server/audit/events_test.go @@ -0,0 +1,31 @@ +package audit + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "go.uber.org/zap/zapcore" +) + +func TestMarshalLogObject(t *testing.T) { + actor := Actor{Authentication: "github"} + e := Event{ + Version: "0.1", + Type: "sometype", + Action: "modified", + Metadata: Metadata{Actor: &actor}, + Payload: "custom payload", + } + enc := zapcore.NewMapObjectEncoder() + err := e.MarshalLogObject(enc) + require.NoError(t, err) + assert.Equal(t, map[string]any{ + "version": "0.1", + "action": "modified", + "type": "sometype", + "metadata": Metadata{Actor: &actor}, + "payload": "custom payload", + "timestamp": "", + }, enc.Fields) +}