1 // Copyright (c) 2019 Cisco and/or its affiliates.
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at:
7 // http://www.apache.org/licenses/LICENSE-2.0
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
23 // DefaultStatsSocket defines a default socket file path for VPP stats API.
24 DefaultStatsSocket = "/run/vpp/stats.sock"
28 ErrStatsDataBusy = errors.New("stats data busy")
29 ErrStatsDirStale = errors.New("stats dir stale")
30 ErrStatsAccessFailed = errors.New("stats access failed")
33 // StatsAPI provides connection to VPP stats API.
34 type StatsAPI interface {
35 // Connect establishes client connection to the stats API.
37 // Disconnect terminates client connection.
40 // ListStats lists names for stats matching patterns.
41 ListStats(patterns ...string) (names []string, err error)
42 // DumpStats dumps all stat entries.
43 DumpStats(patterns ...string) (entries []StatEntry, err error)
45 // PrepareDir prepares new stat dir for entries that match any of prefixes.
46 PrepareDir(patterns ...string) (*StatDir, error)
47 // UpdateDir updates stat dir and all of their entries.
48 UpdateDir(dir *StatDir) error
51 // StatType represents type of stat directory and simply
52 // defines what type of stat data is stored in the stat entry.
57 ScalarIndex StatType = 1
58 SimpleCounterVector StatType = 2
59 CombinedCounterVector StatType = 3
60 ErrorIndex StatType = 4
61 NameVector StatType = 5
64 func (d StatType) String() string {
68 case SimpleCounterVector:
69 return "SimpleCounterVector"
70 case CombinedCounterVector:
71 return "CombinedCounterVector"
77 return fmt.Sprintf("UnknownStatType(%d)", d)
80 // StatDir defines directory of stats entries created by PrepareDir.
87 // StatEntry represents single stat entry. The type of stat stored in Data
88 // is defined by Type.
89 type StatEntry struct {
95 // Counter represents simple counter with single value, which is usually packet count.
98 // CombinedCounter represents counter with two values, for packet count and bytes count.
99 type CombinedCounter [2]uint64
101 func (s CombinedCounter) Packets() uint64 {
105 func (s CombinedCounter) Bytes() uint64 {
109 // Name represents string value stored under name vector.
112 func (n Name) String() string {
116 // Stat represents some type of stat which is usually defined by StatType.
117 type Stat interface {
118 // IsZero returns true if all of its values equal to zero.
121 // isStat is intentionally unexported to limit implementations of interface to this package,
125 // ScalarStat represents stat for ScalarIndex.
126 type ScalarStat float64
128 // ErrorStat represents stat for ErrorIndex.
129 type ErrorStat Counter
131 // SimpleCounterStat represents stat for SimpleCounterVector.
132 // The outer array represents workers and the inner array represents interface/node/.. indexes.
133 // Values should be aggregated per interface/node for every worker.
134 // ReduceSimpleCounterStatIndex can be used to reduce specific index.
135 type SimpleCounterStat [][]Counter
137 // CombinedCounterStat represents stat for CombinedCounterVector.
138 // The outer array represents workers and the inner array represents interface/node/.. indexes.
139 // Values should be aggregated per interface/node for every worker.
140 // ReduceCombinedCounterStatIndex can be used to reduce specific index.
141 type CombinedCounterStat [][]CombinedCounter
143 // NameStat represents stat for NameVector.
146 func (ScalarStat) isStat() {}
147 func (ErrorStat) isStat() {}
148 func (SimpleCounterStat) isStat() {}
149 func (CombinedCounterStat) isStat() {}
150 func (NameStat) isStat() {}
152 func (s ScalarStat) IsZero() bool {
155 func (s ErrorStat) IsZero() bool {
158 func (s SimpleCounterStat) IsZero() bool {
162 for _, ss := range s {
163 for _, sss := range ss {
171 func (s CombinedCounterStat) IsZero() bool {
175 for _, ss := range s {
179 for _, sss := range ss {
180 if sss[0] != 0 || sss[1] != 0 {
187 func (s NameStat) IsZero() bool {
191 for _, ss := range s {
199 // ReduceSimpleCounterStatIndex returns reduced SimpleCounterStat s for index i.
200 func ReduceSimpleCounterStatIndex(s SimpleCounterStat, i int) uint64 {
202 for _, w := range s {
208 // ReduceCombinedCounterStatIndex returns reduced CombinedCounterStat s for index i.
209 func ReduceCombinedCounterStatIndex(s CombinedCounterStat, i int) [2]uint64 {
211 for _, w := range s {
212 val[0] += uint64(w[i][0])
213 val[1] += uint64(w[i][1])