metrics.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package ccq
  2. import (
  3. "fmt"
  4. "github.com/prometheus/client_golang/prometheus"
  5. "github.com/prometheus/client_golang/prometheus/promauto"
  6. dto "github.com/prometheus/client_model/go"
  7. )
  8. var (
  9. allQueryRequestsReceived = promauto.NewCounter(
  10. prometheus.CounterOpts{
  11. Name: "ccq_server_total_query_requests_received",
  12. Help: "Total number of query requests received, valid and invalid",
  13. })
  14. validQueryRequestsReceived = promauto.NewCounter(
  15. prometheus.CounterOpts{
  16. Name: "ccq_server_total_valid_query_requests_received",
  17. Help: "Total number of valid query requests received",
  18. })
  19. invalidQueryRequestReceived = promauto.NewCounterVec(
  20. prometheus.CounterOpts{
  21. Name: "ccq_server_invalid_query_requests_received_by_reason",
  22. Help: "Total number of invalid query requests received by reason",
  23. }, []string{"reason"})
  24. totalRequestedCallsByChain = promauto.NewCounterVec(
  25. prometheus.CounterOpts{
  26. Name: "ccq_server_total_requested_calls_by_chain",
  27. Help: "Total number of requested calls by chain",
  28. }, []string{"chain_name"})
  29. totalRequestsByUser = promauto.NewCounterVec(
  30. prometheus.CounterOpts{
  31. Name: "ccq_server_total_requests_by_user",
  32. Help: "Total number of requests by user name",
  33. }, []string{"user_name"})
  34. successfulQueriesByUser = promauto.NewCounterVec(
  35. prometheus.CounterOpts{
  36. Name: "ccq_server_successful_queries_by_user",
  37. Help: "Total number of successful queries by user name",
  38. }, []string{"user_name"})
  39. rateLimitExceededByUser = promauto.NewCounterVec(
  40. prometheus.CounterOpts{
  41. Name: "ccq_server_rate_limit_exceeded_by_user",
  42. Help: "Total number of queries rejected due to rate limiting per user name",
  43. }, []string{"user_name"})
  44. failedQueriesByUser = promauto.NewCounterVec(
  45. prometheus.CounterOpts{
  46. Name: "ccq_server_failed_queries_by_user",
  47. Help: "Total number of failed queries by user name",
  48. }, []string{"user_name"})
  49. queryTimeoutsByUser = promauto.NewCounterVec(
  50. prometheus.CounterOpts{
  51. Name: "ccq_server_query_timeouts_by_user",
  52. Help: "Total number of query timeouts by user name",
  53. }, []string{"user_name"})
  54. quorumNotMetByUser = promauto.NewCounterVec(
  55. prometheus.CounterOpts{
  56. Name: "ccq_server_quorum_not_met_by_user",
  57. Help: "Total number of query failures due to quorum not met by user name",
  58. }, []string{"user_name"})
  59. invalidRequestsByUser = promauto.NewCounterVec(
  60. prometheus.CounterOpts{
  61. Name: "ccq_server_invalid_requests_by_user",
  62. Help: "Total number of invalid requests by user name",
  63. }, []string{"user_name"})
  64. queryResponsesReceived = promauto.NewCounterVec(
  65. prometheus.CounterOpts{
  66. Name: "ccq_server_total_query_responses_received_by_peer_id",
  67. Help: "Total number of query responses received by peer ID",
  68. }, []string{"peer_id"})
  69. queryResponsesReceivedByChainAndPeerID = promauto.NewCounterVec(
  70. prometheus.CounterOpts{
  71. Name: "ccq_server_total_query_responses_received_by_chain_and_peer_id",
  72. Help: "Total number of query responses received by chain and peer ID",
  73. }, []string{"chain_name", "peer_id"})
  74. inboundP2pError = promauto.NewCounterVec(
  75. prometheus.CounterOpts{
  76. Name: "ccq_server_inbound_p2p_errors",
  77. Help: "Total number of inbound p2p errors",
  78. }, []string{"reason"})
  79. totalQueryTime = promauto.NewHistogram(
  80. prometheus.HistogramOpts{
  81. Name: "ccq_server_total_query_time_in_ms",
  82. Help: "Time from request to response published in ms",
  83. Buckets: []float64{10.0, 100.0, 250.0, 500.0, 1000.0, 5000.0, 10000.0, 30000.0},
  84. })
  85. permissionFileReloadsSuccess = promauto.NewCounter(
  86. prometheus.CounterOpts{
  87. Name: "ccq_server_perm_file_reload_success",
  88. Help: "Total number of times the permissions file was successfully reloaded",
  89. })
  90. permissionFileReloadsFailure = promauto.NewCounter(
  91. prometheus.CounterOpts{
  92. Name: "ccq_server_perm_file_reload_failure",
  93. Help: "Total number of times the permissions file failed to reload",
  94. })
  95. successfulReconnects = promauto.NewCounter(
  96. prometheus.CounterOpts{
  97. Name: "ccq_server_total_number_of_successful_reconnects",
  98. Help: "Total number of successful reconnects to bootstrap peers",
  99. })
  100. currentNumConcurrentQueriesByChain = promauto.NewGaugeVec(
  101. prometheus.GaugeOpts{
  102. Name: "ccq_server_current_num_concurrent_queries_by_chain",
  103. Help: "Gauge showing the current number of concurrent query requests by chain",
  104. }, []string{"chain_name"})
  105. maxConcurrentQueriesByChain = promauto.NewGaugeVec(
  106. prometheus.GaugeOpts{
  107. Name: "ccq_server_max_concurrent_queries_by_chain",
  108. Help: "Gauge showing the maximum concurrent query requests by chain",
  109. }, []string{"chain_name"})
  110. )
  111. // getGaugeValue returns the current value of a metric.
  112. func getGaugeValue(gauge prometheus.Gauge) (float64, error) {
  113. metric := &dto.Metric{}
  114. if err := gauge.Write(metric); err != nil {
  115. return 0, fmt.Errorf("failed to read metric value: %w", err)
  116. }
  117. return metric.GetGauge().GetValue(), nil
  118. }