Provide error counters per worker for statsclient
[govpp.git] / examples / stats-client / stats_api.go
index b1846a6..0ccfa89 100644 (file)
@@ -39,6 +39,7 @@ var (
        statsSocket = flag.String("socket", statsclient.DefaultSocketName, "Path to VPP stats socket")
        dumpAll     = flag.Bool("all", false, "Dump all stats including ones with zero values")
        pollPeriod  = flag.Duration("period", time.Second*5, "Polling interval period")
+       async       = flag.Bool("async", false, "Use asynchronous connection")
 )
 
 func init() {
@@ -58,11 +59,33 @@ func main() {
                patterns = flag.Args()[1:]
        }
 
-       client := statsclient.NewStatsClient(*statsSocket)
-
-       c, err := core.ConnectStats(client)
-       if err != nil {
-               log.Fatalln("Connecting failed:", err)
+       var (
+               client *statsclient.StatsClient
+               c      *core.StatsConnection
+               err    error
+       )
+
+       if *async {
+               var statsChan chan core.ConnectionEvent
+               client = statsclient.NewStatsClient(*statsSocket)
+               c, statsChan, err = core.AsyncConnectStats(client, core.DefaultMaxReconnectAttempts, core.DefaultReconnectInterval)
+               if err != nil {
+                       log.Fatalln("Asynchronous connecting failed:", err)
+               }
+               select {
+               case e := <-statsChan:
+                       if e.State == core.Connected {
+                               // OK
+                       } else {
+                               log.Fatalf("VPP stats asynchronous connection failed: %s\n", e.State.String())
+                       }
+               }
+       } else {
+               client = statsclient.NewStatsClient(*statsSocket)
+               c, err = core.ConnectStats(client)
+               if err != nil {
+                       log.Fatalln("Connecting failed:", err)
+               }
        }
        defer c.Disconnect()
 
@@ -114,10 +137,15 @@ func main() {
                }
                n := 0
                for _, counter := range stats.Errors {
-                       if skipZeros && counter.Value == 0 {
+                       var sum uint32
+                       for _, valuePerWorker := range counter.Values {
+                               sum += uint32(valuePerWorker)
+                       }
+
+                       if skipZeros && sum == 0 {
                                continue
                        }
-                       fmt.Printf(" - %v\n", counter)
+                       fmt.Printf(" - %v %d (per worker: %v)\n", counter.CounterName, sum, counter.Values)
                        n++
                }
                fmt.Printf("Listed %d (%d) error counters\n", n, len(stats.Errors))