etcd/file_system/stats.go
2013-09-23 01:55:22 -04:00

147 lines
2.9 KiB
Go

package fileSystem
import (
"encoding/json"
"sync"
)
const (
// Operations that will be running serializely
StatsSetsHit = 100
StatsSetsMiss = 101
StatsDeletesHit = 102
StatsDeletesMiss = 103
StatsUpdatesHit = 104
StatsUpdatesMiss = 105
StatsTestAndSetsHit = 106
StatsTestAndSetsMiss = 107
StatsRecoveryHit = 108
StatsRecoveryMiss = 109
// concurrent operations
StatsGetsHit = 200
StatsGetsMiss = 201
StatsWatchHit = 300
StatsWatchMiss = 301
StatsInWatchingNum = 302
StatsSaveHit = 400
StatsSaveMiss = 401
)
type EtcdStats struct {
// Lock for synchronization
rwlock sync.RWMutex
// Number of get requests
GetsHit uint64 `json:"gets_hits"`
GetsMiss uint64 `json:"gets_misses"`
// Number of sets requests
SetsHit uint64 `json:"sets_hits"`
SetsMiss uint64 `json:"sets_misses"`
// Number of delete requests
DeletesHit uint64 `json:"deletes_hits"`
DeletesMiss uint64 `json:"deletes_misses"`
// Number of update requests
UpdatesHit uint64 `json:"updates_hits"`
UpdatesMiss uint64 `json:"updates_misses"`
// Number of testAndSet requests
TestAndSetsHit uint64 `json:"testAndSets_hits"`
TestAndSetsMiss uint64 `json:"testAndSets_misses"`
// Number of Watch requests
WatchHit uint64 `json:"watch_hit"`
WatchMiss uint64 `json:"watch_miss"`
InWatchingNum uint64 `json:"in_watching_number"`
// Number of save requests
SaveHit uint64 `json:"save_hit"`
SaveMiss uint64 `json:"save_miss"`
// Number of recovery requests
RecoveryHit uint64 `json:"recovery_hit"`
RecoveryMiss uint64 `json:"recovery_miss"`
}
func newStats() *EtcdStats {
e := new(EtcdStats)
return e
}
// Status() return the statistics info of etcd storage its recent start
func (e *EtcdStats) GetStats() []byte {
b, _ := json.Marshal(e)
return b
}
func (e *EtcdStats) TotalReads() uint64 {
return e.GetsHit + e.GetsMiss
}
func (e *EtcdStats) TotalWrites() uint64 {
return e.SetsHit + e.SetsMiss +
e.DeletesHit + e.DeletesMiss +
e.UpdatesHit + e.UpdatesMiss +
e.TestAndSetsHit + e.TestAndSetsMiss
}
func (e *EtcdStats) IncStats(field int) {
if field >= 200 {
e.rwlock.Lock()
switch field {
case StatsGetsHit:
e.GetsHit++
case StatsGetsMiss:
e.GetsMiss++
case StatsWatchHit:
e.WatchHit++
case StatsWatchMiss:
e.WatchMiss++
case StatsInWatchingNum:
e.InWatchingNum++
case StatsSaveHit:
e.SaveHit++
case StatsSaveMiss:
e.SaveMiss++
}
e.rwlock.Unlock()
} else {
e.rwlock.RLock()
switch field {
case StatsSetsHit:
e.SetsHit++
case StatsSetsMiss:
e.SetsMiss++
case StatsDeletesHit:
e.DeletesHit++
case StatsDeletesMiss:
e.DeletesMiss++
case StatsUpdatesHit:
e.UpdatesHit++
case StatsUpdatesMiss:
e.UpdatesMiss++
case StatsTestAndSetsHit:
e.TestAndSetsHit++
case StatsTestAndSetsMiss:
e.TestAndSetsMiss++
case StatsRecoveryHit:
e.RecoveryHit++
case StatsRecoveryMiss:
e.RecoveryMiss++
}
e.rwlock.RUnlock()
}
}