github.com/netdata/go.d.plugin@v0.58.1/pkg/metrics/counter.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package metrics 4 5 import ( 6 "errors" 7 8 "github.com/netdata/go.d.plugin/pkg/stm" 9 ) 10 11 type ( 12 // Counter is a Metric that represents a single numerical bits that only ever 13 // goes up. That implies that it cannot be used to count items whose number can 14 // also go down, e.g. the number of currently running goroutines. Those 15 // "counters" are represented by Gauges. 16 // 17 // A Counter is typically used to count requests served, tasks completed, errors 18 // occurred, etc. 19 Counter struct { 20 valInt int64 21 valFloat float64 22 } 23 24 // CounterVec is a Collector that bundles a set of Counters which have different values for their names. 25 // This is used if you want to count the same thing partitioned by various dimensions 26 // (e.g. number of HTTP requests, partitioned by response code and method). 27 // 28 // Create instances with NewCounterVec. 29 CounterVec map[string]*Counter 30 ) 31 32 var ( 33 _ stm.Value = Counter{} 34 _ stm.Value = CounterVec{} 35 ) 36 37 // WriteTo writes its value into given map. 38 func (c Counter) WriteTo(rv map[string]int64, key string, mul, div int) { 39 rv[key] = int64(c.Value() * float64(mul) / float64(div)) 40 } 41 42 // Value gets current counter. 43 func (c Counter) Value() float64 { 44 return float64(c.valInt) + c.valFloat 45 } 46 47 // Inc increments the counter by 1. Use Add to increment it by arbitrary 48 // non-negative values. 49 func (c *Counter) Inc() { 50 c.valInt++ 51 } 52 53 // Add adds the given bits to the counter. It panics if the value is < 0. 54 func (c *Counter) Add(v float64) { 55 if v < 0 { 56 panic(errors.New("counter cannot decrease in value")) 57 } 58 val := int64(v) 59 if float64(val) == v { 60 c.valInt += val 61 return 62 } 63 c.valFloat += v 64 } 65 66 // NewCounterVec creates a new CounterVec 67 func NewCounterVec() CounterVec { 68 return CounterVec{} 69 } 70 71 // WriteTo writes its value into given map. 72 func (c CounterVec) WriteTo(rv map[string]int64, key string, mul, div int) { 73 for name, value := range c { 74 rv[key+"_"+name] = int64(value.Value() * float64(mul) / float64(div)) 75 } 76 } 77 78 // Get gets counter instance by name 79 func (c CounterVec) Get(name string) *Counter { 80 item, _ := c.GetP(name) 81 return item 82 } 83 84 // GetP gets counter instance by name 85 func (c CounterVec) GetP(name string) (counter *Counter, ok bool) { 86 counter, ok = c[name] 87 if ok { 88 return 89 } 90 counter = &Counter{} 91 c[name] = counter 92 return 93 }