github.com/cristalhq/netx@v0.0.0-20221116164110-442313ef3309/stats.go (about)

     1  package netx
     2  
     3  import (
     4  	"sync/atomic"
     5  )
     6  
     7  // atomicCounter is a false sharing safe counter.
     8  type atomicCounter struct {
     9  	count uint64
    10  	_     [7]uint64
    11  }
    12  
    13  type cacheLine [64]byte
    14  
    15  // Stats object that can be queried to obtain certain metrics and get better observability.
    16  type Stats struct {
    17  	_            cacheLine
    18  	accepts      atomicCounter
    19  	acceptErrors atomicCounter
    20  	activeConns  atomicCounter
    21  	conns        atomicCounter
    22  	closeErrors  atomicCounter
    23  
    24  	readCalls    atomicCounter
    25  	readBytes    atomicCounter
    26  	readErrors   atomicCounter
    27  	readTimeouts atomicCounter
    28  
    29  	writeCalls    atomicCounter
    30  	writtenBytes  atomicCounter
    31  	writeErrors   atomicCounter
    32  	writeTimeouts atomicCounter
    33  
    34  	_ cacheLine
    35  }
    36  
    37  func (s *Stats) Accepts() uint64      { return atomic.LoadUint64(&s.accepts.count) }
    38  func (s *Stats) AcceptErrors() uint64 { return atomic.LoadUint64(&s.acceptErrors.count) }
    39  func (s *Stats) Conns() uint64        { return atomic.LoadUint64(&s.conns.count) }
    40  func (s *Stats) CloseErrors() uint64  { return atomic.LoadUint64(&s.closeErrors.count) }
    41  
    42  func (s *Stats) ReadCalls() uint64    { return atomic.LoadUint64(&s.readCalls.count) }
    43  func (s *Stats) ReadBytes() uint64    { return atomic.LoadUint64(&s.readBytes.count) }
    44  func (s *Stats) ReadErrors() uint64   { return atomic.LoadUint64(&s.readErrors.count) }
    45  func (s *Stats) ReadTimeouts() uint64 { return atomic.LoadUint64(&s.readTimeouts.count) }
    46  
    47  func (s *Stats) WriteCalls() uint64    { return atomic.LoadUint64(&s.writeCalls.count) }
    48  func (s *Stats) WrittenBytes() uint64  { return atomic.LoadUint64(&s.writtenBytes.count) }
    49  func (s *Stats) WriteErrors() uint64   { return atomic.LoadUint64(&s.writeErrors.count) }
    50  func (s *Stats) WriteTimeouts() uint64 { return atomic.LoadUint64(&s.writeTimeouts.count) }
    51  
    52  func (s *Stats) acceptsInc()      { atomic.AddUint64(&s.accepts.count, 1) }
    53  func (s *Stats) acceptErrorsInc() { atomic.AddUint64(&s.acceptErrors.count, 1) }
    54  func (s *Stats) activeConnsInc()  { atomic.AddUint64(&s.activeConns.count, 1) }
    55  func (s *Stats) connsInc()        { atomic.AddUint64(&s.conns.count, 1) }
    56  func (s *Stats) closeErrorsInc()  { atomic.AddUint64(&s.closeErrors.count, 1) }
    57  
    58  func (s *Stats) readBytesAdd(n int) {
    59  	atomic.AddUint64(&s.readCalls.count, 1)
    60  	atomic.AddUint64(&s.readBytes.count, uint64(n))
    61  }
    62  func (s *Stats) readTimeoutsInc() { atomic.AddUint64(&s.readTimeouts.count, 1) }
    63  func (s *Stats) readErrorsInc()   { atomic.AddUint64(&s.readErrors.count, 1) }
    64  
    65  func (s *Stats) writtenBytesAdd(n int) {
    66  	atomic.AddUint64(&s.writeCalls.count, 1)
    67  	atomic.AddUint64(&s.writtenBytes.count, uint64(n))
    68  }
    69  func (s *Stats) writeTimeoutsInc() { atomic.AddUint64(&s.writeTimeouts.count, 1) }
    70  func (s *Stats) writeErrorsInc()   { atomic.AddUint64(&s.writeErrors.count, 1) }