etcdctl: health use etcd/client

This commit is contained in:
Xiang Li 2015-06-05 19:46:55 -07:00 committed by Yicheng Qin
parent 0b1ddce889
commit 071ad9f72b

View File

@ -7,12 +7,11 @@ 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/etcdserver/stats" "github.com/coreos/etcd/etcdserver/stats"
"golang.org/x/net/context"
) )
func NewClusterHealthCommand() cli.Command { func NewClusterHealthCommand() cli.Command {
@ -25,58 +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 ok := client.SyncCluster(); !ok { handleError(ExitServerError, err)
handleError(ExitBadConnection, errors.New("cannot sync with the cluster using endpoints "+strings.Join(endpoints, ", ")))
} }
// do we have a leader? cl := make([]string, 0)
cl := client.GetCluster() for _, m := range ms {
cl = append(cl, m.ClientURLs...)
}
// check the /health endpoint of all members first
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 {