mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
add serverStats
This commit is contained in:
@@ -171,7 +171,7 @@ func (c *JoinCommand) Apply(raftServer *raft.Server) (interface{}, error) {
|
||||
etcdStore.Set(key, value, time.Unix(0, 0), raftServer.CommitIndex())
|
||||
|
||||
if c.Name != r.Name() {
|
||||
r.peersStats[c.Name] = &peerStats{MinLatency: 1 << 63}
|
||||
r.peersStats[c.Name] = &raftPeerStats{MinLatency: 1 << 63}
|
||||
}
|
||||
|
||||
return b, err
|
||||
|
||||
@@ -42,6 +42,9 @@ func AppendEntriesHttpHandler(w http.ResponseWriter, req *http.Request) {
|
||||
|
||||
if err == nil {
|
||||
debugf("[recv] POST %s/log/append [%d]", r.url, len(aereq.Entries))
|
||||
|
||||
r.serverStats.RecvAppendReq(aereq.LeaderName)
|
||||
|
||||
if resp := r.AppendEntries(aereq); resp != nil {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
json.NewEncoder(w).Encode(resp)
|
||||
|
||||
@@ -17,13 +17,14 @@ import (
|
||||
|
||||
type raftServer struct {
|
||||
*raft.Server
|
||||
version string
|
||||
joinIndex uint64
|
||||
name string
|
||||
url string
|
||||
tlsConf *TLSConfig
|
||||
tlsInfo *TLSInfo
|
||||
peersStats map[string]*peerStats
|
||||
version string
|
||||
joinIndex uint64
|
||||
name string
|
||||
url string
|
||||
tlsConf *TLSConfig
|
||||
tlsInfo *TLSInfo
|
||||
peersStats map[string]*raftPeerStats
|
||||
serverStats *raftServerStats
|
||||
}
|
||||
|
||||
var r *raftServer
|
||||
@@ -39,13 +40,14 @@ func newRaftServer(name string, url string, tlsConf *TLSConfig, tlsInfo *TLSInfo
|
||||
check(err)
|
||||
|
||||
return &raftServer{
|
||||
Server: server,
|
||||
version: raftVersion,
|
||||
name: name,
|
||||
url: url,
|
||||
tlsConf: tlsConf,
|
||||
tlsInfo: tlsInfo,
|
||||
peersStats: make(map[string]*peerStats),
|
||||
Server: server,
|
||||
version: raftVersion,
|
||||
name: name,
|
||||
url: url,
|
||||
tlsConf: tlsConf,
|
||||
tlsInfo: tlsInfo,
|
||||
peersStats: make(map[string]*raftPeerStats),
|
||||
serverStats: &raftServerStats{},
|
||||
}
|
||||
}
|
||||
|
||||
@@ -270,7 +272,12 @@ func joinByMachine(s *raft.Server, machine string, scheme string) error {
|
||||
}
|
||||
|
||||
func (r *raftServer) Stats() []byte {
|
||||
b, _ := json.Marshal(r.peersStats)
|
||||
sBytes, _ := json.Marshal(r.serverStats)
|
||||
|
||||
pBytes, _ := json.Marshal(r.peersStats)
|
||||
|
||||
b := append(sBytes, pBytes...)
|
||||
|
||||
return b
|
||||
}
|
||||
|
||||
|
||||
@@ -3,9 +3,41 @@ package main
|
||||
import (
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"github.com/coreos/go-raft"
|
||||
)
|
||||
|
||||
type peerStats struct {
|
||||
type raftServerStats struct {
|
||||
State string
|
||||
StartTime time.Time
|
||||
Leader string
|
||||
leaderStartTime time.Time
|
||||
LeaderUptime time.Duration
|
||||
RecvAppendRequestCnt uint64
|
||||
SendAppendRequestCnt uint64
|
||||
}
|
||||
|
||||
func (ss *raftServerStats) RecvAppendReq(leaderName string) {
|
||||
ss.State = raft.Follower
|
||||
if leaderName != ss.Leader {
|
||||
ss.Leader = leaderName
|
||||
ss.leaderStartTime = time.Now()
|
||||
}
|
||||
|
||||
ss.RecvAppendRequestCnt++
|
||||
}
|
||||
|
||||
func (ss *raftServerStats) SendAppendReq() {
|
||||
if ss.State != raft.Leader {
|
||||
ss.State = raft.Leader
|
||||
ss.Leader = r.Name()
|
||||
ss.leaderStartTime = time.Now()
|
||||
}
|
||||
|
||||
ss.SendAppendRequestCnt++
|
||||
}
|
||||
|
||||
type raftPeerStats struct {
|
||||
Latency float64 `json:"latency"`
|
||||
AvgLatency float64 `json:"averageLatency"`
|
||||
avgLatencySquare float64
|
||||
@@ -16,11 +48,11 @@ type peerStats struct {
|
||||
SuccCnt uint64 `json:"successCount"`
|
||||
}
|
||||
|
||||
func (ps *peerStats) Fail() {
|
||||
func (ps *raftPeerStats) Fail() {
|
||||
ps.FailCnt++
|
||||
}
|
||||
|
||||
func (ps *peerStats) Succ(d time.Duration) {
|
||||
func (ps *raftPeerStats) Succ(d time.Duration) {
|
||||
|
||||
total := float64(ps.SuccCnt) * ps.AvgLatency
|
||||
totalSquare := float64(ps.SuccCnt) * ps.avgLatencySquare
|
||||
|
||||
@@ -47,6 +47,9 @@ func dialTimeout(network, addr string) (net.Conn, error) {
|
||||
func (t transporter) SendAppendEntriesRequest(server *raft.Server, peer *raft.Peer, req *raft.AppendEntriesRequest) *raft.AppendEntriesResponse {
|
||||
var aersp *raft.AppendEntriesResponse
|
||||
var b bytes.Buffer
|
||||
|
||||
r.serverStats.SendAppendReq()
|
||||
|
||||
json.NewEncoder(&b).Encode(req)
|
||||
|
||||
u, _ := nameToRaftURL(peer.Name)
|
||||
|
||||
Reference in New Issue
Block a user