1// Copyright 2016 Google Inc. All Rights Reserved. 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 15package profile 16 17import ( 18 "fmt" 19 "strconv" 20 "strings" 21) 22 23// SampleIndexByName returns the appropriate index for a value of sample index. 24// If numeric, it returns the number, otherwise it looks up the text in the 25// profile sample types. 26func (p *Profile) SampleIndexByName(sampleIndex string) (int, error) { 27 if sampleIndex == "" { 28 if dst := p.DefaultSampleType; dst != "" { 29 for i, t := range sampleTypes(p) { 30 if t == dst { 31 return i, nil 32 } 33 } 34 } 35 // By default select the last sample value 36 return len(p.SampleType) - 1, nil 37 } 38 if i, err := strconv.Atoi(sampleIndex); err == nil { 39 if i < 0 || i >= len(p.SampleType) { 40 return 0, fmt.Errorf("sample_index %s is outside the range [0..%d]", sampleIndex, len(p.SampleType)-1) 41 } 42 return i, nil 43 } 44 45 // Remove the inuse_ prefix to support legacy pprof options 46 // "inuse_space" and "inuse_objects" for profiles containing types 47 // "space" and "objects". 48 noInuse := strings.TrimPrefix(sampleIndex, "inuse_") 49 for i, t := range p.SampleType { 50 if t.Type == sampleIndex || t.Type == noInuse { 51 return i, nil 52 } 53 } 54 55 return 0, fmt.Errorf("sample_index %q must be one of: %v", sampleIndex, sampleTypes(p)) 56} 57 58func sampleTypes(p *Profile) []string { 59 types := make([]string, len(p.SampleType)) 60 for i, t := range p.SampleType { 61 types[i] = t.Type 62 } 63 return types 64} 65