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) }