func()

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
		}
	}
}