11package encode
22
33import (
4- "fmt"
54 "regexp"
6- "strings"
75
86 "github.com/netobserv/flowlogs-pipeline/pkg/api"
9- "github.com/netobserv/flowlogs-pipeline/pkg/config "
7+ "github.com/netobserv/flowlogs-pipeline/pkg/utils/filters "
108)
119
12- type Predicate func (flow config.GenericMap ) bool
13-
14- var variableExtractor = regexp .MustCompile (`\$\(([^\)]+)\)` )
15-
1610type MetricInfo struct {
1711 * api.MetricsItem
18- FilterPredicates []Predicate
12+ FilterPredicates []filters. Predicate
1913 MappedLabels []MappedLabel
2014}
2115
@@ -32,104 +26,25 @@ func (m *MetricInfo) TargetLabels() []string {
3226 return targetLabels
3327}
3428
35- func Presence (filter api.MetricsFilter ) Predicate {
36- return func (flow config.GenericMap ) bool {
37- _ , found := flow [filter .Key ]
38- return found
39- }
40- }
41-
42- func Absence (filter api.MetricsFilter ) Predicate {
43- return func (flow config.GenericMap ) bool {
44- _ , found := flow [filter .Key ]
45- return ! found
46- }
47- }
48-
49- func Equal (filter api.MetricsFilter ) Predicate {
50- varLookups := extractVarLookups (filter .Value )
51- return func (flow config.GenericMap ) bool {
52- if val , found := flow [filter .Key ]; found {
53- sVal , ok := val .(string )
54- if ! ok {
55- sVal = fmt .Sprint (val )
56- }
57- value := filter .Value
58- if len (varLookups ) > 0 {
59- value = injectVars (flow , value , varLookups )
60- }
61- return sVal == value
62- }
63- return false
64- }
65- }
66-
67- func NotEqual (filter api.MetricsFilter ) Predicate {
68- pred := Equal (filter )
69- return func (flow config.GenericMap ) bool { return ! pred (flow ) }
70- }
71-
72- func Regex (filter api.MetricsFilter ) Predicate {
73- r , _ := regexp .Compile (filter .Value )
74- return func (flow config.GenericMap ) bool {
75- if val , found := flow [filter .Key ]; found {
76- sVal , ok := val .(string )
77- if ! ok {
78- sVal = fmt .Sprint (val )
79- }
80- return r .MatchString (sVal )
81- }
82- return false
83- }
84- }
85-
86- func NotRegex (filter api.MetricsFilter ) Predicate {
87- pred := Regex (filter )
88- return func (flow config.GenericMap ) bool { return ! pred (flow ) }
89- }
90-
91- func filterToPredicate (filter api.MetricsFilter ) Predicate {
29+ func filterToPredicate (filter api.MetricsFilter ) filters.Predicate {
9230 switch filter .Type {
9331 case api .MetricFilterEqual :
94- return Equal (filter )
32+ return filters . Equal (filter . Key , filter . Value , true )
9533 case api .MetricFilterNotEqual :
96- return NotEqual (filter )
34+ return filters . NotEqual (filter . Key , filter . Value , true )
9735 case api .MetricFilterPresence :
98- return Presence (filter )
36+ return filters . Presence (filter . Key )
9937 case api .MetricFilterAbsence :
100- return Absence (filter )
38+ return filters . Absence (filter . Key )
10139 case api .MetricFilterRegex :
102- return Regex (filter )
40+ r , _ := regexp .Compile (filter .Value )
41+ return filters .Regex (filter .Key , r )
10342 case api .MetricFilterNotRegex :
104- return NotRegex (filter )
43+ r , _ := regexp .Compile (filter .Value )
44+ return filters .NotRegex (filter .Key , r )
10545 }
10646 // Default = Exact
107- return Equal (filter )
108- }
109-
110- func extractVarLookups (value string ) [][]string {
111- // Extract list of variables to lookup
112- // E.g: filter "$(SrcAddr):$(SrcPort)" would return [SrcAddr,SrcPort]
113- if len (value ) > 0 {
114- return variableExtractor .FindAllStringSubmatch (value , - 1 )
115- }
116- return nil
117- }
118-
119- func injectVars (flow config.GenericMap , filterValue string , varLookups [][]string ) string {
120- injected := filterValue
121- for _ , matchGroup := range varLookups {
122- var value string
123- if rawVal , found := flow [matchGroup [1 ]]; found {
124- if sVal , ok := rawVal .(string ); ok {
125- value = sVal
126- } else {
127- value = fmt .Sprint (rawVal )
128- }
129- }
130- injected = strings .ReplaceAll (injected , matchGroup [0 ], value )
131- }
132- return injected
47+ return filters .Equal (filter .Key , filter .Value , true )
13348}
13449
13550func CreateMetricInfo (def * api.MetricsItem ) * MetricInfo {
0 commit comments