64 lines
1.7 KiB
Go
64 lines
1.7 KiB
Go
package vppstats
|
|
|
|
import (
|
|
"log"
|
|
"time"
|
|
|
|
"go.fd.io/govpp/adapter/statsclient"
|
|
"go.fd.io/govpp/api"
|
|
"go.fd.io/govpp/core"
|
|
)
|
|
|
|
// StartStatsRoutine starts a goroutine that queries VPP interface stats every 10 seconds
|
|
func StartStatsRoutine() {
|
|
go statsRoutine()
|
|
}
|
|
|
|
func statsRoutine() {
|
|
log.Println("Starting VPP stats routine...")
|
|
|
|
// Create stats client
|
|
client := statsclient.NewStatsClient("/var/run/vpp/stats.sock")
|
|
|
|
// Connect using core.ConnectStats (proper way)
|
|
c, err := core.ConnectStats(client)
|
|
if err != nil {
|
|
log.Printf("Failed to connect to VPP stats: %v", err)
|
|
return
|
|
}
|
|
defer c.Disconnect()
|
|
|
|
ticker := time.NewTicker(10 * time.Second)
|
|
defer ticker.Stop()
|
|
|
|
for {
|
|
select {
|
|
case <-ticker.C:
|
|
queryInterfaceStats(c)
|
|
}
|
|
}
|
|
}
|
|
|
|
func queryInterfaceStats(c *core.StatsConnection) {
|
|
log.Printf("Querying VPP interface stats at %s", time.Now().Format(time.RFC3339))
|
|
|
|
// Create the proper struct for interface stats
|
|
stats := new(api.InterfaceStats)
|
|
|
|
// Use the GetInterfaceStats method - this is the correct approach
|
|
if err := c.GetInterfaceStats(stats); err != nil {
|
|
log.Printf("Failed to get interface stats: %v", err)
|
|
return
|
|
}
|
|
|
|
// Now you have properly structured data
|
|
for _, iface := range stats.Interfaces {
|
|
log.Printf("Interface %d (%s):", iface.InterfaceIndex, iface.InterfaceName)
|
|
log.Printf(" RX: %d packets, %d bytes", iface.Rx.Packets, iface.Rx.Bytes)
|
|
log.Printf(" TX: %d packets, %d bytes", iface.Tx.Packets, iface.Tx.Bytes)
|
|
log.Printf(" RX Errors: %d, TX Errors: %d", iface.RxErrors, iface.TxErrors)
|
|
log.Printf(" Drops: %d, Punts: %d", iface.Drops, iface.Punts)
|
|
}
|
|
|
|
log.Printf("Retrieved stats for %d interfaces", len(stats.Interfaces))
|
|
} |