github.com/neatlab/neatio@v1.7.3-0.20220425043230-d903e92fcc75/utilities/metrics/counter.go (about)

     1  package metrics
     2  
     3  import "sync/atomic"
     4  
     5  type Counter interface {
     6  	Clear()
     7  	Count() int64
     8  	Dec(int64)
     9  	Inc(int64)
    10  	Snapshot() Counter
    11  }
    12  
    13  func GetOrRegisterCounter(name string, r Registry) Counter {
    14  	if nil == r {
    15  		r = DefaultRegistry
    16  	}
    17  	return r.GetOrRegister(name, NewCounter).(Counter)
    18  }
    19  
    20  func NewCounter() Counter {
    21  	if !Enabled {
    22  		return NilCounter{}
    23  	}
    24  	return &StandardCounter{0}
    25  }
    26  
    27  func NewRegisteredCounter(name string, r Registry) Counter {
    28  	c := NewCounter()
    29  	if nil == r {
    30  		r = DefaultRegistry
    31  	}
    32  	r.Register(name, c)
    33  	return c
    34  }
    35  
    36  type CounterSnapshot int64
    37  
    38  func (CounterSnapshot) Clear() {
    39  	panic("Clear called on a CounterSnapshot")
    40  }
    41  
    42  func (c CounterSnapshot) Count() int64 { return int64(c) }
    43  
    44  func (CounterSnapshot) Dec(int64) {
    45  	panic("Dec called on a CounterSnapshot")
    46  }
    47  
    48  func (CounterSnapshot) Inc(int64) {
    49  	panic("Inc called on a CounterSnapshot")
    50  }
    51  
    52  func (c CounterSnapshot) Snapshot() Counter { return c }
    53  
    54  type NilCounter struct{}
    55  
    56  func (NilCounter) Clear() {}
    57  
    58  func (NilCounter) Count() int64 { return 0 }
    59  
    60  func (NilCounter) Dec(i int64) {}
    61  
    62  func (NilCounter) Inc(i int64) {}
    63  
    64  func (NilCounter) Snapshot() Counter { return NilCounter{} }
    65  
    66  type StandardCounter struct {
    67  	count int64
    68  }
    69  
    70  func (c *StandardCounter) Clear() {
    71  	atomic.StoreInt64(&c.count, 0)
    72  }
    73  
    74  func (c *StandardCounter) Count() int64 {
    75  	return atomic.LoadInt64(&c.count)
    76  }
    77  
    78  func (c *StandardCounter) Dec(i int64) {
    79  	atomic.AddInt64(&c.count, -i)
    80  }
    81  
    82  func (c *StandardCounter) Inc(i int64) {
    83  	atomic.AddInt64(&c.count, i)
    84  }
    85  
    86  func (c *StandardCounter) Snapshot() Counter {
    87  	return CounterSnapshot(c.Count())
    88  }