diff --git a/pkg/query-service/utils/testutils.go b/pkg/query-service/utils/testutils.go index ce1ae7c850..5342e0ee38 100644 --- a/pkg/query-service/utils/testutils.go +++ b/pkg/query-service/utils/testutils.go @@ -51,6 +51,7 @@ func NewTestSqliteDB(t *testing.T) (sqlStore sqlstore.SQLStore, testDBFilePath s sqlmigration.NewUpdateDashboardAndSavedViewsFactory(sqlStore), sqlmigration.NewUpdatePatAndOrgDomainsFactory(sqlStore), sqlmigration.NewUpdatePipelines(sqlStore), + sqlmigration.NewAddVirtualFieldsFactory(), ), ) if err != nil { diff --git a/pkg/signoz/provider.go b/pkg/signoz/provider.go index eec3a8bcc5..99d524331f 100644 --- a/pkg/signoz/provider.go +++ b/pkg/signoz/provider.go @@ -69,6 +69,7 @@ func NewSQLMigrationProviderFactories(sqlstore sqlstore.SQLStore) factory.NamedM sqlmigration.NewUpdatePreferencesFactory(sqlstore), sqlmigration.NewUpdateApdexTtlFactory(sqlstore), sqlmigration.NewUpdateResetPasswordFactory(sqlstore), + sqlmigration.NewAddVirtualFieldsFactory(), ) } diff --git a/pkg/sqlmigration/025_add_virtual_fields.go b/pkg/sqlmigration/025_add_virtual_fields.go new file mode 100644 index 0000000000..8dbf6fa3bf --- /dev/null +++ b/pkg/sqlmigration/025_add_virtual_fields.go @@ -0,0 +1,58 @@ +package sqlmigration + +import ( + "context" + + "github.com/SigNoz/signoz/pkg/factory" + "github.com/SigNoz/signoz/pkg/types" + "github.com/SigNoz/signoz/pkg/types/telemetrytypes" + "github.com/uptrace/bun" + "github.com/uptrace/bun/migrate" +) + +type addVirtualFields struct{} + +func NewAddVirtualFieldsFactory() factory.ProviderFactory[SQLMigration, Config] { + return factory.NewProviderFactory(factory.MustNewName("add_virtual_fields"), newAddVirtualFields) +} + +func newAddVirtualFields(_ context.Context, _ factory.ProviderSettings, _ Config) (SQLMigration, error) { + return &addVirtualFields{}, nil +} + +func (migration *addVirtualFields) Register(migrations *migrate.Migrations) error { + if err := migrations.Register(migration.Up, migration.Down); err != nil { + return err + } + + return nil +} + +func (migration *addVirtualFields) Up(ctx context.Context, db *bun.DB) error { + // table:virtual_field op:create + if _, err := db.NewCreateTable(). + Model(&struct { + bun.BaseModel `bun:"table:virtual_field"` + + types.Identifiable + types.TimeAuditable + types.UserAuditable + + Name string `bun:"name,type:text,notnull"` + Expression string `bun:"expression,type:text,notnull"` + Description string `bun:"description,type:text"` + Signal telemetrytypes.Signal `bun:"signal,type:text,notnull"` + OrgID string `bun:"org_id,type:text,notnull"` + }{}). + ForeignKey(`("org_id") REFERENCES "organizations" ("id") ON DELETE CASCADE`). + IfNotExists(). + Exec(ctx); err != nil { + return err + } + + return nil +} + +func (migration *addVirtualFields) Down(ctx context.Context, db *bun.DB) error { + return nil +} diff --git a/pkg/types/telemetrytypes/virtualfield.go b/pkg/types/telemetrytypes/virtualfield.go new file mode 100644 index 0000000000..9ee49d935e --- /dev/null +++ b/pkg/types/telemetrytypes/virtualfield.go @@ -0,0 +1,21 @@ +package telemetrytypes + +import ( + "github.com/SigNoz/signoz/pkg/types" + "github.com/SigNoz/signoz/pkg/valuer" + "github.com/uptrace/bun" +) + +type VirtualField struct { + bun.BaseModel `bun:"table:virtual_field"` + + types.Identifiable + types.TimeAuditable + types.UserAuditable + + Name string `bun:"name,type:text,notnull" json:"name"` + Expression string `bun:"expression,type:text,notnull" json:"expression"` + Description string `bun:"description,type:text" json:"description"` + Signal Signal `bun:"signal,type:text,notnull" json:"signal"` + OrgID valuer.UUID `bun:"org_id,type:text,notnull" json:"orgId"` +}