github.com/devkononov/go-func@v0.0.0-20190722084534-f14392d369a7/metrics/gauge_float64.go (about)

     1  package metrics
     2  
     3  import "sync"
     4  
     5  // GaugeFloat64s hold a float64 value that can be set arbitrarily.
     6  type GaugeFloat64 interface {
     7  	Snapshot() GaugeFloat64
     8  	Update(float64)
     9  	Value() float64
    10  }
    11  
    12  // GetOrRegisterGaugeFloat64 returns an existing GaugeFloat64 or constructs and registers a
    13  // new StandardGaugeFloat64.
    14  func GetOrRegisterGaugeFloat64(name string, r Registry) GaugeFloat64 {
    15  	if nil == r {
    16  		r = DefaultRegistry
    17  	}
    18  	return r.GetOrRegister(name, NewGaugeFloat64()).(GaugeFloat64)
    19  }
    20  
    21  // NewGaugeFloat64 constructs a new StandardGaugeFloat64.
    22  func NewGaugeFloat64() GaugeFloat64 {
    23  	if !Enabled {
    24  		return NilGaugeFloat64{}
    25  	}
    26  	return &StandardGaugeFloat64{
    27  		value: 0.0,
    28  	}
    29  }
    30  
    31  // NewRegisteredGaugeFloat64 constructs and registers a new StandardGaugeFloat64.
    32  func NewRegisteredGaugeFloat64(name string, r Registry) GaugeFloat64 {
    33  	c := NewGaugeFloat64()
    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 NewFunctionalGaugeFloat64(f func() float64) GaugeFloat64 {
    43  	if !Enabled {
    44  		return NilGaugeFloat64{}
    45  	}
    46  	return &FunctionalGaugeFloat64{value: f}
    47  }
    48  
    49  // NewRegisteredFunctionalGauge constructs and registers a new StandardGauge.
    50  func NewRegisteredFunctionalGaugeFloat64(name string, r Registry, f func() float64) GaugeFloat64 {
    51  	c := NewFunctionalGaugeFloat64(f)
    52  	if nil == r {
    53  		r = DefaultRegistry
    54  	}
    55  	r.Register(name, c)
    56  	return c
    57  }
    58  
    59  // GaugeFloat64Snapshot is a read-only copy of another GaugeFloat64.
    60  type GaugeFloat64Snapshot float64
    61  
    62  // Snapshot returns the snapshot.
    63  func (g GaugeFloat64Snapshot) Snapshot() GaugeFloat64 { return g }
    64  
    65  // Update panics.
    66  func (GaugeFloat64Snapshot) Update(float64) {
    67  	panic("Update called on a GaugeFloat64Snapshot")
    68  }
    69  
    70  // Value returns the value at the time the snapshot was taken.
    71  func (g GaugeFloat64Snapshot) Value() float64 { return float64(g) }
    72  
    73  // NilGauge is a no-op Gauge.
    74  type NilGaugeFloat64 struct{}
    75  
    76  // Snapshot is a no-op.
    77  func (NilGaugeFloat64) Snapshot() GaugeFloat64 { return NilGaugeFloat64{} }
    78  
    79  // Update is a no-op.
    80  func (NilGaugeFloat64) Update(v float64) {}
    81  
    82  // Value is a no-op.
    83  func (NilGaugeFloat64) Value() float64 { return 0.0 }
    84  
    85  // StandardGaugeFloat64 is the standard implementation of a GaugeFloat64 and uses
    86  // sync.Mutex to manage a single float64 value.
    87  type StandardGaugeFloat64 struct {
    88  	mutex sync.Mutex
    89  	value float64
    90  }
    91  
    92  // Snapshot returns a read-only copy of the gauge.
    93  func (g *StandardGaugeFloat64) Snapshot() GaugeFloat64 {
    94  	return GaugeFloat64Snapshot(g.Value())
    95  }
    96  
    97  // Update updates the gauge's value.
    98  func (g *StandardGaugeFloat64) Update(v float64) {
    99  	g.mutex.Lock()
   100  	defer g.mutex.Unlock()
   101  	g.value = v
   102  }
   103  
   104  // Value returns the gauge's current value.
   105  func (g *StandardGaugeFloat64) Value() float64 {
   106  	g.mutex.Lock()
   107  	defer g.mutex.Unlock()
   108  	return g.value
   109  }
   110  
   111  // FunctionalGaugeFloat64 returns value from given function
   112  type FunctionalGaugeFloat64 struct {
   113  	value func() float64
   114  }
   115  
   116  // Value returns the gauge's current value.
   117  func (g FunctionalGaugeFloat64) Value() float64 {
   118  	return g.value()
   119  }
   120  
   121  // Snapshot returns the snapshot.
   122  func (g FunctionalGaugeFloat64) Snapshot() GaugeFloat64 { return GaugeFloat64Snapshot(g.Value()) }
   123  
   124  // Update panics.
   125  func (FunctionalGaugeFloat64) Update(float64) {
   126  	panic("Update called on a FunctionalGaugeFloat64")
   127  }