etcdctl: health use etcd/client

Conflicts:
	etcdctl/command/cluster_health.go
release-2.1
Xiang Li 2015-06-05 19:46:55 -07:00 committed by Yicheng Qin
parent c1c23626cb
commit a845f82d4f
1 changed files with 10 additions and 41 deletions

View File

@ -7,11 +7,10 @@ import (
"net/http" "net/http"
"os" "os"
"sort" "sort"
"strings"
"time" "time"
"github.com/coreos/etcd/Godeps/_workspace/src/github.com/codegangsta/cli" "github.com/coreos/etcd/Godeps/_workspace/src/github.com/codegangsta/cli"
"github.com/coreos/etcd/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd" "github.com/coreos/etcd/Godeps/_workspace/src/golang.org/x/net/context"
"github.com/coreos/etcd/etcdserver/stats" "github.com/coreos/etcd/etcdserver/stats"
) )
@ -25,62 +24,32 @@ func NewClusterHealthCommand() cli.Command {
} }
func handleClusterHealth(c *cli.Context) { func handleClusterHealth(c *cli.Context) {
endpoints, err := getEndpoints(c)
if err != nil {
handleError(ExitServerError, err)
}
tr, err := getTransport(c) tr, err := getTransport(c)
if err != nil { if err != nil {
handleError(ExitServerError, err) handleError(ExitServerError, err)
} }
client := etcd.NewClient(endpoints) mi := mustNewMembersAPI(c)
client.SetTransport(tr) ms, err := mi.List(context.TODO())
if err != nil {
if c.GlobalBool("debug") { handleError(ExitServerError, err)
go dumpCURL(client)
} }
if ok := client.SyncCluster(); !ok { cl := make([]string, 0)
handleError(ExitBadConnection, errors.New("cannot sync with the cluster using endpoints "+strings.Join(endpoints, ", "))) for _, m := range ms {
cl = append(cl, m.ClientURLs...)
} }
// do we have a leader? // check the /health endpoint of all members first
cl := client.GetCluster()
ep, ls0, err := getLeaderStats(tr, cl) ep, ls0, err := getLeaderStats(tr, cl)
if err != nil { if err != nil {
fmt.Println("cluster may be unhealthy: failed to connect", cl) fmt.Println("cluster may be unhealthy: failed to connect", cl)
os.Exit(1) os.Exit(1)
} }
// is raft stable and making progress?
client = etcd.NewClient([]string{ep})
client.SetTransport(tr)
resp, err := client.Get("/", false, false)
if err != nil {
fmt.Println("cluster is unhealthy")
os.Exit(1)
}
rt0, ri0 := resp.RaftTerm, resp.RaftIndex
time.Sleep(time.Second) time.Sleep(time.Second)
resp, err = client.Get("/", false, false)
if err != nil {
fmt.Println("cluster is unhealthy")
os.Exit(1)
}
rt1, ri1 := resp.RaftTerm, resp.RaftIndex
if rt0 != rt1 {
fmt.Println("cluster is unhealthy")
os.Exit(1)
}
if ri1 == ri0 {
fmt.Println("cluster is unhealthy")
os.Exit(1)
}
// are all the members makeing progress? // are all the members makeing progress?
_, ls1, err := getLeaderStats(tr, []string{ep}) _, ls1, err := getLeaderStats(tr, []string{ep})
if err != nil { if err != nil {