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
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

statsd.go 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package stats
  2. import (
  3. "fmt"
  4. "strings"
  5. "time"
  6. "github.com/9seconds/mtg/v2/events"
  7. "github.com/9seconds/mtg/v2/mtglib"
  8. statsd "github.com/smira/go-statsd"
  9. )
  10. type statsdFakeLogger struct{}
  11. func (s statsdFakeLogger) Printf(msg string, args ...interface{}) {}
  12. type statsdProcessor struct {
  13. streams map[string]*streamInfo
  14. client *statsd.Client
  15. }
  16. func (s statsdProcessor) EventStart(evt mtglib.EventStart) {
  17. sInfo := &streamInfo{
  18. createdAt: evt.CreatedAt,
  19. clientIP: evt.RemoteIP,
  20. }
  21. s.streams[evt.StreamID()] = sInfo
  22. ipTypeTag := statsd.StringTag(TagIPType, sInfo.IPType())
  23. s.client.GaugeDelta(MetricActiveConnection, 1, ipTypeTag)
  24. }
  25. func (s statsdProcessor) EventFinish(evt mtglib.EventFinish) {
  26. sInfo, ok := s.streams[evt.StreamID()]
  27. if !ok {
  28. return
  29. }
  30. defer delete(s.streams, evt.StreamID())
  31. duration := evt.CreatedAt.Sub(sInfo.createdAt)
  32. ipTypeTag := statsd.StringTag(TagIPType, sInfo.IPType())
  33. s.client.GaugeDelta(MetricActiveConnection, -1, ipTypeTag)
  34. s.client.PrecisionTiming(MetricSessionDuration, duration)
  35. }
  36. func (s statsdProcessor) EventConcurrencyLimited(_ mtglib.EventConcurrencyLimited) {
  37. s.client.Incr(MetricConcurrencyLimited, 1)
  38. }
  39. func (s statsdProcessor) Shutdown() {
  40. now := time.Now()
  41. events := make([]mtglib.EventFinish, 0, len(s.streams))
  42. for k := range s.streams {
  43. events = append(events, mtglib.EventFinish{
  44. CreatedAt: now,
  45. ConnID: k,
  46. })
  47. }
  48. for i := range events {
  49. s.EventFinish(events[i])
  50. }
  51. }
  52. type StatsdFactory struct {
  53. client *statsd.Client
  54. }
  55. func (s StatsdFactory) Close() error {
  56. return s.client.Close()
  57. }
  58. func (s StatsdFactory) Make() events.Observer {
  59. return statsdProcessor{
  60. client: s.client,
  61. streams: make(map[string]*streamInfo),
  62. }
  63. }
  64. func NewStatsd(address, metricPrefix, tagFormat string) (StatsdFactory, error) {
  65. options := []statsd.Option{
  66. statsd.MetricPrefix(metricPrefix),
  67. statsd.Logger(statsdFakeLogger{}),
  68. }
  69. switch strings.ToLower(tagFormat) {
  70. case "datadog":
  71. options = append(options, statsd.TagStyle(statsd.TagFormatDatadog))
  72. case "influxdb":
  73. options = append(options, statsd.TagStyle(statsd.TagFormatInfluxDB))
  74. case "graphite":
  75. options = append(options, statsd.TagStyle(statsd.TagFormatGraphite))
  76. default:
  77. return StatsdFactory{}, fmt.Errorf("unknown tag format %s", tagFormat)
  78. }
  79. return StatsdFactory{
  80. client: statsd.NewClient(address, options...),
  81. }, nil
  82. }