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 }