diff options
author | 2019-02-08 01:16:32 +0100 | |
---|---|---|
committer | 2019-02-08 01:16:32 +0100 | |
commit | fa21c9d726ebb807895a8571af9a16dab5cd8d6e (patch) | |
tree | 4597d483f90e374e89f3923324b531a56217a0f9 /examples/stats-api | |
parent | 8ba70a7b13950593aab9863246f830eda450f06b (diff) |
Generator improvements and cleanup
- generator now supports include-comments flag (as opt-in)
- minor code cleanup in binapi-generator
- remove obsolete unit tests
- flatten examples from examples/cmd folder
- introduce constant for checking compatibility in future versions
Change-Id: I3545f2ba4b869a3b51d6d0de7e742f3f1e1be392
Signed-off-by: Ondrej Fabry <ofabry@cisco.com>
Diffstat (limited to 'examples/stats-api')
-rw-r--r-- | examples/stats-api/README.md | 68 | ||||
-rw-r--r-- | examples/stats-api/stats_api.go | 140 |
2 files changed, 208 insertions, 0 deletions
diff --git a/examples/stats-api/README.md b/examples/stats-api/README.md new file mode 100644 index 0000000..0f26197 --- /dev/null +++ b/examples/stats-api/README.md @@ -0,0 +1,68 @@ +# Stats API Example + +This example demonstrates how to retrieve statistics from VPP using [the new Stats API](https://github.com/FDio/vpp/blob/master/src/vpp/stats/stats.md). + +## Requirements + +The following requirements are required to run this example: + +- install **VPP 18.10+** +- enable stats in VPP: + + ```sh + statseg { + default + } + ``` + > The [default socket](https://wiki.fd.io/view/VPP/Command-line_Arguments#.22statseg.22_parameters) is located at `/run/vpp/stats.sock`. +- run the VPP, ideally with some traffic + +## Running example + +First build the example: `go build git.fd.io/govpp.git/examples/stats-api`. + +Use commands `ls` and `dump` to list and dump statistics. Optionally, patterns can be used to filter the results. + +### List stats matching patterns `/sys/` and `/if/` +``` +$ ./stats-api ls /sys/ /if/ +Listing stats.. /sys/ /if/ + - /sys/vector_rate + - /sys/input_rate + - /sys/last_update + - /sys/last_stats_clear + - /sys/heartbeat + - /sys/node/clocks + - /sys/node/vectors + - /sys/node/calls + - /sys/node/suspends + - /if/drops + - /if/punt + - /if/ip4 + - /if/ip6 + - /if/rx-no-buf + - /if/rx-miss + - /if/rx-error + - /if/tx-error + - /if/rx + - /if/rx-unicast + - /if/rx-multicast + - /if/rx-broadcast + - /if/tx + - /if/tx-unicast-miss + - /if/tx-multicast + - /if/tx-broadcast +Listed 25 stats +``` + +### Dump all stats with their types and values +``` +$ ./stats-api dump +Dumping stats.. + - /sys/last_update ScalarIndex 10408 + - /sys/heartbeat ScalarIndex 1041 + - /err/ip4-icmp-error/unknown type ErrorIndex 5 + - /net/route/to CombinedCounterVector [[{Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:0 Bytes:0} {Packets:5 Bytes:420}]] + - /if/drops SimpleCounterVector [[0 5 5]] +Dumped 5 (2798) stats +``` diff --git a/examples/stats-api/stats_api.go b/examples/stats-api/stats_api.go new file mode 100644 index 0000000..6fd46d2 --- /dev/null +++ b/examples/stats-api/stats_api.go @@ -0,0 +1,140 @@ +// Copyright (c) 2018 Cisco and/or its affiliates. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at: +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "flag" + "fmt" + "log" + "os" + "strings" + + "git.fd.io/govpp.git/adapter" + "git.fd.io/govpp.git/adapter/vppapiclient" +) + +// ------------------------------------------------------------------ +// Example - Stats API +// ------------------------------------------------------------------ +// The example stats_api demonstrates how to retrieve stats +// from the VPP using the new stats API. +// ------------------------------------------------------------------ + +var ( + statsSocket = flag.String("socket", vppapiclient.DefaultStatSocket, "VPP stats segment socket") + dumpAll = flag.Bool("all", false, "Dump all stats including ones with zero values") +) + +func init() { + flag.Usage = func() { + fmt.Fprintf(os.Stderr, "%s: usage [ls|dump] <patterns>...\n", os.Args[0]) + flag.PrintDefaults() + os.Exit(1) + } +} + +func main() { + flag.Parse() + + cmd := flag.Arg(0) + + switch cmd { + case "", "ls", "dump": + default: + flag.Usage() + } + + var patterns []string + if flag.NArg() > 0 { + patterns = flag.Args()[1:] + } + + client := vppapiclient.NewStatClient(*statsSocket) + + fmt.Printf("Connecting to stats socket: %s\n", *statsSocket) + + if err := client.Connect(); err != nil { + log.Fatalln("Connecting failed:", err) + } + defer client.Disconnect() + + switch cmd { + case "dump": + dumpStats(client, patterns, !*dumpAll) + default: + listStats(client, patterns) + } +} + +func listStats(client adapter.StatsAPI, patterns []string) { + fmt.Printf("Listing stats.. %s\n", strings.Join(patterns, " ")) + + list, err := client.ListStats(patterns...) + if err != nil { + log.Fatalln("listing stats failed:", err) + } + + for _, stat := range list { + fmt.Printf(" - %v\n", stat) + } + + fmt.Printf("Listed %d stats\n", len(list)) +} + +func dumpStats(client adapter.StatsAPI, patterns []string, skipZeros bool) { + fmt.Printf("Dumping stats.. %s\n", strings.Join(patterns, " ")) + + stats, err := client.DumpStats(patterns...) + if err != nil { + log.Fatalln("dumping stats failed:", err) + } + + n := 0 + for _, stat := range stats { + if isZero(stat.Data) && skipZeros { + continue + } + fmt.Printf(" - %-25s %25v %+v\n", stat.Name, stat.Type, stat.Data) + n++ + } + + fmt.Printf("Dumped %d (%d) stats\n", n, len(stats)) +} + +func isZero(stat adapter.Stat) bool { + switch s := stat.(type) { + case adapter.ScalarStat: + return s == 0 + case adapter.ErrorStat: + return s == 0 + case adapter.SimpleCounterStat: + for _, ss := range s { + for _, sss := range ss { + if sss != 0 { + return false + } + } + } + case adapter.CombinedCounterStat: + for _, ss := range s { + for _, sss := range ss { + if sss.Bytes != 0 || sss.Packets != 0 { + return false + } + } + } + } + return true +} |