Highly-opinionated (ex-bullshit-free) MTPROTO proxy for Telegram. If you use v1.0 or upgrade broke you proxy, please read the chapter Version 2
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

stats.go 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package stats
  2. import (
  3. "context"
  4. "net"
  5. "net/http"
  6. "github.com/juju/errors"
  7. "github.com/9seconds/mtg/config"
  8. "github.com/9seconds/mtg/conntypes"
  9. )
  10. type Stats interface {
  11. IngressTraffic(int)
  12. EgressTraffic(int)
  13. ClientConnected(conntypes.ConnectionType, *net.TCPAddr)
  14. ClientDisconnected(conntypes.ConnectionType, *net.TCPAddr)
  15. Crash()
  16. AntiReplayDetected()
  17. }
  18. type multiStats []Stats
  19. func (m multiStats) IngressTraffic(traffic int) {
  20. for i := range m {
  21. go m[i].IngressTraffic(traffic)
  22. }
  23. }
  24. func (m multiStats) EgressTraffic(traffic int) {
  25. for i := range m {
  26. go m[i].EgressTraffic(traffic)
  27. }
  28. }
  29. func (m multiStats) ClientConnected(connectionType conntypes.ConnectionType, addr *net.TCPAddr) {
  30. for i := range m {
  31. go m[i].ClientConnected(connectionType, addr)
  32. }
  33. }
  34. func (m multiStats) ClientDisconnected(connectionType conntypes.ConnectionType, addr *net.TCPAddr) {
  35. for i := range m {
  36. go m[i].ClientDisconnected(connectionType, addr)
  37. }
  38. }
  39. func (m multiStats) Crash() {
  40. for i := range m {
  41. go m[i].Crash()
  42. }
  43. }
  44. func (m multiStats) AntiReplayDetected() {
  45. for i := range m {
  46. go m[i].AntiReplayDetected()
  47. }
  48. }
  49. var S Stats
  50. func Init(ctx context.Context) error {
  51. mux := http.NewServeMux()
  52. instanceJSON := newStatsJSON(mux)
  53. instancePrometheus, err := newStatsPrometheus(mux)
  54. if err != nil {
  55. return errors.Annotate(err, "Cannot initialize Prometheus")
  56. }
  57. stats := []Stats{instanceJSON, instancePrometheus}
  58. if config.C.StatsdStats.Addr.IP != nil {
  59. instanceStatsd, err := newStatsStatsd()
  60. if err != nil {
  61. return errors.Annotate(err, "Cannot initialize StatsD")
  62. }
  63. stats = append(stats, instanceStatsd)
  64. }
  65. listener, err := net.Listen("tcp", config.C.StatsAddr.String())
  66. if err != nil {
  67. return errors.Annotate(err, "Cannot initialize stats server")
  68. }
  69. srv := http.Server{
  70. Handler: mux,
  71. }
  72. go srv.Serve(listener) // nolint: errcheck
  73. go func() {
  74. <-ctx.Done()
  75. srv.Shutdown(context.Background()) // nolint: errcheck
  76. }()
  77. S = multiStats(stats)
  78. return nil
  79. }