1 // Copyright (c) 2018 Cisco and/or its affiliates.
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at:
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
24 "git.fd.io/govpp.git/adapter"
25 "git.fd.io/govpp.git/adapter/statsclient"
26 "git.fd.io/govpp.git/adapter/vppapiclient"
27 "git.fd.io/govpp.git/core"
30 // ------------------------------------------------------------------
31 // Example - Stats API
32 // ------------------------------------------------------------------
33 // The example stats_api demonstrates how to retrieve stats
34 // from the VPP using the new stats API.
35 // ------------------------------------------------------------------
38 statsSocket = flag.String("socket", statsclient.DefaultSocketName, "Path to VPP stats socket")
39 dumpAll = flag.Bool("all", false, "Dump all stats including ones with zero values")
40 oldclient = flag.Bool("oldclient", false, "Use old client for stats API (vppapiclient)")
45 fmt.Fprintf(os.Stderr, "%s: usage [ls|dump|errors|interfaces|nodes|system|buffers] <patterns>...\n", os.Args[0])
53 skipZeros := !*dumpAll
57 case "", "ls", "dump", "errors", "interfaces", "nodes", "system", "buffers":
64 patterns = flag.Args()[1:]
67 var client adapter.StatsAPI
69 client = vppapiclient.NewStatClient(*statsSocket)
71 client = statsclient.NewStatsClient(*statsSocket)
74 fmt.Printf("Connecting to stats socket: %s\n", *statsSocket)
76 c, err := core.ConnectStats(client)
78 log.Fatalln("Connecting failed:", err)
84 stats, err := c.GetSystemStats()
86 log.Fatalln("getting system stats failed:", err)
88 fmt.Printf("System stats: %+v\n", stats)
91 fmt.Println("Listing node stats..")
92 stats, err := c.GetNodeStats()
94 log.Fatalln("getting node stats failed:", err)
96 for _, node := range stats.Nodes {
97 if node.Calls == 0 && node.Suspends == 0 && node.Clocks == 0 && node.Vectors == 0 && skipZeros {
100 fmt.Printf(" - %+v\n", node)
102 fmt.Printf("Listed %d node counters\n", len(stats.Nodes))
105 fmt.Println("Listing interface stats..")
106 stats, err := c.GetInterfaceStats()
108 log.Fatalln("getting interface stats failed:", err)
110 for _, iface := range stats.Interfaces {
111 fmt.Printf(" - %+v\n", iface)
113 fmt.Printf("Listed %d interface counters\n", len(stats.Interfaces))
116 fmt.Printf("Listing error stats.. %s\n", strings.Join(patterns, " "))
117 stats, err := c.GetErrorStats(patterns...)
119 log.Fatalln("getting error stats failed:", err)
122 for _, counter := range stats.Errors {
123 if counter.Value == 0 && skipZeros {
126 fmt.Printf(" - %v\n", counter)
129 fmt.Printf("Listed %d (%d) error counters\n", n, len(stats.Errors))
132 stats, err := c.GetBufferStats()
134 log.Fatalln("getting buffer stats failed:", err)
136 fmt.Printf("Buffer stats: %+v\n", stats)
139 dumpStats(client, patterns, skipZeros)
142 listStats(client, patterns)
146 func listStats(client adapter.StatsAPI, patterns []string) {
147 fmt.Printf("Listing stats.. %s\n", strings.Join(patterns, " "))
149 list, err := client.ListStats(patterns...)
151 log.Fatalln("listing stats failed:", err)
154 for _, stat := range list {
155 fmt.Printf(" - %v\n", stat)
158 fmt.Printf("Listed %d stats\n", len(list))
161 func dumpStats(client adapter.StatsAPI, patterns []string, skipZeros bool) {
162 fmt.Printf("Dumping stats.. %s\n", strings.Join(patterns, " "))
164 stats, err := client.DumpStats(patterns...)
166 log.Fatalln("dumping stats failed:", err)
170 for _, stat := range stats {
171 if isZero(stat.Data) && skipZeros {
174 fmt.Printf(" - %-25s %25v %+v\n", stat.Name, stat.Type, stat.Data)
178 fmt.Printf("Dumped %d (%d) stats\n", n, len(stats))
181 func isZero(stat adapter.Stat) bool {
182 switch s := stat.(type) {
183 case adapter.ScalarStat:
185 case adapter.ErrorStat:
187 case adapter.SimpleCounterStat:
188 for _, ss := range s {
189 for _, sss := range ss {
196 case adapter.CombinedCounterStat:
197 for _, ss := range s {
198 for _, sss := range ss {
199 if sss.Bytes != 0 || sss.Packets != 0 {