Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement audit backend for TimescaleDB. #151

Draft
wants to merge 13 commits into
base: master
Choose a base branch
from
23 changes: 15 additions & 8 deletions auditing/auditing.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,16 @@
package auditing

import (
"context"
"log/slog"
"os"
"path/filepath"
"time"
)

type Config struct {
Component string
URL string
APIKey string
IndexPrefix string
RotationInterval Interval
Keep int64
Log *slog.Logger
Component string
Log *slog.Logger
}

type Interval string
Expand Down Expand Up @@ -135,5 +133,14 @@ type Auditing interface {
// Searches for entries matching the given filter.
// By default only recent entries will be returned.
// The returned entries will be sorted by timestamp in descending order.
Search(EntryFilter) ([]Entry, error)
Search(context.Context, EntryFilter) ([]Entry, error)
}

func defaultComponent() (string, error) {
ex, err := os.Executable()
if err != nil {
return "", err
}

return filepath.Base(ex), nil
}
34 changes: 21 additions & 13 deletions auditing/meilisearch.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@ import (
"errors"
"fmt"
"log/slog"
"os"
"path/filepath"
"regexp"
"slices"
"strings"
Expand All @@ -17,6 +15,15 @@ import (
"github.com/meilisearch/meilisearch-go"
)

type MeilisearchConfig struct {
URL string
APIKey string

IndexPrefix string
RotationInterval Interval
Keep int64
}

type meiliAuditing struct {
component string
client *meilisearch.Client
Expand All @@ -39,32 +46,33 @@ const (
meiliIndexCreationWaitInterval = 100 * time.Millisecond
)

func New(c Config) (Auditing, error) {
func NewMeilisearch(c Config, mc MeilisearchConfig) (Auditing, error) {
if c.Component == "" {
ex, err := os.Executable()
component, err := defaultComponent()
if err != nil {
return nil, err
}
c.Component = filepath.Base(ex)

c.Component = component
}

client := meilisearch.NewClient(meilisearch.ClientConfig{
Host: c.URL,
APIKey: c.APIKey,
Host: mc.URL,
APIKey: mc.APIKey,
})
v, err := client.GetVersion()
if err != nil {
return nil, fmt.Errorf("unable to connect to meilisearch at:%s %w", c.URL, err)
return nil, fmt.Errorf("unable to connect to meilisearch at:%s %w", mc.URL, err)
}
c.Log.Info("meilisearch", "connected to", v, "index rotated", c.RotationInterval, "index keep", c.Keep)
c.Log.Info("meilisearch", "connected to", v, "index rotated", mc.RotationInterval, "index keep", mc.Keep)

a := &meiliAuditing{
component: c.Component,
client: client,
log: c.Log.WithGroup("auditing"),
indexPrefix: c.IndexPrefix,
rotationInterval: c.RotationInterval,
keep: c.Keep,
indexPrefix: mc.IndexPrefix,
rotationInterval: mc.RotationInterval,
keep: mc.Keep,
}
return a, nil
}
Expand Down Expand Up @@ -121,7 +129,7 @@ func (a *meiliAuditing) Index(entry Entry) error {
return nil
}

func (a *meiliAuditing) Search(filter EntryFilter) ([]Entry, error) {
func (a *meiliAuditing) Search(_ context.Context, filter EntryFilter) ([]Entry, error) {
predicates := make([]string, 0)
if filter.Component != "" {
predicates = append(predicates, fmt.Sprintf("component = %q", filter.Component))
Expand Down
20 changes: 11 additions & 9 deletions auditing/meilisearch_integration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ func StartMeilisearch(t testing.TB) (container testcontainers.Container, c *conn
}

func TestAuditing_Meilisearch(t *testing.T) {
ctx := context.Background()
container, c, err := StartMeilisearch(t)
require.NoError(t, err)
defer func() {
Expand Down Expand Up @@ -143,7 +144,7 @@ func TestAuditing_Meilisearch(t *testing.T) {
{
name: "no entries, no search results",
t: func(t *testing.T, a Auditing) {
entries, err := a.Search(EntryFilter{})
entries, err := a.Search(ctx, EntryFilter{})
require.NoError(t, err)
assert.Empty(t, entries)
},
Expand All @@ -158,7 +159,7 @@ func TestAuditing_Meilisearch(t *testing.T) {
err = a.Flush()
require.NoError(t, err)

entries, err := a.Search(EntryFilter{
entries, err := a.Search(ctx, EntryFilter{
Body: "test",
})
require.NoError(t, err)
Expand All @@ -177,7 +178,7 @@ func TestAuditing_Meilisearch(t *testing.T) {
err = a.Flush()
require.NoError(t, err)

entries, err := a.Search(EntryFilter{})
entries, err := a.Search(ctx, EntryFilter{})
require.NoError(t, err)
assert.Len(t, entries, len(es))

Expand All @@ -187,7 +188,7 @@ func TestAuditing_Meilisearch(t *testing.T) {
t.Errorf("diff (+got -want):\n %s", diff)
}

entries, err = a.Search(EntryFilter{
entries, err = a.Search(ctx, EntryFilter{
Body: "This",
})
require.NoError(t, err)
Expand All @@ -206,7 +207,7 @@ func TestAuditing_Meilisearch(t *testing.T) {
err = a.Flush()
require.NoError(t, err)

entries, err := a.Search(EntryFilter{
entries, err := a.Search(ctx, EntryFilter{
RequestId: es[0].RequestId,
})
require.NoError(t, err)
Expand Down Expand Up @@ -234,7 +235,7 @@ func TestAuditing_Meilisearch(t *testing.T) {
err = a.Flush()
require.NoError(t, err)

entries, err := a.Search(EntryFilter{
entries, err := a.Search(ctx, EntryFilter{
Phase: EntryPhaseResponse,
})
require.NoError(t, err)
Expand All @@ -259,7 +260,7 @@ func TestAuditing_Meilisearch(t *testing.T) {
err = a.Flush()
require.NoError(t, err)

entries, err := a.Search(EntryFilter{
entries, err := a.Search(ctx, EntryFilter{
// we want to run a phrase search as otherwise we return the other entries as well
// https://www.meilisearch.com/docs/reference/api/search#phrase-search-2
Body: fmt.Sprintf("%q", es[0].Body.(string)),
Expand All @@ -277,10 +278,11 @@ func TestAuditing_Meilisearch(t *testing.T) {
tt := tt

t.Run(fmt.Sprintf("%d %s", i, tt.name), func(t *testing.T) {
a, err := New(Config{
a, err := NewMeilisearch(Config{
Log: slog.Default(),
}, MeilisearchConfig{
URL: c.Endpoint,
APIKey: c.Password,
Log: slog.Default(),
IndexPrefix: fmt.Sprintf("test-%d", i),
})
require.NoError(t, err)
Expand Down
Loading
Loading