Source file src/internal/profile/filter.go

     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  }
    55  

View as plain text