package command import ( "flag" "fmt" "github.com/mitchellh/cli" "sort" "strings" ) // InfoCommand is a Command implementation that queries a running // Consul agent for various debugging statistics for operators type InfoCommand struct { Ui cli.Ui } func (i *InfoCommand) Help() string { helpText := ` Usage: consul info [options] Provides debugging information for operators Options: -rpc-addr=127.0.0.1:8400 RPC address of the Consul agent. ` return strings.TrimSpace(helpText) } func (i *InfoCommand) Run(args []string) int { cmdFlags := flag.NewFlagSet("info", flag.ContinueOnError) cmdFlags.Usage = func() { i.Ui.Output(i.Help()) } rpcAddr := RPCAddrFlag(cmdFlags) if err := cmdFlags.Parse(args); err != nil { return 1 } client, err := RPCClient(*rpcAddr) if err != nil { i.Ui.Error(fmt.Sprintf("Error connecting to Consul agent: %s", err)) return 1 } defer client.Close() stats, err := client.Stats() if err != nil { i.Ui.Error(fmt.Sprintf("Error querying agent: %s", err)) return 1 } // Check for specific warnings didWarn := false runtime, ok := stats["runtime"] if ok { if maxprocs := runtime["max_procs"]; maxprocs == "1" { i.Ui.Output("WARNING: It is highly recommended to set GOMAXPROCS higher than 1") didWarn = true } } // Add a blank line if there are any warnings if didWarn { i.Ui.Output("") } // Get the keys in sorted order keys := make([]string, 0, len(stats)) for key := range stats { keys = append(keys, key) } sort.Strings(keys) // Iterate over each top-level key for _, key := range keys { i.Ui.Output(key + ":") // Sort the sub-keys subvals := stats[key] subkeys := make([]string, 0, len(subvals)) for k := range subvals { subkeys = append(subkeys, k) } sort.Strings(subkeys) // Iterate over the subkeys for _, subkey := range subkeys { val := subvals[subkey] i.Ui.Output(fmt.Sprintf("\t%s = %s", subkey, val)) } } return 0 } func (i *InfoCommand) Synopsis() string { return "Provides debugging information for operators" }