diff --git a/pkg/modules/tracefunnel/utils.go b/pkg/modules/tracefunnel/utils.go new file mode 100644 index 0000000000..a58a643d4b --- /dev/null +++ b/pkg/modules/tracefunnel/utils.go @@ -0,0 +1,56 @@ +package tracefunnel + +import ( + "fmt" + tracefunnel "github.com/SigNoz/signoz/pkg/types/tracefunnel" + "sort" +) + +// ValidateTimestamp validates a timestamp +func ValidateTimestamp(timestamp int64, fieldName string) error { + if timestamp == 0 { + return fmt.Errorf("%s is required", fieldName) + } + if timestamp < 0 { + return fmt.Errorf("%s must be positive", fieldName) + } + return nil +} + +// ValidateTimestampIsMilliseconds validates that a timestamp is in milliseconds +func ValidateTimestampIsMilliseconds(timestamp int64) bool { + return timestamp >= 1000000000000 && timestamp <= 9999999999999 +} + +func ValidateFunnelSteps(steps []tracefunnel.FunnelStep) error { + if len(steps) < 2 { + return fmt.Errorf("funnel must have at least 2 steps") + } + + for i, step := range steps { + if step.ServiceName == "" { + return fmt.Errorf("step %d: service name is required", i+1) + } + if step.SpanName == "" { + return fmt.Errorf("step %d: span name is required", i+1) + } + if step.Order < 0 { + return fmt.Errorf("step %d: order must be non-negative", i+1) + } + } + + return nil +} + +// NormalizeFunnelSteps normalizes step orders to be sequential +func NormalizeFunnelSteps(steps []tracefunnel.FunnelStep) []tracefunnel.FunnelStep { + sort.Slice(steps, func(i, j int) bool { + return steps[i].Order < steps[j].Order + }) + + for i := range steps { + steps[i].Order = int64(i + 1) + } + + return steps +}