From f29e21b411752fb308e669388dbbe3c25389d435 Mon Sep 17 00:00:00 2001 From: Jay Wren Date: Wed, 19 Nov 2025 13:25:25 -0500 Subject: [PATCH] don't register metrics in loops --- inside.go | 3 +-- interface.go | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/inside.go b/inside.go index 5462709..198fc55 100644 --- a/inside.go +++ b/inside.go @@ -3,7 +3,6 @@ package nebula import ( "net/netip" - "github.com/rcrowley/go-metrics" "github.com/sirupsen/logrus" "github.com/slackhq/nebula/firewall" "github.com/slackhq/nebula/header" @@ -146,7 +145,7 @@ func (f *Interface) consumeInsidePackets(packets [][]byte, sizes []int, count in // Send all accumulated packets in one batch if len(*batchPackets) > 0 { batchSize := len(*batchPackets) - metrics.GetOrRegisterHistogram("batch.udp_write_size", nil, metrics.NewUniformSample(1024)).Update(int64(batchSize)) + f.batchMetrics.udpWriteSize.Update(int64(batchSize)) n, err := f.writers[q].WriteMulti(*batchPackets, *batchAddrs) if err != nil { diff --git a/interface.go b/interface.go index 5b96d1c..2ef1c31 100644 --- a/interface.go +++ b/interface.go @@ -51,6 +51,12 @@ type InterfaceConfig struct { l *logrus.Logger } +type batchMetrics struct { + udpReadSize metrics.Histogram + tunReadSize metrics.Histogram + udpWriteSize metrics.Histogram +} + type Interface struct { hostMap *HostMap outside udp.Conn @@ -92,6 +98,7 @@ type Interface struct { metricHandshakes metrics.Histogram messageMetrics *MessageMetrics cachedPacketMetrics *cachedPacketMetrics + batchMetrics *batchMetrics l *logrus.Logger } @@ -194,6 +201,11 @@ func NewInterface(ctx context.Context, c *InterfaceConfig) (*Interface, error) { sent: metrics.GetOrRegisterCounter("hostinfo.cached_packets.sent", nil), dropped: metrics.GetOrRegisterCounter("hostinfo.cached_packets.dropped", nil), }, + batchMetrics: &batchMetrics{ + udpReadSize: metrics.GetOrRegisterHistogram("batch.udp_read_size", nil, metrics.NewUniformSample(1024)), + tunReadSize: metrics.GetOrRegisterHistogram("batch.tun_read_size", nil, metrics.NewUniformSample(1024)), + udpWriteSize: metrics.GetOrRegisterHistogram("batch.udp_write_size", nil, metrics.NewUniformSample(1024)), + }, l: c.l, } @@ -352,8 +364,6 @@ func (f *Interface) listenInBatch(reader io.ReadWriteCloser, batchReader BatchRe conntrackCache := firewall.NewConntrackCacheTicker(f.conntrackCacheTimeout) - tunBatchHist := metrics.GetOrRegisterHistogram("batch.tun_read_size", nil, metrics.NewUniformSample(1024)) - for { n, err := batchReader.BatchRead(bufs, sizes) if err != nil { @@ -366,7 +376,7 @@ func (f *Interface) listenInBatch(reader io.ReadWriteCloser, batchReader BatchRe os.Exit(2) } - tunBatchHist.Update(int64(n)) + f.batchMetrics.tunReadSize.Update(int64(n)) // Process all packets in the batch at once f.consumeInsidePackets(bufs, sizes, n, outs, nb, i, conntrackCache.Get(f.l), &batchPackets, &batchAddrs)