github.com/google/cloudprober@v0.11.3/rds/server/filter/filter.go (about) 1 // Copyright 2017-2018 The Cloudprober Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 /* 16 Package filter implements common filters for the RDS (resource discovery 17 service) providers. 18 */ 19 package filter 20 21 import ( 22 "regexp" 23 "time" 24 25 "github.com/google/cloudprober/logger" 26 ) 27 28 // RegexFilter implements a regex based filter. 29 type RegexFilter struct { 30 re *regexp.Regexp 31 } 32 33 // NewRegexFilter returns a new regex filter. 34 func NewRegexFilter(regexStr string) (*RegexFilter, error) { 35 re, err := regexp.Compile(regexStr) 36 if err != nil { 37 return nil, err 38 } 39 40 return &RegexFilter{re}, nil 41 } 42 43 // Match returns true if provided string matches the regex of the filter. 44 // Otherwise, false is returned. 45 func (rf *RegexFilter) Match(name string, l *logger.Logger) bool { 46 return rf.re.MatchString(name) 47 } 48 49 // LabelsFilter implements a filter on resource's labels. 50 type LabelsFilter struct { 51 labels map[string]*regexp.Regexp 52 } 53 54 // NewLabelsFilter builds LabelsFilter from a key:regexp map. 55 func NewLabelsFilter(labelsFilter map[string]string) (*LabelsFilter, error) { 56 labels := make(map[string]*regexp.Regexp) 57 58 for key, regexStr := range labelsFilter { 59 re, err := regexp.Compile(regexStr) 60 if err != nil { 61 return nil, err 62 } 63 labels[key] = re 64 } 65 66 return &LabelsFilter{labels: labels}, nil 67 } 68 69 // Match returns true if provided string matches the regex of the filter. 70 // Otherwise, false is returned. 71 func (lf *LabelsFilter) Match(inputLabels map[string]string, l *logger.Logger) bool { 72 for k, re := range lf.labels { 73 // If input labels don't have the requisite key or key's value doesn't match 74 // the given regex, return false. 75 if v, ok := inputLabels[k]; !ok || !re.MatchString(v) { 76 return false 77 } 78 } 79 return true 80 } 81 82 // FreshnessFilter implements a filter that succeeds only if the given time 83 // is within a pre-defined duration. 84 type FreshnessFilter struct { 85 d time.Duration 86 } 87 88 // NewFreshnessFilter returns a new freshness filter. 89 func NewFreshnessFilter(dStr string) (*FreshnessFilter, error) { 90 d, err := time.ParseDuration(dStr) 91 return &FreshnessFilter{d}, err 92 } 93 94 // Match returns true if the given time is within a pre-defined duration. 95 func (ff *FreshnessFilter) Match(t time.Time, l *logger.Logger) bool { 96 return time.Since(t) < ff.d 97 }