| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- package stats
-
- import (
- "net"
- "sync/atomic"
- "time"
-
- "github.com/9seconds/mtg/mtproto"
- )
-
- const (
- crashesChanLength = 1
- connectionsChanLength = 20
- trafficChanLength = 5000
- )
-
- var (
- CrashesChan = make(chan struct{}, crashesChanLength)
- ConnectionsChan = make(chan *connectionData, connectionsChanLength)
- TrafficChan = make(chan *trafficData, trafficChanLength)
- )
-
- type connectionData struct {
- connectionType mtproto.ConnectionType
- addr *net.TCPAddr
- connected bool
- }
-
- type trafficData struct {
- traffic int
- ingress bool
- }
-
- func crashManager() {
- for range CrashesChan {
- instance.mutex.RLock()
-
- instance.Crashes++
-
- instance.mutex.RUnlock()
- }
- }
-
- func connectionManager() {
- for event := range ConnectionsChan {
- instance.mutex.RLock()
-
- isIPv4 := event.addr.IP.To4() != nil
- var inc uint32 = 1
- if !event.connected {
- inc = ^uint32(0)
- }
-
- switch event.connectionType {
- case mtproto.ConnectionTypeAbridged:
- if isIPv4 {
- atomic.AddUint32(&instance.ActiveConnections.Abridged.IPv4, inc)
- if event.connected {
- atomic.AddUint32(&instance.AllConnections.Abridged.IPv4, inc)
- }
- } else {
- atomic.AddUint32(&instance.ActiveConnections.Abridged.IPv6, inc)
- if event.connected {
- atomic.AddUint32(&instance.AllConnections.Abridged.IPv6, inc)
- }
- }
- default:
- if isIPv4 {
- atomic.AddUint32(&instance.ActiveConnections.Intermediate.IPv4, inc)
- if event.connected {
- atomic.AddUint32(&instance.AllConnections.Intermediate.IPv4, inc)
- }
- } else {
- atomic.AddUint32(&instance.ActiveConnections.Intermediate.IPv6, inc)
- if event.connected {
- atomic.AddUint32(&instance.AllConnections.Intermediate.IPv6, inc)
- }
- }
- }
-
- instance.mutex.RUnlock()
- }
- }
-
- func trafficManager() {
- speedChan := time.Tick(time.Second)
-
- for {
- select {
- case event := <-TrafficChan:
- instance.mutex.RLock()
-
- if event.ingress {
- instance.Traffic.Ingress += trafficValue(event.traffic)
- instance.speedCurrent.Ingress += trafficSpeedValue(event.traffic)
- } else {
- instance.Traffic.Egress += trafficValue(event.traffic)
- instance.speedCurrent.Egress += trafficSpeedValue(event.traffic)
- }
-
- instance.mutex.RUnlock()
- case <-speedChan:
- instance.mutex.RLock()
-
- instance.Speed.Ingress = instance.speedCurrent.Ingress
- instance.Speed.Egress = instance.speedCurrent.Egress
- instance.speedCurrent.Ingress = trafficSpeedValue(0)
- instance.speedCurrent.Egress = trafficSpeedValue(0)
-
- instance.mutex.RUnlock()
- }
- }
- }
-
- func NewCrash() {
- CrashesChan <- struct{}{}
- }
-
- func ClientConnected(connectionType mtproto.ConnectionType, addr *net.TCPAddr) {
- ConnectionsChan <- &connectionData{
- connectionType: connectionType,
- addr: addr,
- connected: true,
- }
- }
-
- func ClientDisconnected(connectionType mtproto.ConnectionType, addr *net.TCPAddr) {
- ConnectionsChan <- &connectionData{
- connectionType: connectionType,
- addr: addr,
- connected: false,
- }
- }
-
- func IngressTraffic(traffic int) {
- TrafficChan <- &trafficData{
- traffic: traffic,
- ingress: true,
- }
- }
-
- func EgressTraffic(traffic int) {
- TrafficChan <- &trafficData{
- traffic: traffic,
- ingress: false,
- }
- }
|