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
This commit is contained in:
Ekansh Gupta 2025-05-03 22:39:20 +05:30 committed by GitHub
parent 8d6671e362
commit 16e3c185e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 41 additions and 25 deletions

View File

@ -70,7 +70,10 @@ func (s *store) Upsert(ctx context.Context, filter *quickfiltertypes.StorableQui
Set("updated_at = EXCLUDED.updated_at"). Set("updated_at = EXCLUDED.updated_at").
Exec(ctx) Exec(ctx)
return err if err != nil {
return err
}
return nil
} }
func (s *store) Create(ctx context.Context, filters []*quickfiltertypes.StorableQuickFilter) error { 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"). On("CONFLICT (org_id, signal) DO NOTHING").
Exec(ctx) Exec(ctx)
return err if err != nil {
return s.store.WrapAlreadyExistsErrf(err, errors.CodeAlreadyExists, "Quick Filter can not be created")
}
return nil
} }

View File

@ -3,6 +3,7 @@ package sqlmigration
import ( import (
"context" "context"
"database/sql" "database/sql"
"github.com/SigNoz/signoz/pkg/errors"
"github.com/SigNoz/signoz/pkg/factory" "github.com/SigNoz/signoz/pkg/factory"
"github.com/SigNoz/signoz/pkg/sqlstore" "github.com/SigNoz/signoz/pkg/sqlstore"
"github.com/SigNoz/signoz/pkg/types" "github.com/SigNoz/signoz/pkg/types"
@ -74,27 +75,20 @@ func (m *createQuickFilters) Up(ctx context.Context, db *bun.DB) error {
return err return err
} }
// For SQLite, insert each filter individually with proper conflict handling // Insert all filters at once
for _, filter := range storableQuickFilters { _, err = tx.NewInsert().
// Check if the record already exists Model(&storableQuickFilters).
exists, err := tx.NewSelect(). Exec(ctx)
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)
if err != nil {
if errors.Ast(m.store.WrapAlreadyExistsErrf(err, errors.CodeAlreadyExists, "Quick Filter already exists"), errors.TypeAlreadyExists) {
err := tx.Commit()
if err != nil { if err != nil {
return err return err
} }
return nil
} }
return err
} }
// Commit the transaction // Commit the transaction

View File

@ -2,7 +2,6 @@ package quickfiltertypes
import ( import (
"encoding/json" "encoding/json"
"fmt"
"github.com/SigNoz/signoz/pkg/errors" "github.com/SigNoz/signoz/pkg/errors"
v3 "github.com/SigNoz/signoz/pkg/query-service/model/v3" v3 "github.com/SigNoz/signoz/pkg/query-service/model/v3"
"github.com/SigNoz/signoz/pkg/types" "github.com/SigNoz/signoz/pkg/types"
@ -49,7 +48,7 @@ func NewSignal(s string) (Signal, error) {
case "exceptions": case "exceptions":
return SignalExceptions, nil return SignalExceptions, nil
default: 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 // NewStorableQuickFilter creates a new StorableQuickFilter after validation
func NewStorableQuickFilter(orgID valuer.UUID, signal Signal, filterJSON []byte) (*StorableQuickFilter, error) { func NewStorableQuickFilter(orgID valuer.UUID, signal Signal, filterJSON []byte) (*StorableQuickFilter, error) {
if orgID.StringValue() == "" { 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 { if _, err := NewSignal(signal.StringValue()); err != nil {
@ -180,22 +179,23 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) {
tracesJSON, err := json.Marshal(tracesFilters) tracesJSON, err := json.Marshal(tracesFilters)
if err != nil { 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) logsJSON, err := json.Marshal(logsFilters)
if err != nil { 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) apiMonitoringJSON, err := json.Marshal(apiMonitoringFilters)
if err != nil { 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) exceptionsJSON, err := json.Marshal(exceptionsFilters)
if err != nil { 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{ return []*StorableQuickFilter{
{ {
@ -205,6 +205,10 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) {
OrgID: orgID, OrgID: orgID,
Filter: string(tracesJSON), Filter: string(tracesJSON),
Signal: SignalTraces, Signal: SignalTraces,
TimeAuditable: types.TimeAuditable{
CreatedAt: timeRightNow,
UpdatedAt: timeRightNow,
},
}, },
{ {
Identifiable: types.Identifiable{ Identifiable: types.Identifiable{
@ -213,6 +217,10 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) {
OrgID: orgID, OrgID: orgID,
Filter: string(logsJSON), Filter: string(logsJSON),
Signal: SignalLogs, Signal: SignalLogs,
TimeAuditable: types.TimeAuditable{
CreatedAt: timeRightNow,
UpdatedAt: timeRightNow,
},
}, },
{ {
Identifiable: types.Identifiable{ Identifiable: types.Identifiable{
@ -221,6 +229,10 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) {
OrgID: orgID, OrgID: orgID,
Filter: string(apiMonitoringJSON), Filter: string(apiMonitoringJSON),
Signal: SignalApiMonitoring, Signal: SignalApiMonitoring,
TimeAuditable: types.TimeAuditable{
CreatedAt: timeRightNow,
UpdatedAt: timeRightNow,
},
}, },
{ {
Identifiable: types.Identifiable{ Identifiable: types.Identifiable{
@ -229,6 +241,10 @@ func NewDefaultQuickFilter(orgID valuer.UUID) ([]*StorableQuickFilter, error) {
OrgID: orgID, OrgID: orgID,
Filter: string(exceptionsJSON), Filter: string(exceptionsJSON),
Signal: SignalExceptions, Signal: SignalExceptions,
TimeAuditable: types.TimeAuditable{
CreatedAt: timeRightNow,
UpdatedAt: timeRightNow,
},
}, },
}, nil }, nil
} }