github.com/criteo-forks/consul@v1.4.5-criteonogrpc/command/info/info.go (about) 1 package info 2 3 import ( 4 "flag" 5 "fmt" 6 "sort" 7 8 "github.com/hashicorp/consul/command/flags" 9 "github.com/mitchellh/cli" 10 ) 11 12 func New(ui cli.Ui) *cmd { 13 c := &cmd{UI: ui} 14 c.init() 15 return c 16 } 17 18 type cmd struct { 19 UI cli.Ui 20 flags *flag.FlagSet 21 http *flags.HTTPFlags 22 help string 23 } 24 25 func (c *cmd) init() { 26 c.flags = flag.NewFlagSet("", flag.ContinueOnError) 27 c.http = &flags.HTTPFlags{} 28 flags.Merge(c.flags, c.http.ClientFlags()) 29 c.help = flags.Usage(help, c.flags) 30 } 31 32 func (c *cmd) Run(args []string) int { 33 if err := c.flags.Parse(args); err != nil { 34 return 1 35 } 36 37 client, err := c.http.APIClient() 38 if err != nil { 39 c.UI.Error(fmt.Sprintf("Error connecting to Consul agent: %s", err)) 40 return 1 41 } 42 43 self, err := client.Agent().Self() 44 if err != nil { 45 c.UI.Error(fmt.Sprintf("Error querying agent: %s", err)) 46 return 1 47 } 48 stats, ok := self["Stats"] 49 if !ok { 50 c.UI.Error(fmt.Sprintf("Agent response did not contain 'Stats' key: %v", self)) 51 return 1 52 } 53 54 // Get the keys in sorted order 55 keys := make([]string, 0, len(stats)) 56 for key := range stats { 57 keys = append(keys, key) 58 } 59 sort.Strings(keys) 60 61 // Iterate over each top-level key 62 for _, key := range keys { 63 c.UI.Output(key + ":") 64 65 // Sort the sub-keys 66 subvals, ok := stats[key].(map[string]interface{}) 67 if !ok { 68 c.UI.Error(fmt.Sprintf("Got invalid subkey in stats: %v", subvals)) 69 return 1 70 } 71 subkeys := make([]string, 0, len(subvals)) 72 for k := range subvals { 73 subkeys = append(subkeys, k) 74 } 75 sort.Strings(subkeys) 76 77 // Iterate over the subkeys 78 for _, subkey := range subkeys { 79 val := subvals[subkey] 80 c.UI.Output(fmt.Sprintf("\t%s = %s", subkey, val)) 81 } 82 } 83 return 0 84 } 85 86 func (c *cmd) Synopsis() string { 87 return synopsis 88 } 89 90 func (c *cmd) Help() string { 91 return c.help 92 } 93 94 const synopsis = "Provides debugging information for operators." 95 const help = ` 96 Usage: consul info [options] 97 98 Provides debugging information for operators. 99 `