metrics.go 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. package metrics
  2. import (
  3. "github.com/prometheus/client_golang/prometheus"
  4. )
  5. const (
  6. metricsNamespace = "cloudflared"
  7. rpcSubsystem = "rpc"
  8. )
  9. // CloudflaredServer operation labels
  10. // CloudflaredServer is an extension of SessionManager with additional methods, but it's helpful
  11. // to visualize it separately in the metrics since they are technically different client/servers.
  12. const (
  13. Cloudflared = "cloudflared"
  14. )
  15. // ConfigurationManager operation labels
  16. const (
  17. ConfigurationManager = "config"
  18. OperationUpdateConfiguration = "update_configuration"
  19. )
  20. // SessionManager operation labels
  21. const (
  22. SessionManager = "session"
  23. OperationRegisterUdpSession = "register_udp_session"
  24. OperationUnregisterUdpSession = "unregister_udp_session"
  25. )
  26. // RegistrationServer operation labels
  27. const (
  28. Registration = "registration"
  29. OperationRegisterConnection = "register_connection"
  30. OperationUnregisterConnection = "unregister_connection"
  31. OperationUpdateLocalConfiguration = "update_local_configuration"
  32. )
  33. type rpcMetrics struct {
  34. serverOperations *prometheus.CounterVec
  35. serverFailures *prometheus.CounterVec
  36. serverOperationsLatency *prometheus.HistogramVec
  37. ClientOperations *prometheus.CounterVec
  38. ClientFailures *prometheus.CounterVec
  39. ClientOperationsLatency *prometheus.HistogramVec
  40. }
  41. var CapnpMetrics *rpcMetrics = &rpcMetrics{
  42. serverOperations: prometheus.NewCounterVec(
  43. prometheus.CounterOpts{
  44. Namespace: metricsNamespace,
  45. Subsystem: rpcSubsystem,
  46. Name: "server_operations",
  47. Help: "Number of rpc methods by handler served",
  48. },
  49. []string{"handler", "method"},
  50. ),
  51. serverFailures: prometheus.NewCounterVec(
  52. prometheus.CounterOpts{
  53. Namespace: metricsNamespace,
  54. Subsystem: rpcSubsystem,
  55. Name: "server_failures",
  56. Help: "Number of rpc methods failures by handler served",
  57. },
  58. []string{"handler", "method"},
  59. ),
  60. serverOperationsLatency: prometheus.NewHistogramVec(
  61. prometheus.HistogramOpts{
  62. Namespace: metricsNamespace,
  63. Subsystem: rpcSubsystem,
  64. Name: "server_latency_secs",
  65. Help: "Latency of rpc methods by handler served",
  66. // Bucket starts at 50ms, each bucket grows by a factor of 3, up to 5 buckets and is expressed as seconds:
  67. // 50ms, 150ms, 450ms, 1350ms, 4050ms
  68. Buckets: prometheus.ExponentialBuckets(0.05, 3, 5),
  69. },
  70. []string{"handler", "method"},
  71. ),
  72. ClientOperations: prometheus.NewCounterVec(
  73. prometheus.CounterOpts{
  74. Namespace: metricsNamespace,
  75. Subsystem: rpcSubsystem,
  76. Name: "client_operations",
  77. Help: "Number of rpc methods by handler requested",
  78. },
  79. []string{"handler", "method"},
  80. ),
  81. ClientFailures: prometheus.NewCounterVec(
  82. prometheus.CounterOpts{
  83. Namespace: metricsNamespace,
  84. Subsystem: rpcSubsystem,
  85. Name: "client_failures",
  86. Help: "Number of rpc method failures by handler requested",
  87. },
  88. []string{"handler", "method"},
  89. ),
  90. ClientOperationsLatency: prometheus.NewHistogramVec(
  91. prometheus.HistogramOpts{
  92. Namespace: metricsNamespace,
  93. Subsystem: rpcSubsystem,
  94. Name: "client_latency_secs",
  95. Help: "Latency of rpc methods by handler requested",
  96. // Bucket starts at 50ms, each bucket grows by a factor of 3, up to 5 buckets and is expressed as seconds:
  97. // 50ms, 150ms, 450ms, 1350ms, 4050ms
  98. Buckets: prometheus.ExponentialBuckets(0.05, 3, 5),
  99. },
  100. []string{"handler", "method"},
  101. ),
  102. }
  103. func ObserveServerHandler(inner func() error, handler, method string) error {
  104. defer CapnpMetrics.serverOperations.WithLabelValues(handler, method).Inc()
  105. timer := prometheus.NewTimer(prometheus.ObserverFunc(func(s float64) {
  106. CapnpMetrics.serverOperationsLatency.WithLabelValues(handler, method).Observe(s)
  107. }))
  108. defer timer.ObserveDuration()
  109. err := inner()
  110. if err != nil {
  111. CapnpMetrics.serverFailures.WithLabelValues(handler, method).Inc()
  112. }
  113. return err
  114. }
  115. func NewClientOperationLatencyObserver(server string, method string) *prometheus.Timer {
  116. return prometheus.NewTimer(prometheus.ObserverFunc(func(s float64) {
  117. CapnpMetrics.ClientOperationsLatency.WithLabelValues(server, method).Observe(s)
  118. }))
  119. }
  120. func init() {
  121. prometheus.MustRegister(CapnpMetrics.serverOperations)
  122. prometheus.MustRegister(CapnpMetrics.serverFailures)
  123. prometheus.MustRegister(CapnpMetrics.serverOperationsLatency)
  124. prometheus.MustRegister(CapnpMetrics.ClientOperations)
  125. prometheus.MustRegister(CapnpMetrics.ClientFailures)
  126. prometheus.MustRegister(CapnpMetrics.ClientOperationsLatency)
  127. }