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  }