X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=adapter%2Fstats_api.go;h=4b398f549d67d1384e11cc124719d27fb9562931;hb=4e16c7100cc7f8dddca051ff393460d7a1a77c98;hp=798fcbd2014aa561d845e09af1df07ef3bec6d16;hpb=da15c397b3dbbba07d159b3af767aa13d443cfd6;p=govpp.git diff --git a/adapter/stats_api.go b/adapter/stats_api.go index 798fcbd..4b398f5 100644 --- a/adapter/stats_api.go +++ b/adapter/stats_api.go @@ -19,29 +19,34 @@ import ( "fmt" ) -var ( - ErrStatDirBusy = errors.New("stat dir busy") - ErrStatDumpBusy = errors.New("stat dump busy") +const ( + // DefaultStatsSocket defines a default socket file path for VPP stats API. + DefaultStatsSocket = "/run/vpp/stats.sock" ) var ( - // DefaultStatsSocket is the default path for the VPP stat socket file. - DefaultStatsSocket = "/run/vpp/stats.sock" + ErrStatsDataBusy = errors.New("stats data busy") + ErrStatsDirStale = errors.New("stats dir stale") + ErrStatsDisconnected = errors.New("stats disconnected") + ErrStatsAccessFailed = errors.New("stats access failed") ) // StatsAPI provides connection to VPP stats API. type StatsAPI interface { // Connect establishes client connection to the stats API. Connect() error - // Disconnect terminates client connection. Disconnect() error - // ListStats lists names for all stats. - ListStats(patterns ...string) (statNames []string, err error) - + // ListStats lists names for stats matching patterns. + ListStats(patterns ...string) (names []string, err error) // DumpStats dumps all stat entries. - DumpStats(patterns ...string) ([]*StatEntry, error) + DumpStats(patterns ...string) (entries []StatEntry, err error) + + // PrepareDir prepares new stat dir for entries that match any of prefixes. + PrepareDir(patterns ...string) (*StatDir, error) + // UpdateDir updates stat dir and all of their entries. + UpdateDir(dir *StatDir) error } // StatType represents type of stat directory and simply @@ -73,53 +78,148 @@ func (d StatType) String() string { return fmt.Sprintf("UnknownStatType(%d)", d) } +// StatDir defines directory of stats entries created by PrepareDir. +type StatDir struct { + Epoch int64 + Indexes []uint32 + Entries []StatEntry +} + // StatEntry represents single stat entry. The type of stat stored in Data // is defined by Type. type StatEntry struct { - Name string + Name []byte Type StatType Data Stat } -// Counter represents simple counter with single value. +// Counter represents simple counter with single value, which is usually packet count. type Counter uint64 // CombinedCounter represents counter with two values, for packet count and bytes count. -type CombinedCounter struct { - Packets Counter - Bytes Counter +type CombinedCounter [2]uint64 + +func (s CombinedCounter) Packets() uint64 { + return uint64(s[0]) +} + +func (s CombinedCounter) Bytes() uint64 { + return uint64(s[1]) } // Name represents string value stored under name vector. -type Name string +type Name []byte + +func (n Name) String() string { + return string(n) +} + +// Stat represents some type of stat which is usually defined by StatType. +type Stat interface { + // IsZero returns true if all of its values equal to zero. + IsZero() bool + + // isStat is intentionally unexported to limit implementations of interface to this package, + isStat() +} // ScalarStat represents stat for ScalarIndex. type ScalarStat float64 -// ErrorStat represents stat for ErrorIndex. -type ErrorStat Counter +// ErrorStat represents stat for ErrorIndex. The array represents workers. +type ErrorStat []Counter // SimpleCounterStat represents stat for SimpleCounterVector. // The outer array represents workers and the inner array represents interface/node/.. indexes. // Values should be aggregated per interface/node for every worker. +// ReduceSimpleCounterStatIndex can be used to reduce specific index. type SimpleCounterStat [][]Counter // CombinedCounterStat represents stat for CombinedCounterVector. // The outer array represents workers and the inner array represents interface/node/.. indexes. // Values should be aggregated per interface/node for every worker. +// ReduceCombinedCounterStatIndex can be used to reduce specific index. type CombinedCounterStat [][]CombinedCounter // NameStat represents stat for NameVector. type NameStat []Name -// Data represents some type of stat which is usually defined by StatType. -type Stat interface { - // isStat is unexported to limit implementations of Data interface to this package, - isStat() -} - func (ScalarStat) isStat() {} func (ErrorStat) isStat() {} func (SimpleCounterStat) isStat() {} func (CombinedCounterStat) isStat() {} func (NameStat) isStat() {} + +func (s ScalarStat) IsZero() bool { + return s == 0 +} +func (s ErrorStat) IsZero() bool { + if s == nil { + return true + } + for _, ss := range s { + if ss != 0 { + return false + } + } + return true +} +func (s SimpleCounterStat) IsZero() bool { + if s == nil { + return true + } + for _, ss := range s { + for _, sss := range ss { + if sss != 0 { + return false + } + } + } + return true +} +func (s CombinedCounterStat) IsZero() bool { + if s == nil { + return true + } + for _, ss := range s { + if ss == nil { + return true + } + for _, sss := range ss { + if sss[0] != 0 || sss[1] != 0 { + return false + } + } + } + return true +} +func (s NameStat) IsZero() bool { + if s == nil { + return true + } + for _, ss := range s { + if len(ss) > 0 { + return false + } + } + return true +} + +// ReduceSimpleCounterStatIndex returns reduced SimpleCounterStat s for index i. +func ReduceSimpleCounterStatIndex(s SimpleCounterStat, i int) uint64 { + var val uint64 + for _, w := range s { + val += uint64(w[i]) + } + return val +} + +// ReduceCombinedCounterStatIndex returns reduced CombinedCounterStat s for index i. +func ReduceCombinedCounterStatIndex(s CombinedCounterStat, i int) [2]uint64 { + var val [2]uint64 + for _, w := range s { + val[0] += uint64(w[i][0]) + val[1] += uint64(w[i][1]) + } + return val +}