in pkg/exporter/probe/tracepacketloss/packetloss.go [370:428]
func (p *packetLossProbe) perfLoop() {
for {
anotherLoop:
record, err := p.perfReader.Read()
if err != nil {
if errors.Is(err, ringbuf.ErrClosed) {
log.Infof("%s received signal, exiting..", probeName)
return
}
log.Errorf("%s failed reading from reader, err: %v", probeName, err)
continue
}
if record.LostSamples != 0 {
log.Warnf("%s perf event ring buffer full, drop: %d", probeName, record.LostSamples)
continue
}
var event bpfInspPlEventT
if err := binary.Read(bytes.NewBuffer(record.RawSample), binary.NativeEndian, &event); err != nil {
log.Errorf("%s failed parsing event, err: %v", probeName, err)
continue
}
if ignoreLocation(event.Location) {
continue
}
tuple := toProbeTuple(&event.Tuple)
p.add2Cache(event.Location, tuple)
evt := &probe.Event{
Timestamp: time.Now().UnixNano(),
Type: PacketLoss,
Labels: probe.BuildTupleEventLabels(tuple),
}
if p.enableStack() {
stacks, err := bpfutil.GetSymsByStack(uint32(event.StackId), p.objs.InspPlStack)
if err != nil {
log.Warnf("%s failed get sym by stack, err: %v", probeName, err)
continue
}
var strs []string
for _, sym := range stacks {
if _, ok := ignoreSymbolList[sym.GetName()]; ok {
goto anotherLoop
}
strs = append(strs, sym.GetExpr())
}
evt.Message = strings.Join(strs, "\n")
}
if p.sink != nil {
p.sink <- evt
}
}
}