1
0

message_metrics.go 3.2 KB

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