diff options
Diffstat (limited to 'src/cmd/vendor/github.com/google/pprof/profile/encode.go')
| -rw-r--r-- | src/cmd/vendor/github.com/google/pprof/profile/encode.go | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/src/cmd/vendor/github.com/google/pprof/profile/encode.go b/src/cmd/vendor/github.com/google/pprof/profile/encode.go index c64083a400..622319484a 100644 --- a/src/cmd/vendor/github.com/google/pprof/profile/encode.go +++ b/src/cmd/vendor/github.com/google/pprof/profile/encode.go @@ -59,12 +59,19 @@ func (p *Profile) preEncode() { } sort.Strings(numKeys) for _, k := range numKeys { + keyX := addString(strings, k) vs := s.NumLabel[k] - for _, v := range vs { + units := s.NumUnit[k] + for i, v := range vs { + var unitX int64 + if len(units) != 0 { + unitX = addString(strings, units[i]) + } s.labelX = append(s.labelX, label{ - keyX: addString(strings, k), - numX: v, + keyX: keyX, + numX: v, + unitX: unitX, }, ) } @@ -289,6 +296,7 @@ func (p *Profile) postDecode() error { for _, s := range p.Sample { labels := make(map[string][]string, len(s.labelX)) numLabels := make(map[string][]int64, len(s.labelX)) + numUnits := make(map[string][]string, len(s.labelX)) for _, l := range s.labelX { var key, value string key, err = getString(p.stringTable, &l.keyX, err) @@ -296,6 +304,14 @@ func (p *Profile) postDecode() error { value, err = getString(p.stringTable, &l.strX, err) labels[key] = append(labels[key], value) } else if l.numX != 0 { + numValues := numLabels[key] + units := numUnits[key] + if l.unitX != 0 { + var unit string + unit, err = getString(p.stringTable, &l.unitX, err) + units = padStringArray(units, len(numValues)) + numUnits[key] = append(units, unit) + } numLabels[key] = append(numLabels[key], l.numX) } } @@ -304,6 +320,12 @@ func (p *Profile) postDecode() error { } if len(numLabels) > 0 { s.NumLabel = numLabels + for key, units := range numUnits { + if len(units) > 0 { + numUnits[key] = padStringArray(units, len(numLabels[key])) + } + } + s.NumUnit = numUnits } s.Location = make([]*Location, len(s.locationIDX)) for i, lid := range s.locationIDX { @@ -340,6 +362,15 @@ func (p *Profile) postDecode() error { return err } +// padStringArray pads arr with enough empty strings to make arr +// length l when arr's length is less than l. +func padStringArray(arr []string, l int) []string { + if l <= len(arr) { + return arr + } + return append(arr, make([]string, l-len(arr))...) +} + func (p *ValueType) decoder() []decoder { return valueTypeDecoder } @@ -392,6 +423,7 @@ func (p label) encode(b *buffer) { encodeInt64Opt(b, 1, p.keyX) encodeInt64Opt(b, 2, p.strX) encodeInt64Opt(b, 3, p.numX) + encodeInt64Opt(b, 4, p.unitX) } var labelDecoder = []decoder{ @@ -402,6 +434,8 @@ var labelDecoder = []decoder{ func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).strX) }, // optional int64 num = 3 func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).numX) }, + // optional int64 num = 4 + func(b *buffer, m message) error { return decodeInt64(b, &m.(*label).unitX) }, } func (p *Mapping) decoder() []decoder { |
