Add periodic stats logging for mapping traffic
This commit is contained in:
37
main.go
37
main.go
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user