github.com/netdata/go.d.plugin@v0.58.1/pkg/metrics/gauge.go (about) 1 // SPDX-License-Identifier: GPL-3.0-or-later 2 3 package metrics 4 5 import ( 6 "time" 7 8 "github.com/netdata/go.d.plugin/pkg/stm" 9 ) 10 11 type ( 12 // Gauge is a Metric that represents a single numerical value that can 13 // arbitrarily go up and down. 14 // 15 // A Gauge is typically used for measured values like temperatures or current 16 // memory usage, but also "counts" that can go up and down, like the number of 17 // running goroutines. 18 Gauge float64 19 20 // GaugeVec is a Collector that bundles a set of Gauges which have different values for their names. 21 // This is used if you want to count the same thing partitioned by various dimensions 22 // 23 // Create instances with NewGaugeVec. 24 GaugeVec map[string]*Gauge 25 ) 26 27 var ( 28 _ stm.Value = Gauge(0) 29 _ stm.Value = GaugeVec{} 30 ) 31 32 // WriteTo writes its value into given map. 33 func (g Gauge) WriteTo(rv map[string]int64, key string, mul, div int) { 34 rv[key] = int64(float64(g) * float64(mul) / float64(div)) 35 } 36 37 // Value gets current counter. 38 func (g Gauge) Value() float64 { 39 return float64(g) 40 } 41 42 // Set sets the atomicGauge to an arbitrary bits. 43 func (g *Gauge) Set(v float64) { 44 *g = Gauge(v) 45 } 46 47 // Inc increments the atomicGauge by 1. Use Add to increment it by arbitrary 48 // values. 49 func (g *Gauge) Inc() { 50 *g++ 51 } 52 53 // Dec decrements the atomicGauge by 1. Use Sub to decrement it by arbitrary 54 // values. 55 func (g *Gauge) Dec() { 56 *g-- 57 } 58 59 // Add adds the given bits to the atomicGauge. (The bits can be negative, 60 // resulting in a decrease of the atomicGauge.) 61 func (g *Gauge) Add(delta float64) { 62 *g += Gauge(delta) 63 } 64 65 // Sub subtracts the given bits from the atomicGauge. (The bits can be 66 // negative, resulting in an increase of the atomicGauge.) 67 func (g *Gauge) Sub(delta float64) { 68 *g -= Gauge(delta) 69 } 70 71 // SetToCurrentTime sets the atomicGauge to the current Unix time in second. 72 func (g *Gauge) SetToCurrentTime() { 73 *g = Gauge(time.Now().UnixNano()) / 1e9 74 } 75 76 // NewGaugeVec creates a new GaugeVec 77 func NewGaugeVec() GaugeVec { 78 return GaugeVec{} 79 } 80 81 // WriteTo writes its value into given map. 82 func (g GaugeVec) WriteTo(rv map[string]int64, key string, mul, div int) { 83 for name, value := range g { 84 rv[key+"_"+name] = int64(value.Value() * float64(mul) / float64(div)) 85 } 86 } 87 88 // Get gets counter instance by name 89 func (g GaugeVec) Get(name string) *Gauge { 90 item, _ := g.GetP(name) 91 return item 92 } 93 94 // GetP gets counter instance by name 95 func (g GaugeVec) GetP(name string) (gauge *Gauge, ok bool) { 96 gauge, ok = g[name] 97 if ok { 98 return 99 } 100 gauge = new(Gauge) 101 g[name] = gauge 102 return 103 }