From 16e3c185e9a1170b4506f8cd651ed7276d63ccc7 Mon Sep 17 00:00:00 2001 From: Ekansh Gupta Date: Sat, 3 May 2025 22:39:20 +0530 Subject: [PATCH] feat: quick_filter_fix (#7816) * feat: quick_filter_fix * feat: added changes related to custom options for quick filters * feat: added changes related to custom options for quick filters --- pkg/modules/quickfilter/core/store.go | 10 +++++-- pkg/sqlmigration/030_create_quick_filters.go | 26 +++++++---------- pkg/types/quickfiltertypes/filter.go | 30 +++++++++++++++----- 3 files changed, 41 insertions(+), 25 deletions(-) diff --git a/pkg/modules/quickfilter/core/store.go b/pkg/modules/quickfilter/core/store.go index 6ef3627bf0..5d829e5da8 100644 --- a/pkg/modules/quickfilter/core/store.go +++ b/pkg/modules/quickfilter/core/store.go @@ -70,7 +70,10 @@ func (s *store) Upsert(ctx context.Context, filter *quickfiltertypes.StorableQui Set("updated_at = EXCLUDED.updated_at"). Exec(ctx) - return err + if err != nil { + return err + } + return nil } func (s *store) Create(ctx context.Context, filters []*quickfiltertypes.StorableQuickFilter) error { @@ -82,5 +85,8 @@ func (s *store) Create(ctx context.Context, filters []*quickfiltertypes.Storable On("CONFLICT (org_id, signal) DO NOTHING"). Exec(ctx) - return err + if err != nil { + return s.store.WrapAlreadyExistsErrf(err, errors.CodeAlreadyExists, "Quick Filter can not be created") + } + return nil } diff --git a/pkg/sqlmigration/030_create_quick_filters.go b/pkg/sqlmigration/030_create_quick_filters.go index 61fe1a7852..6fadf6dfc3 100644 --- a/pkg/sqlmigration/030_create_quick_filters.go +++ b/pkg/sqlmigration/030_create_quick_filters.go @@ -3,6 +3,7 @@ package sqlmigration import ( "context" "database/sql" + "github.com/SigNoz/signoz/pkg/errors" "github.com/SigNoz/signoz/pkg/factory" "github.com/SigNoz/signoz/pkg/sqlstore" "github.com/SigNoz/signoz/pkg/types" @@ -74,27 +75,20 @@ func (m *createQuickFilters) Up(ctx context.Context, db *bun.DB) error { return err } - // For SQLite, insert each filter individually with proper conflict handling - for _, filter := range storableQuickFilters { - // Check if the record already exists - exists, err := tx.NewSelect(). - Model((*quickFilter)(nil)). - Where("org_id = ? AND signal = ?", filter.OrgID, filter.Signal). - Exists(ctx) - if err != nil { - return err - } - - // Only insert if it doesn't exist - if !exists { - _, err = tx.NewInsert(). - Model(&filter). - Exec(ctx) + // Insert all filters at once + _, err = tx.NewInsert(). + Model(&storableQuickFilters). + Exec(ctx) + if err != nil { + if errors.Ast(m.store.WrapAlreadyExistsErrf(err, errors.CodeAlreadyExists, "Quick Filter already exists"), errors.TypeAlreadyExists) { + err := tx.Commit() if err != nil { return err } + return nil } + return err } // Commit the transaction diff --git a/pkg/types/quickfiltertypes/filter.go b/pkg/types/quickfiltertypes/filter.go index 3e4dd873be..4a9fe62f96 100644 --- a/pkg/types/quickfiltertypes/filter.go +++ b/pkg/types/quickfiltertypes/filter.go @@ -2,7 +2,6 @@ package quickfiltertypes import ( "encoding/json" - "fmt" "github.com/SigNoz/signoz/pkg/errors" v3 "github.com/SigNoz/signoz/pkg/query-service/model/v3" "github.com/SigNoz/signoz/pkg/types" @@ -49,7 +48,7 @@ func NewSignal(s string) (Signal, error) { case "exceptions": return SignalExceptions, nil default: - return Signal{}, errors.New(errors.TypeInternal, errors.CodeInternal, "invalid signal: "+s) + return Signal{}, errors.Newf(errors.TypeInternal, errors.CodeInternal, "invalid signal: "+s) } } @@ -75,7 +74,7 @@ type UpdatableQuickFilters struct { // NewStorableQuickFilter creates a new StorableQuickFilter after validation func NewStorableQuickFilter(orgID valuer.UUID, signal Signal, filterJSON []byte) (*StorableQuickFilter, error) { if orgID.StringValue() == "" { - return nil, errors.New(errors.TypeInvalidInput, errors.CodeInvalidInput, "orgID is required") + return nil, errors.Newf(errors.TypeInvalidInput, errors.CodeInvalidInput, "orgID is required") } if _, err := NewSignal(signal.StringValue()); err != nil { @@ -180,22 +179,23 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) { tracesJSON, err := json.Marshal(tracesFilters) if err != nil { - return nil, fmt.Errorf("failed to marshal traces filters: %w", err) + return nil, errors.Wrapf(err, errors.TypeInternal, errors.CodeInternal, "failed to marshal traces filters") } logsJSON, err := json.Marshal(logsFilters) if err != nil { - return nil, fmt.Errorf("failed to marshal logs filters: %w", err) + return nil, errors.Wrapf(err, errors.TypeInternal, errors.CodeInternal, "failed to marshal logs filters") } apiMonitoringJSON, err := json.Marshal(apiMonitoringFilters) if err != nil { - return nil, fmt.Errorf("failed to marshal API monitoring filters: %w", err) + return nil, errors.Wrapf(err, errors.TypeInternal, errors.CodeInternal, "failed to marshal Api Monitoring filters") } exceptionsJSON, err := json.Marshal(exceptionsFilters) if err != nil { - return nil, fmt.Errorf("failed to marshal exceptions filters: %w", err) + return nil, errors.Wrapf(err, errors.TypeInternal, errors.CodeInternal, "failed to marshal Exceptions filters") } + timeRightNow := time.Now() return []*StorableQuickFilter{ { @@ -205,6 +205,10 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) { OrgID: orgID, Filter: string(tracesJSON), Signal: SignalTraces, + TimeAuditable: types.TimeAuditable{ + CreatedAt: timeRightNow, + UpdatedAt: timeRightNow, + }, }, { Identifiable: types.Identifiable{ @@ -213,6 +217,10 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) { OrgID: orgID, Filter: string(logsJSON), Signal: SignalLogs, + TimeAuditable: types.TimeAuditable{ + CreatedAt: timeRightNow, + UpdatedAt: timeRightNow, + }, }, { Identifiable: types.Identifiable{ @@ -221,6 +229,10 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) { OrgID: orgID, Filter: string(apiMonitoringJSON), Signal: SignalApiMonitoring, + TimeAuditable: types.TimeAuditable{ + CreatedAt: timeRightNow, + UpdatedAt: timeRightNow, + }, }, { Identifiable: types.Identifiable{ @@ -229,6 +241,10 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) { OrgID: orgID, Filter: string(exceptionsJSON), Signal: SignalExceptions, + TimeAuditable: types.TimeAuditable{ + CreatedAt: timeRightNow, + UpdatedAt: timeRightNow, + }, }, }, nil }