message_metrics.go 2.7 KB

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