2
0

message_metrics.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package nebula
  2. import (
  3. "fmt"
  4. "github.com/rcrowley/go-metrics"
  5. "github.com/slackhq/nebula/header"
  6. )
  7. //TODO: this can probably move into the header package
  8. type MessageMetrics struct {
  9. rx [][]metrics.Counter
  10. tx [][]metrics.Counter
  11. rxUnknown metrics.Counter
  12. txUnknown 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 newMessageMetrics() *MessageMetrics {
  33. gen := func(t string) [][]metrics.Counter {
  34. return [][]metrics.Counter{
  35. {
  36. metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.handshake_ixpsk0", t), nil),
  37. },
  38. nil,
  39. {metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.recv_error", t), nil)},
  40. {metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.lighthouse", t), nil)},
  41. {
  42. metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.test_request", t), nil),
  43. metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.test_response", t), nil),
  44. },
  45. {metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.close_tunnel", t), nil)},
  46. }
  47. }
  48. return &MessageMetrics{
  49. rx: gen("rx"),
  50. tx: gen("tx"),
  51. rxUnknown: metrics.GetOrRegisterCounter("messages.rx.other", nil),
  52. txUnknown: metrics.GetOrRegisterCounter("messages.tx.other", nil),
  53. }
  54. }
  55. // Historically we only recorded recv_error, so this is backwards compat
  56. func newMessageMetricsOnlyRecvError() *MessageMetrics {
  57. gen := func(t string) [][]metrics.Counter {
  58. return [][]metrics.Counter{
  59. nil,
  60. nil,
  61. {metrics.GetOrRegisterCounter(fmt.Sprintf("messages.%s.recv_error", t), nil)},
  62. }
  63. }
  64. return &MessageMetrics{
  65. rx: gen("rx"),
  66. tx: gen("tx"),
  67. }
  68. }
  69. func newLighthouseMetrics() *MessageMetrics {
  70. gen := func(t string) [][]metrics.Counter {
  71. h := make([][]metrics.Counter, len(NebulaMeta_MessageType_name))
  72. used := []NebulaMeta_MessageType{
  73. NebulaMeta_HostQuery,
  74. NebulaMeta_HostQueryReply,
  75. NebulaMeta_HostUpdateNotification,
  76. NebulaMeta_HostPunchNotification,
  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. }