Add periodic stats logging for mapping traffic

This commit is contained in:
Ian Gulliver
2026-01-30 11:48:36 -08:00
parent 3018c75fa2
commit 414aa01480

37
main.go
View File

@@ -11,7 +11,9 @@ import (
"os/signal" "os/signal"
"strconv" "strconv"
"strings" "strings"
"sync"
"syscall" "syscall"
"time"
"github.com/gopatchy/artnet" "github.com/gopatchy/artnet"
"github.com/gopatchy/artmap/config" "github.com/gopatchy/artmap/config"
@@ -30,6 +32,8 @@ type App struct {
artTargets map[uint16]*net.UDPAddr artTargets map[uint16]*net.UDPAddr
sacnTargets map[uint16][]*net.UDPAddr sacnTargets map[uint16][]*net.UDPAddr
debug bool debug bool
statsMu sync.Mutex
stats map[config.Universe]uint64
} }
func main() { func main() {
@@ -146,6 +150,7 @@ func main() {
artTargets: artTargets, artTargets: artTargets,
sacnTargets: sacnTargets, sacnTargets: sacnTargets,
debug: *debug, debug: *debug,
stats: map[config.Universe]uint64{},
} }
// Create ArtNet receiver if enabled // Create ArtNet receiver if enabled
@@ -209,6 +214,15 @@ func main() {
}() }()
} }
// Start stats printer
go func() {
ticker := time.NewTicker(10 * time.Second)
defer ticker.Stop()
for range ticker.C {
app.printStats()
}
}()
// Wait for interrupt // Wait for interrupt
sigChan := make(chan os.Signal, 1) sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
@@ -231,6 +245,9 @@ func (a *App) HandleDMX(src *net.UDPAddr, pkt *artnet.DMXPacket) {
src.IP, pkt.Universe, pkt.Sequence, pkt.Length) src.IP, pkt.Universe, pkt.Sequence, pkt.Length)
} }
u := config.Universe{Protocol: config.ProtocolArtNet, Number: uint16(pkt.Universe)} u := config.Universe{Protocol: config.ProtocolArtNet, Number: uint16(pkt.Universe)}
a.statsMu.Lock()
a.stats[u]++
a.statsMu.Unlock()
a.sendOutputs(a.engine.Remap(u, pkt.Data)) a.sendOutputs(a.engine.Remap(u, pkt.Data))
} }
@@ -256,6 +273,9 @@ func (a *App) HandleSACN(universe uint16, data [512]byte) {
log.Printf("[<-sacn] universe=%d", universe) log.Printf("[<-sacn] universe=%d", universe)
} }
u := config.Universe{Protocol: config.ProtocolSACN, Number: universe} u := config.Universe{Protocol: config.ProtocolSACN, Number: universe}
a.statsMu.Lock()
a.stats[u]++
a.statsMu.Unlock()
a.sendOutputs(a.engine.Remap(u, data)) a.sendOutputs(a.engine.Remap(u, data))
} }
@@ -313,6 +333,23 @@ func (a *App) handleConfig(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(a.cfg) json.NewEncoder(w).Encode(a.cfg)
} }
func (a *App) printStats() {
a.statsMu.Lock()
stats := a.stats
a.stats = map[config.Universe]uint64{}
a.statsMu.Unlock()
if len(stats) == 0 && len(a.cfg.Mappings) == 0 {
return
}
log.Printf("[stats] mapping traffic (last 10s):")
for _, m := range a.cfg.Mappings {
count := stats[m.From.Universe]
log.Printf("[stats] %s -> %s: %d packets", m.From, m.To, count)
}
}
func init() { func init() {
log.SetFlags(log.Ltime | log.Lmicroseconds) log.SetFlags(log.Ltime | log.Lmicroseconds)
} }