github.com/glide-im/glide@v1.6.0/internal/im_server/metrics.go (about) 1 package im_server 2 3 import ( 4 "github.com/glide-im/glide/pkg/gate" 5 "github.com/rcrowley/go-metrics" 6 ) 7 8 func newMeter(name string) metrics.Meter { 9 meter := metrics.NewMeter() 10 _ = metrics.Register(name, meter) 11 return meter 12 } 13 14 func newCounter(name string) metrics.Counter { 15 c := metrics.NewCounter() 16 _ = metrics.Register(name, c) 17 return c 18 } 19 20 func newGauge(name string) metrics.Gauge { 21 g := metrics.NewGauge() 22 _ = metrics.Register(name, g) 23 return g 24 } 25 26 func newHistogram(name string, size int, alpha float64) metrics.Histogram { 27 h := metrics.NewHistogram(metrics.NewExpDecaySample(size, alpha)) 28 _ = metrics.Register(name, h) 29 return h 30 } 31 32 type MessageMetrics struct { 33 MessageInMeter metrics.Meter 34 MessageOutMeter metrics.Meter 35 OutCounter metrics.Counter 36 FailsCounter metrics.Counter 37 InCounter metrics.Counter 38 InHistogram metrics.Histogram 39 OutHistogram metrics.Histogram 40 } 41 42 func NewMessageMetrics() *MessageMetrics { 43 m := &MessageMetrics{ 44 MessageInMeter: newMeter("message.in"), 45 MessageOutMeter: newMeter("message.out"), 46 InCounter: newCounter("message.in"), 47 OutCounter: newCounter("message.out"), 48 FailsCounter: newCounter("message.fails"), 49 InHistogram: newHistogram("message.in", 1024, 0.015), 50 OutHistogram: newHistogram("message.out", 1024, 0.015), 51 } 52 return m 53 } 54 55 func (m *MessageMetrics) In() { 56 m.InCounter.Inc(1) 57 m.MessageInMeter.Mark(1) 58 } 59 60 func (m *MessageMetrics) Out() { 61 m.MessageOutMeter.Mark(1) 62 m.OutCounter.Inc(1) 63 } 64 65 func (m *MessageMetrics) OutFailed() { 66 m.FailsCounter.Inc(1) 67 } 68 69 type ConnectionMetrics struct { 70 ConnectionCounter metrics.Counter 71 LoginCounter metrics.Counter 72 OnlineTempCounter metrics.Counter 73 MaxOnline metrics.Gauge 74 AliveMeter metrics.Meter 75 AliveLoggedMeter metrics.Meter 76 77 AliveTempH metrics.Histogram 78 AliveLoggedH metrics.Histogram 79 } 80 81 func NewConnectionMetrics() *ConnectionMetrics { 82 m := &ConnectionMetrics{ 83 ConnectionCounter: newCounter("conn.all"), 84 LoginCounter: newCounter("conn.login"), 85 OnlineTempCounter: newCounter("conn.online.temp"), 86 MaxOnline: newGauge("conn.online"), 87 AliveMeter: newMeter("conn.alive"), 88 AliveLoggedMeter: newMeter("conn.logged"), 89 AliveTempH: newHistogram("conn.alive.temp", 1024, 0.015), 90 AliveLoggedH: newHistogram("conn.alive.logged", 1024, 0.015), 91 } 92 return m 93 } 94 95 func (c *ConnectionMetrics) Connected() { 96 c.ConnectionCounter.Inc(1) 97 c.OnlineTempCounter.Inc(1) 98 conn := c.ConnectionCounter.Count() 99 c.AliveMeter.Mark(c.ConnectionCounter.Count()) 100 if conn > c.MaxOnline.Value() { 101 c.MaxOnline.Update(conn) 102 } 103 } 104 105 func (c *ConnectionMetrics) Login() { 106 c.LoginCounter.Inc(1) 107 c.AliveLoggedMeter.Mark(c.LoginCounter.Count()) 108 c.OnlineTempCounter.Dec(1) 109 } 110 111 func (c *ConnectionMetrics) Exit(info gate.Info) { 112 c.ConnectionCounter.Dec(1) 113 c.AliveMeter.Mark(c.ConnectionCounter.Count()) 114 if info.ID.IsTemp() { 115 c.OnlineTempCounter.Dec(1) 116 c.AliveTempH.Update(c.OnlineTempCounter.Count()) 117 } else { 118 c.LoginCounter.Dec(1) 119 c.AliveLoggedH.Update(c.LoginCounter.Count()) 120 c.AliveLoggedMeter.Mark(c.LoginCounter.Count()) 121 } 122 }