github.com/grafana/pyroscope@v1.18.0/pkg/og/convert/parser.go (about)

     1  package convert
     2  
     3  import (
     4  	"bufio"
     5  	"bytes"
     6  	"io"
     7  	"strconv"
     8  
     9  	"github.com/grafana/pyroscope/pkg/og/storage/tree"
    10  )
    11  
    12  func ParseTreeNoDict(r io.Reader, cb func(name []byte, val int)) error {
    13  	t, err := tree.DeserializeNoDict(r)
    14  	if err != nil {
    15  		return err
    16  	}
    17  	t.Iterate(func(name []byte, val uint64) {
    18  		if len(name) > 2 && val != 0 {
    19  			cb(name[2:], int(val))
    20  		}
    21  	})
    22  	return nil
    23  }
    24  
    25  var gzipMagicBytes = []byte{0x1f, 0x8b}
    26  
    27  // format:
    28  // stack-trace-foo 1
    29  // stack-trace-bar 2
    30  func ParseGroups(r io.Reader, cb func(name []byte, val int)) error {
    31  	scanner := bufio.NewScanner(r)
    32  	for scanner.Scan() {
    33  		if err := scanner.Err(); err != nil {
    34  			return err
    35  		}
    36  
    37  		line := scanner.Bytes()
    38  		line2 := make([]byte, len(line))
    39  		copy(line2, line)
    40  
    41  		index := bytes.LastIndexByte(line2, byte(' '))
    42  		if index == -1 {
    43  			continue
    44  		}
    45  		stacktrace := line2[:index]
    46  		count := line2[index+1:]
    47  
    48  		i, err := strconv.Atoi(string(count))
    49  		if err != nil {
    50  			return err
    51  		}
    52  		cb(stacktrace, i)
    53  	}
    54  	return nil
    55  }
    56  
    57  // format:
    58  // stack-trace-foo
    59  // stack-trace-bar
    60  // stack-trace-bar
    61  func ParseIndividualLines(r io.Reader, cb func(name []byte, val int)) error {
    62  	groups := make(map[string]int)
    63  	scanner := bufio.NewScanner(r)
    64  	// scanner.Buffer(make([]byte, bufio.MaxScanTokenSize*100), bufio.MaxScanTokenSize*100)
    65  	// scanner.Split(bufio.ScanLines)
    66  	for scanner.Scan() {
    67  		if err := scanner.Err(); err != nil {
    68  			return err
    69  		}
    70  		key := scanner.Text()
    71  		if _, ok := groups[key]; !ok {
    72  			groups[key] = 0
    73  		}
    74  		groups[key]++
    75  	}
    76  
    77  	if err := scanner.Err(); err != nil {
    78  		return err
    79  	}
    80  
    81  	for k, v := range groups {
    82  		if k != "" {
    83  			cb([]byte(k), v)
    84  		}
    85  	}
    86  
    87  	return nil
    88  }