From 058b4c04d5b335f36923f901cd10f7df1ba189e0 Mon Sep 17 00:00:00 2001 From: Raj Date: Wed, 29 Nov 2023 09:58:37 +0530 Subject: [PATCH] chore: postable pipeline validation for time parser --- .../app/logparsingpipeline/pipelineBuilder.go | 3 +- .../logparsingpipeline/postablePipeline.go | 22 ++++++++++ .../postablePipeline_test.go | 42 +++++++++++++++++++ 3 files changed, 66 insertions(+), 1 deletion(-) diff --git a/pkg/query-service/app/logparsingpipeline/pipelineBuilder.go b/pkg/query-service/app/logparsingpipeline/pipelineBuilder.go index 3353c607dfb..d20430e0a65 100644 --- a/pkg/query-service/app/logparsingpipeline/pipelineBuilder.go +++ b/pkg/query-service/app/logparsingpipeline/pipelineBuilder.go @@ -133,11 +133,12 @@ func getOperators(ops []PipelineOperator) ([]PipelineOperator, error) { } operator.If = fmt.Sprintf( - `%s && %s matches "%s"`, operator.If, parseFromPath, valueRegex, + `%s && string(%s) matches "%s"`, operator.If, parseFromPath, valueRegex, ) } // TODO(Raj): Maybe add support for gotime too eventually + operator.OnError = "send" } filteredOp = append(filteredOp, operator) diff --git a/pkg/query-service/app/logparsingpipeline/postablePipeline.go b/pkg/query-service/app/logparsingpipeline/postablePipeline.go index 472303b527f..743e777f1a5 100644 --- a/pkg/query-service/app/logparsingpipeline/postablePipeline.go +++ b/pkg/query-service/app/logparsingpipeline/postablePipeline.go @@ -8,6 +8,7 @@ import ( v3 "go.signoz.io/signoz/pkg/query-service/model/v3" "go.signoz.io/signoz/pkg/query-service/queryBuilderToExpr" + "golang.org/x/exp/slices" ) // PostablePipelines are a list of user defined pielines @@ -164,6 +165,27 @@ func isValidOperator(op PipelineOperator) error { if len(op.Fields) == 0 { return fmt.Errorf(fmt.Sprintf("fields of %s retain operator cannot be empty", op.ID)) } + + case "time_parser": + if op.ParseFrom == "" { + return fmt.Errorf(fmt.Sprintf("parse from of time parsing processor %s cannot be empty", op.ID)) + } + if op.LayoutType != "epoch" && op.LayoutType != "strptime" { + return fmt.Errorf(fmt.Sprintf( + "invalid format type '%s' of time parsing processor %s", op.LayoutType, op.ID, + )) + } + if op.Layout == "" { + return fmt.Errorf(fmt.Sprintf("format can not be empty for time parsing processor %s", op.ID)) + } + + validEpochLayouts := []string{"s", "ms", "us", "ns", "s.ms", "s.us", "s.ns"} + if op.LayoutType == "epoch" && !slices.Contains(validEpochLayouts, op.Layout) { + return fmt.Errorf(fmt.Sprintf( + "invalid epoch format '%s' of time parsing processor %s", op.LayoutType, op.ID, + )) + } + default: return fmt.Errorf(fmt.Sprintf("operator type %s not supported for %s, use one of (grok_parser, regex_parser, copy, move, add, remove, trace_parser, retain)", op.Type, op.ID)) } diff --git a/pkg/query-service/app/logparsingpipeline/postablePipeline_test.go b/pkg/query-service/app/logparsingpipeline/postablePipeline_test.go index d2f9ec9b093..ce6d4bfc55f 100644 --- a/pkg/query-service/app/logparsingpipeline/postablePipeline_test.go +++ b/pkg/query-service/app/logparsingpipeline/postablePipeline_test.go @@ -275,6 +275,48 @@ var operatorTest = []struct { }, }, IsValid: false, + }, { + Name: "Timestamp Parser - valid", + Operator: PipelineOperator{ + ID: "time", + Type: "time_parser", + ParseFrom: "attributes.test_timestamp", + LayoutType: "epoch", + Layout: "s", + }, + IsValid: true, + }, { + Name: "Timestamp Parser - invalid - bad parsefrom attribute", + Operator: PipelineOperator{ + ID: "time", + Type: "time_parser", + ParseFrom: "timestamp", + LayoutType: "epoch", + Layout: "s", + }, + IsValid: false, + }, { + Name: "Timestamp Parser - unsupported layout_type", + Operator: PipelineOperator{ + ID: "time", + Type: "time_parser", + ParseFrom: "attributes.test_timestamp", + // TODO(Raj): Maybe add support for gotime format + LayoutType: "gotime", + Layout: "Mon Jan 2 15:04:05 -0700 MST 2006", + }, + IsValid: false, + }, { + Name: "Timestamp Parser - invalid epoch layout", + Operator: PipelineOperator{ + ID: "time", + Type: "time_parser", + ParseFrom: "attributes.test_timestamp", + // TODO(Raj): Maybe add support for gotime format + LayoutType: "epoch", + Layout: "%Y-%m-%d", + }, + IsValid: false, }, }