1010
1111import io .grpc .Status ;
1212import io .grpc .StatusRuntimeException ;
13+ import java .util .List ;
1314import java .util .Objects ;
1415import java .util .Optional ;
1516import org .hypertrace .core .grpcutils .context .RequestContext ;
1819import org .hypertrace .span .processing .config .service .v1 .ExcludeSpanRuleInfo ;
1920import org .hypertrace .span .processing .config .service .v1 .Field ;
2021import org .hypertrace .span .processing .config .service .v1 .GetAllExcludeSpanRulesRequest ;
22+ import org .hypertrace .span .processing .config .service .v1 .LogicalOperator ;
23+ import org .hypertrace .span .processing .config .service .v1 .LogicalSpanFilterExpression ;
2124import org .hypertrace .span .processing .config .service .v1 .RelationalOperator ;
2225import org .hypertrace .span .processing .config .service .v1 .RelationalSpanFilterExpression ;
2326import org .hypertrace .span .processing .config .service .v1 .SpanFilter ;
@@ -107,6 +110,36 @@ void validatesExcludeSpanRuleCreateRequest() {
107110 .build ())
108111 .build ()));
109112
113+ assertInvalidArgStatusContaining (
114+ "Invalid Regex pattern" ,
115+ () ->
116+ validator .validateOrThrow (
117+ mockRequestContext ,
118+ CreateExcludeSpanRuleRequest .newBuilder ()
119+ .setRuleInfo (
120+ ExcludeSpanRuleInfo .newBuilder ()
121+ .setName ("name" )
122+ .setDisabled (true )
123+ .setFilter (buildInvalidRegexTestFilterWithAndOperator ())
124+ .setType (RULE_TYPE_USER )
125+ .build ())
126+ .build ()));
127+
128+ assertInvalidArgStatusContaining (
129+ "Invalid Regex pattern" ,
130+ () ->
131+ validator .validateOrThrow (
132+ mockRequestContext ,
133+ CreateExcludeSpanRuleRequest .newBuilder ()
134+ .setRuleInfo (
135+ ExcludeSpanRuleInfo .newBuilder ()
136+ .setName ("name" )
137+ .setDisabled (true )
138+ .setFilter (buildInvalidRegexTestFilterWithOrOperator ())
139+ .setType (RULE_TYPE_USER )
140+ .build ())
141+ .build ()));
142+
110143 assertDoesNotThrow (
111144 () ->
112145 validator .validateOrThrow (
@@ -120,6 +153,35 @@ void validatesExcludeSpanRuleCreateRequest() {
120153 .setType (RULE_TYPE_USER )
121154 .build ())
122155 .build ()));
156+
157+ assertInvalidArgStatusContaining (
158+ "LogicalSpanFilterExpression.operands" ,
159+ () ->
160+ validator .validateOrThrow (
161+ mockRequestContext ,
162+ CreateExcludeSpanRuleRequest .newBuilder ()
163+ .setRuleInfo (
164+ ExcludeSpanRuleInfo .newBuilder ()
165+ .setName ("name" )
166+ .setDisabled (true )
167+ .setFilter (buildTestLogicalFilterWithNoOperands ())
168+ .setType (RULE_TYPE_USER )
169+ .build ())
170+ .build ()));
171+
172+ assertDoesNotThrow (
173+ () ->
174+ validator .validateOrThrow (
175+ mockRequestContext ,
176+ CreateExcludeSpanRuleRequest .newBuilder ()
177+ .setRuleInfo (
178+ ExcludeSpanRuleInfo .newBuilder ()
179+ .setName ("name" )
180+ .setDisabled (true )
181+ .setFilter (buildRegexTestFilterWithOrOperator ())
182+ .setType (RULE_TYPE_USER )
183+ .build ())
184+ .build ()));
123185 }
124186
125187 @ Test
@@ -182,4 +244,91 @@ private SpanFilter buildTestFilter() {
182244 .build ())
183245 .build ();
184246 }
247+
248+ private SpanFilter buildInvalidRegexTestFilterWithAndOperator () {
249+ return SpanFilter .newBuilder ()
250+ .setLogicalSpanFilter (
251+ LogicalSpanFilterExpression .newBuilder ()
252+ .setOperator (LogicalOperator .LOGICAL_OPERATOR_AND )
253+ .addAllOperands (
254+ List .of (
255+ SpanFilter .newBuilder ()
256+ .setRelationalSpanFilter (
257+ RelationalSpanFilterExpression .newBuilder ()
258+ .setField (Field .FIELD_SERVICE_NAME )
259+ .setOperator (RelationalOperator .RELATIONAL_OPERATOR_CONTAINS )
260+ .setRightOperand (
261+ SpanFilterValue .newBuilder ().setStringValue ("a" )))
262+ .build (),
263+ SpanFilter .newBuilder ()
264+ .setRelationalSpanFilter (
265+ RelationalSpanFilterExpression .newBuilder ()
266+ .setField (Field .FIELD_SERVICE_NAME )
267+ .setOperator (RelationalOperator .RELATIONAL_OPERATOR_REGEX_MATCH )
268+ .setRightOperand (
269+ SpanFilterValue .newBuilder ().setStringValue ("[(test" )))
270+ .build ())))
271+ .build ();
272+ }
273+
274+ private SpanFilter buildInvalidRegexTestFilterWithOrOperator () {
275+ return SpanFilter .newBuilder ()
276+ .setLogicalSpanFilter (
277+ LogicalSpanFilterExpression .newBuilder ()
278+ .setOperator (LogicalOperator .LOGICAL_OPERATOR_OR )
279+ .addAllOperands (
280+ List .of (
281+ SpanFilter .newBuilder ()
282+ .setRelationalSpanFilter (
283+ RelationalSpanFilterExpression .newBuilder ()
284+ .setField (Field .FIELD_SERVICE_NAME )
285+ .setOperator (RelationalOperator .RELATIONAL_OPERATOR_CONTAINS )
286+ .setRightOperand (
287+ SpanFilterValue .newBuilder ().setStringValue ("a" )))
288+ .build (),
289+ SpanFilter .newBuilder ()
290+ .setRelationalSpanFilter (
291+ RelationalSpanFilterExpression .newBuilder ()
292+ .setField (Field .FIELD_SERVICE_NAME )
293+ .setOperator (RelationalOperator .RELATIONAL_OPERATOR_REGEX_MATCH )
294+ .setRightOperand (
295+ SpanFilterValue .newBuilder ().setStringValue ("[(test" )))
296+ .build ())))
297+ .build ();
298+ }
299+
300+ private SpanFilter buildRegexTestFilterWithOrOperator () {
301+ return SpanFilter .newBuilder ()
302+ .setLogicalSpanFilter (
303+ LogicalSpanFilterExpression .newBuilder ()
304+ .setOperator (LogicalOperator .LOGICAL_OPERATOR_OR )
305+ .addAllOperands (
306+ List .of (
307+ SpanFilter .newBuilder ()
308+ .setRelationalSpanFilter (
309+ RelationalSpanFilterExpression .newBuilder ()
310+ .setField (Field .FIELD_SERVICE_NAME )
311+ .setOperator (RelationalOperator .RELATIONAL_OPERATOR_CONTAINS )
312+ .setRightOperand (
313+ SpanFilterValue .newBuilder ().setStringValue ("a" )))
314+ .build (),
315+ SpanFilter .newBuilder ()
316+ .setRelationalSpanFilter (
317+ RelationalSpanFilterExpression .newBuilder ()
318+ .setField (Field .FIELD_SERVICE_NAME )
319+ .setOperator (RelationalOperator .RELATIONAL_OPERATOR_REGEX_MATCH )
320+ .setRightOperand (
321+ SpanFilterValue .newBuilder ().setStringValue (".*test" )))
322+ .build ())))
323+ .build ();
324+ }
325+
326+ private SpanFilter buildTestLogicalFilterWithNoOperands () {
327+ return SpanFilter .newBuilder ()
328+ .setLogicalSpanFilter (
329+ LogicalSpanFilterExpression .newBuilder ()
330+ .setOperator (LogicalOperator .LOGICAL_OPERATOR_OR )
331+ .addAllOperands (List .of ()))
332+ .build ();
333+ }
185334}
0 commit comments