message_metrics.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. package nebula
  2. import (
  3. "fmt"
  4. "github.com/rcrowley/go-metrics"
  5. "github.com/slackhq/nebula/header"
  6. )
  7. type MessageMetrics struct {
  8. rx [][]metrics.Counter
  9. tx [][]metrics.Counter
  10. rxUnknown metrics.Counter
  11. txUnknown metrics.Counter
  12. rxInvalid metrics.Counter
  13. }
  14. func (m *MessageMetrics) Rx(t header.MessageType, s header.MessageSubType, i int64) {
  15. if m != nil {
  16. if t >= 0 && int(t) < len(m.rx) && s >= 0 && int(s) < len(m.rx[t]) {
  17. m.rx[t][s].Inc(i)
  18. } else if m.rxUnknown != nil {
  19. m.rxUnknown.Inc(i)
  20. }
  21. }
  22. }
  23. func (m *MessageMetrics) Tx(t header.MessageType, s header.MessageSubType, i int64) {
  24. if m != nil {
  25. if t >= 0 && int(t) < len(m.tx) && s >= 0 && int(s) < len(m.tx[t]) {
  26. m.tx[t][s].Inc(i)
  27. } else if m.txUnknown != nil {
  28. m.txUnknown.Inc(i)
  29. }
  30. }
  31. }
  32. func (m *MessageMetrics) RxInvalid(i int64) {
  33. if m != nil && m.rxInvalid != nil {
  34. m.rxInvalid.Inc(i)
  35. }
  36. }
  37. func newMessageMetrics() *MessageMetrics {
  38. gen := func(t string) [][]metrics.Counter {
  39. return [][]metrics.Counter{
  40. {
  41. metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.handshake_ixpsk0", t), nil),
  42. },
  43. nil,
  44. {metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.recv_error", t), nil)},
  45. {metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.lighthouse", t), nil)},
  46. {
  47. metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.test_request", t), nil),
  48. metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.test_response", t), nil),
  49. },
  50. {metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.close_tunnel", t), nil)},
  51. }
  52. }
  53. return &MessageMetrics{
  54. rx: gen("rx"),
  55. tx: gen("tx"),
  56. rxUnknown: metrics.GetOrRegisterCounter("messages.rx.other", nil),
  57. txUnknown: metrics.GetOrRegisterCounter("messages.tx.other", nil),
  58. rxInvalid: metrics.GetOrRegisterCounter("messages.rx.invalid", nil),
  59. }
  60. }
  61. // Historically we only recorded recv_error, so this is backwards compat
  62. func newMessageMetricsOnlyRecvError() *MessageMetrics {
  63. gen := func(t string) [][]metrics.Counter {
  64. return [][]metrics.Counter{
  65. nil,
  66. nil,
  67. {metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.recv_error", t), nil)},
  68. }
  69. }
  70. return &MessageMetrics{
  71. rx: gen("rx"),
  72. tx: gen("tx"),
  73. }
  74. }
  75. func newLighthouseMetrics() *MessageMetrics {
  76. gen := func(t string) [][]metrics.Counter {
  77. h := make([][]metrics.Counter, len(NebulaMeta_MessageType_name))
  78. used := []NebulaMeta_MessageType{
  79. NebulaMeta_HostQuery,
  80. NebulaMeta_HostQueryReply,
  81. NebulaMeta_HostUpdateNotification,
  82. NebulaMeta_HostPunchNotification,
  83. NebulaMeta_HostUpdateNotificationAck,
  84. }
  85. for _, i := range used {
  86. h[i] = []metrics.Counter{metrics.GetOrRegisterCounter(fmt.Sprintf("lighthouse.%s.%s", t, i.String()), nil)}
  87. }
  88. return h
  89. }
  90. return &MessageMetrics{
  91. rx: gen("rx"),
  92. tx: gen("tx"),
  93. rxUnknown: metrics.GetOrRegisterCounter("lighthouse.rx.other", nil),
  94. txUnknown: metrics.GetOrRegisterCounter("lighthouse.tx.other", nil),
  95. }
  96. }