package trace
import (
"bytes"
"encoding/binary"
"fmt"
"io"
"internal/trace/tracev2"
"internal/trace/version"
)
type timestamp uint64
type batch struct {
m ThreadID
time timestamp
data []byte
exp tracev2 .Experiment
}
func (b *batch ) isStringsBatch () bool {
return b .exp == tracev2 .NoExperiment && len (b .data ) > 0 && tracev2 .EventType (b .data [0 ]) == tracev2 .EvStrings
}
func (b *batch ) isStacksBatch () bool {
return b .exp == tracev2 .NoExperiment && len (b .data ) > 0 && tracev2 .EventType (b .data [0 ]) == tracev2 .EvStacks
}
func (b *batch ) isCPUSamplesBatch () bool {
return b .exp == tracev2 .NoExperiment && len (b .data ) > 0 && tracev2 .EventType (b .data [0 ]) == tracev2 .EvCPUSamples
}
func (b *batch ) isSyncBatch (ver version .Version ) bool {
return (b .exp == tracev2 .NoExperiment && len (b .data ) > 0 ) &&
((tracev2 .EventType (b .data [0 ]) == tracev2 .EvFrequency && ver < version .Go125 ) ||
(tracev2 .EventType (b .data [0 ]) == tracev2 .EvSync && ver >= version .Go125 ))
}
func readBatch(r interface {
io .Reader
io .ByteReader
}) (batch , uint64 , error ) {
b , err := r .ReadByte ()
if err != nil {
return batch {}, 0 , err
}
if typ := tracev2 .EventType (b ); typ != tracev2 .EvEventBatch && typ != tracev2 .EvExperimentalBatch {
return batch {}, 0 , fmt .Errorf ("expected batch event, got event %d" , typ )
}
exp := tracev2 .NoExperiment
if tracev2 .EventType (b ) == tracev2 .EvExperimentalBatch {
e , err := r .ReadByte ()
if err != nil {
return batch {}, 0 , err
}
exp = tracev2 .Experiment (e )
}
gen , err := binary .ReadUvarint (r )
if err != nil {
return batch {}, gen , fmt .Errorf ("error reading batch gen: %w" , err )
}
m , err := binary .ReadUvarint (r )
if err != nil {
return batch {}, gen , fmt .Errorf ("error reading batch M ID: %w" , err )
}
ts , err := binary .ReadUvarint (r )
if err != nil {
return batch {}, gen , fmt .Errorf ("error reading batch timestamp: %w" , err )
}
size , err := binary .ReadUvarint (r )
if err != nil {
return batch {}, gen , fmt .Errorf ("error reading batch size: %w" , err )
}
if size > tracev2 .MaxBatchSize {
return batch {}, gen , fmt .Errorf ("invalid batch size %d, maximum is %d" , size , tracev2 .MaxBatchSize )
}
var data bytes .Buffer
data .Grow (int (size ))
n , err := io .CopyN (&data , r , int64 (size ))
if n != int64 (size ) {
return batch {}, gen , fmt .Errorf ("failed to read full batch: read %d but wanted %d" , n , size )
}
if err != nil {
return batch {}, gen , fmt .Errorf ("copying batch data: %w" , err )
}
return batch {
m : ThreadID (m ),
time : timestamp (ts ),
data : data .Bytes (),
exp : exp ,
}, gen , nil
}
The pages are generated with Golds v0.7.7-preview . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .