@@ -23,6 +23,19 @@ const (
2323
2424var errInvalidWeightParams = errors .New ("invalid argument for the Weight predicate" )
2525
26+ type invalidDefinitionError string
27+
28+ func (e invalidDefinitionError ) Error () string { return string (e ) }
29+ func (e invalidDefinitionError ) Code () string { return string (e ) }
30+
31+ var (
32+ errUnknownFilter = invalidDefinitionError ("unknown_filter" )
33+ errInvalidFilterParams = invalidDefinitionError ("invalid_filter_params" )
34+ errUnknownPredicate = invalidDefinitionError ("unknown_predicate" )
35+ errInvalidPredicateParams = invalidDefinitionError ("invalid_predicate_params" )
36+ errFailedBackendSplit = invalidDefinitionError ("failed_backend_split" )
37+ )
38+
2639func (it incomingType ) String () string {
2740 switch it {
2841 case incomingReset :
@@ -219,26 +232,26 @@ func createFilter(o *Options, def *eskip.Filter, cpm map[string]PredicateSpec) (
219232 spec , ok := o .FilterRegistry [def .Name ]
220233 if ! ok {
221234 if isTreePredicate (def .Name ) || def .Name == predicates .HostName || def .Name == predicates .PathRegexpName || def .Name == predicates .MethodName || def .Name == predicates .HeaderName || def .Name == predicates .HeaderRegexpName {
222- return nil , fmt .Errorf ("trying to use %q as filter, but it is only available as predicate" , def .Name )
235+ return nil , fmt .Errorf ("%w: trying to use %q as filter, but it is only available as predicate" , errUnknownFilter , def .Name )
223236 }
224237
225238 if _ , ok := cpm [def .Name ]; ok {
226- return nil , fmt .Errorf ("trying to use %q as filter, but it is only available as predicate" , def .Name )
239+ return nil , fmt .Errorf ("%w: trying to use %q as filter, but it is only available as predicate" , errUnknownFilter , def .Name )
227240 }
228241
229- return nil , fmt .Errorf ("filter %q not found" , def .Name )
242+ return nil , fmt .Errorf ("%w: filter %q not found" , errUnknownFilter , def .Name )
230243 }
231244
232245 start := time .Now ()
233246
234247 f , err := spec .CreateFilter (def .Args )
235248
236- if o .Metrics != nil { // measure regardless of the error
249+ if o .Metrics != nil {
237250 o .Metrics .MeasureFilterCreate (def .Name , start )
238251 }
239252
240253 if err != nil {
241- return nil , fmt .Errorf ("failed to create filter %q: %w" , spec .Name (), err )
254+ return nil , fmt .Errorf ("%w: failed to create filter %q: %w" , errInvalidFilterParams , spec .Name (), err )
242255 }
243256 return f , nil
244257}
@@ -370,7 +383,7 @@ func parseWeightPredicateArgs(args []interface{}) (int, error) {
370383}
371384
372385// initialize predicate instances from their spec with the concrete arguments
373- func processPredicates (cpm map [string ]PredicateSpec , defs []* eskip.Predicate ) ([]Predicate , int , error ) {
386+ func processPredicates (o * Options , cpm map [string ]PredicateSpec , defs []* eskip.Predicate ) ([]Predicate , int , error ) {
374387 cps := make ([]Predicate , 0 , len (defs ))
375388 var weight int
376389 for _ , def := range defs {
@@ -379,7 +392,7 @@ func processPredicates(cpm map[string]PredicateSpec, defs []*eskip.Predicate) ([
379392 var err error
380393
381394 if w , err = parseWeightPredicateArgs (def .Args ); err != nil {
382- return nil , 0 , err
395+ return nil , 0 , fmt . Errorf ( "%w: %w" , errInvalidPredicateParams , err )
383396 }
384397
385398 weight += w
@@ -393,12 +406,12 @@ func processPredicates(cpm map[string]PredicateSpec, defs []*eskip.Predicate) ([
393406
394407 spec , ok := cpm [def .Name ]
395408 if ! ok {
396- return nil , 0 , fmt .Errorf ("predicate %q not found" , def .Name )
409+ return nil , 0 , fmt .Errorf ("%w: predicate %q not found" , errUnknownPredicate , def .Name )
397410 }
398411
399412 cp , err := spec .Create (def .Args )
400413 if err != nil {
401- return nil , 0 , fmt .Errorf ("failed to create predicate %q: %w" , spec .Name (), err )
414+ return nil , 0 , fmt .Errorf ("%w: failed to create predicate %q: %w" , errInvalidPredicateParams , spec .Name (), err )
402415 }
403416
404417 if ws , ok := spec .(WeightedPredicateSpec ); ok {
@@ -473,7 +486,7 @@ func processTreePredicates(r *Route, predicateList []*eskip.Predicate) error {
473486func processRouteDef (o * Options , cpm map [string ]PredicateSpec , def * eskip.Route ) (* Route , error ) {
474487 scheme , host , err := splitBackend (def )
475488 if err != nil {
476- return nil , err
489+ return nil , fmt . Errorf ( "%w: %w" , errFailedBackendSplit , err )
477490 }
478491
479492 fs , err := createFilters (o , def .Filters , cpm )
@@ -486,7 +499,7 @@ func processRouteDef(o *Options, cpm map[string]PredicateSpec, def *eskip.Route)
486499 return nil , err
487500 }
488501
489- cps , weight , err := processPredicates (cpm , def .Predicates )
502+ cps , weight , err := processPredicates (o , cpm , def .Predicates )
490503 if err != nil {
491504 return nil , err
492505 }
@@ -496,6 +509,10 @@ func processRouteDef(o *Options, cpm map[string]PredicateSpec, def *eskip.Route)
496509 return nil , err
497510 }
498511
512+ if o .Metrics != nil {
513+ o .Metrics .IncValidRoutes ()
514+ }
515+
499516 return r , nil
500517}
501518
@@ -519,6 +536,13 @@ func processRouteDefs(o *Options, defs []*eskip.Route) (routes []*Route, invalid
519536 } else {
520537 invalidDefs = append (invalidDefs , def )
521538 o .Log .Errorf ("failed to process route %s: %v" , def .Id , err )
539+
540+ var defErr invalidDefinitionError
541+ if errors .As (err , & defErr ) && o .Metrics != nil {
542+ o .Metrics .IncInvalidRoutes (defErr .Code ())
543+ } else if o .Metrics != nil {
544+ o .Metrics .IncInvalidRoutes ("other" )
545+ }
522546 }
523547 }
524548 return
0 commit comments