github.com/FusionFoundation/efsn/v4@v4.2.0/metrics/gauge.go (about)

     1  package metrics
     2  
     3  import "sync/atomic"
     4  
     5  // Gauges hold an int64 value that can be set arbitrarily.
     6  type Gauge interface {
     7  	Snapshot() Gauge
     8  	Update(int64)
     9  	Dec(int64)
    10  	Inc(int64)
    11  	Value() int64
    12  }
    13  
    14  // GetOrRegisterGauge returns an existing Gauge or constructs and registers a
    15  // new StandardGauge.
    16  func GetOrRegisterGauge(name string, r Registry) Gauge {
    17  	if nil == r {
    18  		r = DefaultRegistry
    19  	}
    20  	return r.GetOrRegister(name, NewGauge).(Gauge)
    21  }
    22  
    23  // NewGauge constructs a new StandardGauge.
    24  func NewGauge() Gauge {
    25  	if !Enabled {
    26  		return NilGauge{}
    27  	}
    28  	return &StandardGauge{0}
    29  }
    30  
    31  // NewRegisteredGauge constructs and registers a new StandardGauge.
    32  func NewRegisteredGauge(name string, r Registry) Gauge {
    33  	c := NewGauge()
    34  	if nil == r {
    35  		r = DefaultRegistry
    36  	}
    37  	r.Register(name, c)
    38  	return c
    39  }
    40  
    41  // NewFunctionalGauge constructs a new FunctionalGauge.
    42  func NewFunctionalGauge(f func() int64) Gauge {
    43  	if !Enabled {
    44  		return NilGauge{}
    45  	}
    46  	return &FunctionalGauge{value: f}
    47  }
    48  
    49  // NewRegisteredFunctionalGauge constructs and registers a new StandardGauge.
    50  func NewRegisteredFunctionalGauge(name string, r Registry, f func() int64) Gauge {
    51  	c := NewFunctionalGauge(f)
    52  	if nil == r {
    53  		r = DefaultRegistry
    54  	}
    55  	r.Register(name, c)
    56  	return c
    57  }
    58  
    59  // GaugeSnapshot is a read-only copy of another Gauge.
    60  type GaugeSnapshot int64
    61  
    62  // Snapshot returns the snapshot.
    63  func (g GaugeSnapshot) Snapshot() Gauge { return g }
    64  
    65  // Update panics.
    66  func (GaugeSnapshot) Update(int64) {
    67  	panic("Update called on a GaugeSnapshot")
    68  }
    69  
    70  // Dec panics.
    71  func (GaugeSnapshot) Dec(int64) {
    72  	panic("Dec called on a GaugeSnapshot")
    73  }
    74  
    75  // Inc panics.
    76  func (GaugeSnapshot) Inc(int64) {
    77  	panic("Inc called on a GaugeSnapshot")
    78  }
    79  
    80  // Value returns the value at the time the snapshot was taken.
    81  func (g GaugeSnapshot) Value() int64 { return int64(g) }
    82  
    83  // NilGauge is a no-op Gauge.
    84  type NilGauge struct{}
    85  
    86  // Snapshot is a no-op.
    87  func (NilGauge) Snapshot() Gauge { return NilGauge{} }
    88  
    89  // Update is a no-op.
    90  func (NilGauge) Update(v int64) {}
    91  
    92  // Dec is a no-op.
    93  func (NilGauge) Dec(i int64) {}
    94  
    95  // Inc is a no-op.
    96  func (NilGauge) Inc(i int64) {}
    97  
    98  // Value is a no-op.
    99  func (NilGauge) Value() int64 { return 0 }
   100  
   101  // StandardGauge is the standard implementation of a Gauge and uses the
   102  // sync/atomic package to manage a single int64 value.
   103  type StandardGauge struct {
   104  	value int64
   105  }
   106  
   107  // Snapshot returns a read-only copy of the gauge.
   108  func (g *StandardGauge) Snapshot() Gauge {
   109  	return GaugeSnapshot(g.Value())
   110  }
   111  
   112  // Update updates the gauge's value.
   113  func (g *StandardGauge) Update(v int64) {
   114  	atomic.StoreInt64(&g.value, v)
   115  }
   116  
   117  // Value returns the gauge's current value.
   118  func (g *StandardGauge) Value() int64 {
   119  	return atomic.LoadInt64(&g.value)
   120  }
   121  
   122  // Dec decrements the gauge's current value by the given amount.
   123  func (g *StandardGauge) Dec(i int64) {
   124  	atomic.AddInt64(&g.value, -i)
   125  }
   126  
   127  // Inc increments the gauge's current value by the given amount.
   128  func (g *StandardGauge) Inc(i int64) {
   129  	atomic.AddInt64(&g.value, i)
   130  }
   131  
   132  // FunctionalGauge returns value from given function
   133  type FunctionalGauge struct {
   134  	value func() int64
   135  }
   136  
   137  // Value returns the gauge's current value.
   138  func (g FunctionalGauge) Value() int64 {
   139  	return g.value()
   140  }
   141  
   142  // Snapshot returns the snapshot.
   143  func (g FunctionalGauge) Snapshot() Gauge { return GaugeSnapshot(g.Value()) }
   144  
   145  // Update panics.
   146  func (FunctionalGauge) Update(int64) {
   147  	panic("Update called on a FunctionalGauge")
   148  }
   149  
   150  // Dec panics.
   151  func (FunctionalGauge) Dec(int64) {
   152  	panic("Dec called on a FunctionalGauge")
   153  }
   154  
   155  // Inc panics.
   156  func (FunctionalGauge) Inc(int64) {
   157  	panic("Inc called on a FunctionalGauge")
   158  }