Cleans up after code review, adds a -short option to "consul rtt" command.

This commit is contained in:
James Phillips 2015-10-16 00:56:15 -07:00
parent fb8900156a
commit 88845f7d71
4 changed files with 97 additions and 26 deletions

View File

@ -38,6 +38,7 @@ Usage: consul rtt [options] node1 node2
Options: Options:
-wan Use WAN coordinates instead of LAN coordinates. -wan Use WAN coordinates instead of LAN coordinates.
-short Print just the round trip time (eg. "1.234 ms").
-http-addr=127.0.0.1:8500 HTTP address of the Consul agent. -http-addr=127.0.0.1:8500 HTTP address of the Consul agent.
` `
return strings.TrimSpace(helpText) return strings.TrimSpace(helpText)
@ -45,11 +46,13 @@ Options:
func (c *RttCommand) Run(args []string) int { func (c *RttCommand) Run(args []string) int {
var wan bool var wan bool
var short bool
cmdFlags := flag.NewFlagSet("rtt", flag.ContinueOnError) cmdFlags := flag.NewFlagSet("rtt", flag.ContinueOnError)
cmdFlags.Usage = func() { c.Ui.Output(c.Help()) } cmdFlags.Usage = func() { c.Ui.Output(c.Help()) }
cmdFlags.BoolVar(&wan, "wan", false, "wan") cmdFlags.BoolVar(&wan, "wan", false, "wan")
cmdFlags.BoolVar(&short, "short", false, "short")
httpAddr := HTTPAddrFlag(cmdFlags) httpAddr := HTTPAddrFlag(cmdFlags)
if err := cmdFlags.Parse(args); err != nil { if err := cmdFlags.Parse(args); err != nil {
return 1 return 1
@ -77,6 +80,8 @@ func (c *RttCommand) Run(args []string) int {
var source string var source string
var coord1, coord2 *coordinate.Coordinate var coord1, coord2 *coordinate.Coordinate
if wan { if wan {
source = "WAN"
// Parse the input nodes. // Parse the input nodes.
parts1 := strings.Split(nodes[0], ".") parts1 := strings.Split(nodes[0], ".")
parts2 := strings.Split(nodes[1], ".") parts2 := strings.Split(nodes[1], ".")
@ -103,10 +108,15 @@ func (c *RttCommand) Run(args []string) int {
if dc.Datacenter == dc2 && entry.Node == node2 { if dc.Datacenter == dc2 && entry.Node == node2 {
coord2 = entry.Coord coord2 = entry.Coord
} }
if coord1 != nil && coord2 != nil {
goto SHOW_RTT
}
} }
} }
source = "WAN"
} else { } else {
source = "LAN"
// Pull all the LAN coordinates. // Pull all the LAN coordinates.
entries, _, err := coordClient.Nodes(nil) entries, _, err := coordClient.Nodes(nil)
if err != nil { if err != nil {
@ -122,8 +132,11 @@ func (c *RttCommand) Run(args []string) int {
if entry.Node == nodes[1] { if entry.Node == nodes[1] {
coord2 = entry.Coord coord2 = entry.Coord
} }
if coord1 != nil && coord2 != nil {
goto SHOW_RTT
}
} }
source = "LAN"
} }
// Make sure we found both coordinates. // Make sure we found both coordinates.
@ -136,12 +149,18 @@ func (c *RttCommand) Run(args []string) int {
return 1 return 1
} }
SHOW_RTT:
// Report the round trip time. // Report the round trip time.
dist := coord1.DistanceTo(coord2).Seconds() dist := fmt.Sprintf("%.3f ms", coord1.DistanceTo(coord2).Seconds()*1000.0)
c.Ui.Output(fmt.Sprintf("Estimated %s <-> %s rtt=%.3f ms (using %s coordinates)", nodes[0], nodes[1], dist*1000.0, source)) if short {
c.Ui.Output(dist)
} else {
c.Ui.Output(fmt.Sprintf("Estimated %s <-> %s rtt=%s (using %s coordinates)", nodes[0], nodes[1], dist, source))
}
return 0 return 0
} }
func (c *RttCommand) Synopsis() string { func (c *RttCommand) Synopsis() string {
return "Estimates round trip times between nodes" return "Estimates network round trip time between nodes"
} }

View File

@ -57,6 +57,7 @@ func TestRttCommand_Run_LAN(t *testing.T) {
c1 := coordinate.NewCoordinate(coordinate.DefaultConfig()) c1 := coordinate.NewCoordinate(coordinate.DefaultConfig())
c2 := c1.Clone() c2 := c1.Clone()
c2.Vec[0] = 0.123 c2.Vec[0] = 0.123
dist_str := fmt.Sprintf("%.3f ms", c1.DistanceTo(c2).Seconds()*1000.0)
req1 := structs.CoordinateUpdateRequest{ req1 := structs.CoordinateUpdateRequest{
Datacenter: a.config.Datacenter, Datacenter: a.config.Datacenter,
@ -80,11 +81,10 @@ func TestRttCommand_Run_LAN(t *testing.T) {
// Wait for the updates to get flushed to the data store. // Wait for the updates to get flushed to the data store.
time.Sleep(2 * updatePeriod) time.Sleep(2 * updatePeriod)
ui := new(cli.MockUi)
c := &RttCommand{Ui: ui}
// Try two known nodes. // Try two known nodes.
func() { {
ui := new(cli.MockUi)
c := &RttCommand{Ui: ui}
args := []string{ args := []string{
"-http-addr=" + a.httpAddr, "-http-addr=" + a.httpAddr,
a.config.NodeName, a.config.NodeName,
@ -96,14 +96,38 @@ func TestRttCommand_Run_LAN(t *testing.T) {
} }
// Make sure the proper RTT was reported in the output. // Make sure the proper RTT was reported in the output.
dist_str := fmt.Sprintf("%.3f ms", c1.DistanceTo(c2).Seconds()*1000.0) expected := fmt.Sprintf("rtt=%s", dist_str)
if !strings.Contains(ui.OutputWriter.String(), dist_str) { if !strings.Contains(ui.OutputWriter.String(), expected) {
t.Fatalf("bad: %#v", ui.OutputWriter.String()) t.Fatalf("bad: %#v", ui.OutputWriter.String())
} }
}() }
// Try the short mode.
{
ui := new(cli.MockUi)
c := &RttCommand{Ui: ui}
args := []string{
"-short",
"-http-addr=" + a.httpAddr,
a.config.NodeName,
"dogs",
}
code := c.Run(args)
if code != 0 {
t.Fatalf("bad: %d: %#v", code, ui.ErrorWriter.String())
}
// Make sure the proper RTT was reported in the output.
expected := fmt.Sprintf("%s\n", dist_str)
if ui.OutputWriter.String() != expected {
t.Fatalf("bad: %#v", ui.OutputWriter.String())
}
}
// Try an unknown node. // Try an unknown node.
func() { {
ui := new(cli.MockUi)
c := &RttCommand{Ui: ui}
args := []string{ args := []string{
"-http-addr=" + a.httpAddr, "-http-addr=" + a.httpAddr,
a.config.NodeName, a.config.NodeName,
@ -113,7 +137,7 @@ func TestRttCommand_Run_LAN(t *testing.T) {
if code != 1 { if code != 1 {
t.Fatalf("bad: %d: %#v", code, ui.ErrorWriter.String()) t.Fatalf("bad: %d: %#v", code, ui.ErrorWriter.String())
} }
}() }
} }
func TestRttCommand_Run_WAN(t *testing.T) { func TestRttCommand_Run_WAN(t *testing.T) {
@ -121,17 +145,16 @@ func TestRttCommand_Run_WAN(t *testing.T) {
defer a.Shutdown() defer a.Shutdown()
waitForLeader(t, a.httpAddr) waitForLeader(t, a.httpAddr)
ui := new(cli.MockUi)
c := &RttCommand{Ui: ui}
node := fmt.Sprintf("%s.%s", a.config.Datacenter, a.config.NodeName) node := fmt.Sprintf("%s.%s", a.config.Datacenter, a.config.NodeName)
// We can't easily inject WAN coordinates, so we will just query the // We can't easily inject WAN coordinates, so we will just query the
// node with itself. // node with itself.
func() { {
ui := new(cli.MockUi)
c := &RttCommand{Ui: ui}
args := []string{ args := []string{
"-http-addr=" + a.httpAddr,
"-wan", "-wan",
"-http-addr=" + a.httpAddr,
node, node,
node, node,
} }
@ -144,13 +167,37 @@ func TestRttCommand_Run_WAN(t *testing.T) {
if !strings.Contains(ui.OutputWriter.String(), "rtt=") { if !strings.Contains(ui.OutputWriter.String(), "rtt=") {
t.Fatalf("bad: %#v", ui.OutputWriter.String()) t.Fatalf("bad: %#v", ui.OutputWriter.String())
} }
}() }
// Try the short mode.
{
ui := new(cli.MockUi)
c := &RttCommand{Ui: ui}
args := []string{
"-wan",
"-short",
"-http-addr=" + a.httpAddr,
node,
node,
}
code := c.Run(args)
if code != 0 {
t.Fatalf("bad: %d: %#v", code, ui.ErrorWriter.String())
}
// Make sure there was some kind of RTT reported in the output.
if !strings.Contains(ui.OutputWriter.String(), " ms\n") {
t.Fatalf("bad: %#v", ui.OutputWriter.String())
}
}
// Try an unknown node. // Try an unknown node.
func() { {
ui := new(cli.MockUi)
c := &RttCommand{Ui: ui}
args := []string{ args := []string{
"-http-addr=" + a.httpAddr,
"-wan", "-wan",
"-http-addr=" + a.httpAddr,
node, node,
"dc1.nope", "dc1.nope",
} }
@ -158,5 +205,5 @@ func TestRttCommand_Run_WAN(t *testing.T) {
if code != 1 { if code != 1 {
t.Fatalf("bad: %d: %#v", code, ui.ErrorWriter.String()) t.Fatalf("bad: %d: %#v", code, ui.ErrorWriter.String())
} }
}() }
} }

View File

@ -39,7 +39,7 @@ Available commands are:
members Lists the members of a Consul cluster members Lists the members of a Consul cluster
monitor Stream logs from a Consul agent monitor Stream logs from a Consul agent
reload Triggers the agent to reload configuration files reload Triggers the agent to reload configuration files
rtt Estimates round trip times between nodes rtt Estimates network round trip time between nodes
version Prints the Consul version version Prints the Consul version
watch Watch for changes in Consul watch Watch for changes in Consul
``` ```

View File

@ -3,7 +3,7 @@ layout: "docs"
page_title: "Commands: RTT" page_title: "Commands: RTT"
sidebar_current: "docs-commands-rtt" sidebar_current: "docs-commands-rtt"
description: > description: >
The `rtt` command estimates the netowrk round trip time between two nodes using Consul's network coordinate model of the cluster. The rtt command estimates the network round trip time between two nodes.
--- ---
# Consul RTT # Consul RTT
@ -36,6 +36,8 @@ The list of available flags are:
by the datacenter and a period (eg. "dc1.sever"). By default, the two nodes are by the datacenter and a period (eg. "dc1.sever"). By default, the two nodes are
assumed to be nodes in the local datacenter the LAN coordinates are used. assumed to be nodes in the local datacenter the LAN coordinates are used.
* `-short` - Abbreviates the output to just the round trip time (eg. "1.234 ms").
* `-http-addr` - Address to the HTTP server of the agent you want to contact * `-http-addr` - Address to the HTTP server of the agent you want to contact
to send this command. If this isn't specified, the command will contact to send this command. If this isn't specified, the command will contact
"127.0.0.1:8500" which is the default HTTP address of a Consul agent. "127.0.0.1:8500" which is the default HTTP address of a Consul agent.
@ -43,12 +45,15 @@ The list of available flags are:
## Output ## Output
If coordinates are available, the command will print the estimated round trip If coordinates are available, the command will print the estimated round trip
time beteeen the given nodes: time between the given nodes:
``` ```
$ consul rtt n1 n2 $ consul rtt n1 n2
Estimated n1 <-> n2 rtt=0.610 ms (using LAN coordinates) Estimated n1 <-> n2 rtt=0.610 ms (using LAN coordinates)
$ consul rtt -short n1 n2
0.610 ms
$ consul rtt -wan dc1.n1 dc2.n2 $ consul rtt -wan dc1.n1 dc2.n2
Estimated dc1.n1 <-> dc2.n2 rtt=1.275 ms (using WAN coordinates) Estimated dc1.n1 <-> dc2.n2 rtt=1.275 ms (using WAN coordinates)
``` ```