github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/internal/profile/filter.go (about) 1 // Copyright 2014 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Implements methods to filter samples from profiles. 6 7 package profile 8 9 // TagMatch selects tags for filtering 10 type TagMatch func(key, val string, nval int64) bool 11 12 // FilterSamplesByTag removes all samples from the profile, except 13 // those that match focus and do not match the ignore regular 14 // expression. 15 func (p *Profile) FilterSamplesByTag(focus, ignore TagMatch) (fm, im bool) { 16 samples := make([]*Sample, 0, len(p.Sample)) 17 for _, s := range p.Sample { 18 focused, ignored := focusedSample(s, focus, ignore) 19 fm = fm || focused 20 im = im || ignored 21 if focused && !ignored { 22 samples = append(samples, s) 23 } 24 } 25 p.Sample = samples 26 return 27 } 28 29 // focusedSample checks a sample against focus and ignore regexps. 30 // Returns whether the focus/ignore regexps match any tags. 31 func focusedSample(s *Sample, focus, ignore TagMatch) (fm, im bool) { 32 fm = focus == nil 33 for key, vals := range s.Label { 34 for _, val := range vals { 35 if ignore != nil && ignore(key, val, 0) { 36 im = true 37 } 38 if !fm && focus(key, val, 0) { 39 fm = true 40 } 41 } 42 } 43 for key, vals := range s.NumLabel { 44 for _, val := range vals { 45 if ignore != nil && ignore(key, "", val) { 46 im = true 47 } 48 if !fm && focus(key, "", val) { 49 fm = true 50 } 51 } 52 } 53 return fm, im 54 }