diff --git a/exporter_benchmark_test.go b/exporter_benchmark_test.go index 9a26760..2e13627 100644 --- a/exporter_benchmark_test.go +++ b/exporter_benchmark_test.go @@ -65,6 +65,7 @@ func benchmarkUDPListener(times int, b *testing.B) { // there are more events than input lines, need bigger buffer events := make(chan event.Events, len(bytesInput)*times*2) + udpChan := make(chan []byte, len(bytesInput)*times*2) l := listener.StatsDUDPListener{ EventHandler: &event.UnbufferedEventHandler{C: events}, @@ -74,6 +75,7 @@ func benchmarkUDPListener(times int, b *testing.B) { LinesReceived: linesReceived, SamplesReceived: samplesReceived, TagsReceived: tagsReceived, + UdpPacketQueue: udpChan, } // resume benchmark timer diff --git a/pkg/listener/listener.go b/pkg/listener/listener.go index 6c05e28..c3f1520 100644 --- a/pkg/listener/listener.go +++ b/pkg/listener/listener.go @@ -66,13 +66,14 @@ func (l *StatsDUDPListener) Listen() { level.Error(l.Logger).Log("error", err) return } - l.EnqueueUdpPacket(buf[0:n]) + // avoid making copies of slices since we need to minimize the time spent here in order not to drop packets + l.EnqueueUdpPacket(buf, n) } } -func (l *StatsDUDPListener) EnqueueUdpPacket(packet []byte) { +func (l *StatsDUDPListener) EnqueueUdpPacket(packet []byte, n int) { l.UDPPackets.Inc() - packetCopy := make([]byte, len(packet)) + packetCopy := make([]byte, n) copy(packetCopy, packet) l.UdpPacketQueue <- packetCopy }