diff --git a/pkg/query-service/app/logparsingpipeline/pipelineBuilder.go b/pkg/query-service/app/logparsingpipeline/pipelineBuilder.go index e0bfac7fb5..e8b4bf1fb9 100644 --- a/pkg/query-service/app/logparsingpipeline/pipelineBuilder.go +++ b/pkg/query-service/app/logparsingpipeline/pipelineBuilder.go @@ -131,10 +131,8 @@ func getOperators(ops []pipelinetypes.PipelineOperator) ([]pipelinetypes.Pipelin ) } operator.If = fmt.Sprintf( - `%s && ( - (typeOf(%s) == "string" && %s matches "^\\s*{.*}\\s*$" ) || - typeOf(%s) == "map[string]any" - )`, parseFromNotNilCheck, operator.ParseFrom, operator.ParseFrom, operator.ParseFrom, + `%s && ((type(%s) == "string" && %s matches "^\\s*{.*}\\s*$" ) || type(%s) == "map")`, + parseFromNotNilCheck, operator.ParseFrom, operator.ParseFrom, operator.ParseFrom, ) } else if operator.Type == "add" { if strings.HasPrefix(operator.Value, "EXPR(") && strings.HasSuffix(operator.Value, ")") { diff --git a/pkg/query-service/queryBuilderToExpr/queryBuilderToExpr.go b/pkg/query-service/queryBuilderToExpr/queryBuilderToExpr.go index 692a450cc5..bb570c3dec 100644 --- a/pkg/query-service/queryBuilderToExpr/queryBuilderToExpr.go +++ b/pkg/query-service/queryBuilderToExpr/queryBuilderToExpr.go @@ -63,8 +63,14 @@ func Parse(filters *v3.FilterSet) (string, error) { // filter = fmt.Sprintf("%s %s list%s", name, logOperatorsToExpr[v.Operator], exprFormattedValue(v.Value)) case v3.FilterOperatorExists, v3.FilterOperatorNotExists: - filter = fmt.Sprintf("%s %s %s", exprFormattedValue(v.Key.Key), logOperatorsToExpr[v.Operator], getTypeName(v.Key.Type)) - + // accustom log filters like `body.log.message EXISTS` into EXPR language + // where User is attempting to check for keys present in JSON log body + key, found := strings.CutPrefix(v.Key.Key, "body.") + if found { + filter = fmt.Sprintf("%s %s %s", exprFormattedValue(key), logOperatorsToExpr[v.Operator], "fromJSON(body)") + } else { + filter = fmt.Sprintf("%s %s %s", exprFormattedValue(v.Key.Key), logOperatorsToExpr[v.Operator], getTypeName(v.Key.Type)) + } default: filter = fmt.Sprintf("%s %s %s", name, logOperatorsToExpr[v.Operator], exprFormattedValue(v.Value))