vec.go 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. package prometheus
  2. import (
  3. "github.com/prometheus/client_golang/prometheus"
  4. "github.com/ydb-platform/ydb/library/go/core/metrics"
  5. "github.com/ydb-platform/ydb/library/go/core/metrics/internal/pkg/metricsutil"
  6. "github.com/ydb-platform/ydb/library/go/core/xerrors"
  7. )
  8. var _ metrics.CounterVec = (*CounterVec)(nil)
  9. // CounterVec wraps prometheus.CounterVec
  10. // and implements metrics.CounterVec interface.
  11. type CounterVec struct {
  12. vec *prometheus.CounterVec
  13. }
  14. // CounterVec creates a new counters vector with given metric name and
  15. // partitioned by the given label names.
  16. func (r *Registry) CounterVec(name string, labels []string) metrics.CounterVec {
  17. name = r.sanitizeName(name)
  18. vec := prometheus.NewCounterVec(prometheus.CounterOpts{
  19. Namespace: r.prefix,
  20. Name: name,
  21. ConstLabels: r.tags,
  22. }, labels)
  23. if err := r.rg.Register(vec); err != nil {
  24. var existErr prometheus.AlreadyRegisteredError
  25. if xerrors.As(err, &existErr) {
  26. return &CounterVec{vec: existErr.ExistingCollector.(*prometheus.CounterVec)}
  27. }
  28. panic(err)
  29. }
  30. return &CounterVec{vec: vec}
  31. }
  32. // With creates new or returns existing counter with given tags from vector.
  33. // It will panic if tags keys set is not equal to vector labels.
  34. func (v *CounterVec) With(tags map[string]string) metrics.Counter {
  35. return &Counter{cnt: v.vec.With(tags)}
  36. }
  37. // Reset deletes all metrics in this vector.
  38. func (v *CounterVec) Reset() {
  39. v.vec.Reset()
  40. }
  41. var _ metrics.GaugeVec = (*GaugeVec)(nil)
  42. // GaugeVec wraps prometheus.GaugeVec
  43. // and implements metrics.GaugeVec interface.
  44. type GaugeVec struct {
  45. vec *prometheus.GaugeVec
  46. }
  47. // GaugeVec creates a new gauges vector with given metric name and
  48. // partitioned by the given label names.
  49. func (r *Registry) GaugeVec(name string, labels []string) metrics.GaugeVec {
  50. name = r.sanitizeName(name)
  51. vec := prometheus.NewGaugeVec(prometheus.GaugeOpts{
  52. Namespace: r.prefix,
  53. Name: name,
  54. ConstLabels: r.tags,
  55. }, labels)
  56. if err := r.rg.Register(vec); err != nil {
  57. var existErr prometheus.AlreadyRegisteredError
  58. if xerrors.As(err, &existErr) {
  59. return &GaugeVec{vec: existErr.ExistingCollector.(*prometheus.GaugeVec)}
  60. }
  61. panic(err)
  62. }
  63. return &GaugeVec{vec: vec}
  64. }
  65. // With creates new or returns existing gauge with given tags from vector.
  66. // It will panic if tags keys set is not equal to vector labels.
  67. func (v *GaugeVec) With(tags map[string]string) metrics.Gauge {
  68. return &Gauge{gg: v.vec.With(tags)}
  69. }
  70. // Reset deletes all metrics in this vector.
  71. func (v *GaugeVec) Reset() {
  72. v.vec.Reset()
  73. }
  74. // IntGaugeVec wraps prometheus.GaugeVec
  75. // and implements metrics.IntGaugeVec interface.
  76. type IntGaugeVec struct {
  77. vec *prometheus.GaugeVec
  78. }
  79. // IntGaugeVec creates a new gauges vector with given metric name and
  80. // partitioned by the given label names.
  81. func (r *Registry) IntGaugeVec(name string, labels []string) metrics.IntGaugeVec {
  82. name = r.sanitizeName(name)
  83. vec := prometheus.NewGaugeVec(prometheus.GaugeOpts{
  84. Namespace: r.prefix,
  85. Name: name,
  86. ConstLabels: r.tags,
  87. }, labels)
  88. if err := r.rg.Register(vec); err != nil {
  89. var existErr prometheus.AlreadyRegisteredError
  90. if xerrors.As(err, &existErr) {
  91. return &IntGaugeVec{vec: existErr.ExistingCollector.(*prometheus.GaugeVec)}
  92. }
  93. panic(err)
  94. }
  95. return &IntGaugeVec{vec: vec}
  96. }
  97. // With creates new or returns existing gauge with given tags from vector.
  98. // It will panic if tags keys set is not equal to vector labels.
  99. func (v *IntGaugeVec) With(tags map[string]string) metrics.IntGauge {
  100. return &IntGauge{Gauge{gg: v.vec.With(tags)}}
  101. }
  102. // Reset deletes all metrics in this vector.
  103. func (v *IntGaugeVec) Reset() {
  104. v.vec.Reset()
  105. }
  106. var _ metrics.TimerVec = (*TimerVec)(nil)
  107. // TimerVec wraps prometheus.GaugeVec
  108. // and implements metrics.TimerVec interface.
  109. type TimerVec struct {
  110. vec *prometheus.GaugeVec
  111. }
  112. // TimerVec creates a new timers vector with given metric name and
  113. // partitioned by the given label names.
  114. func (r *Registry) TimerVec(name string, labels []string) metrics.TimerVec {
  115. name = r.sanitizeName(name)
  116. vec := prometheus.NewGaugeVec(prometheus.GaugeOpts{
  117. Namespace: r.prefix,
  118. Name: name,
  119. ConstLabels: r.tags,
  120. }, labels)
  121. if err := r.rg.Register(vec); err != nil {
  122. var existErr prometheus.AlreadyRegisteredError
  123. if xerrors.As(err, &existErr) {
  124. return &TimerVec{vec: existErr.ExistingCollector.(*prometheus.GaugeVec)}
  125. }
  126. panic(err)
  127. }
  128. return &TimerVec{vec: vec}
  129. }
  130. // With creates new or returns existing timer with given tags from vector.
  131. // It will panic if tags keys set is not equal to vector labels.
  132. func (v *TimerVec) With(tags map[string]string) metrics.Timer {
  133. return &Timer{gg: v.vec.With(tags)}
  134. }
  135. // Reset deletes all metrics in this vector.
  136. func (v *TimerVec) Reset() {
  137. v.vec.Reset()
  138. }
  139. var _ metrics.HistogramVec = (*HistogramVec)(nil)
  140. // HistogramVec wraps prometheus.HistogramVec
  141. // and implements metrics.HistogramVec interface.
  142. type HistogramVec struct {
  143. vec *prometheus.HistogramVec
  144. }
  145. // HistogramVec creates a new histograms vector with given metric name and buckets and
  146. // partitioned by the given label names.
  147. func (r *Registry) HistogramVec(name string, buckets metrics.Buckets, labels []string) metrics.HistogramVec {
  148. name = r.sanitizeName(name)
  149. vec := prometheus.NewHistogramVec(prometheus.HistogramOpts{
  150. Namespace: r.prefix,
  151. Name: name,
  152. ConstLabels: r.tags,
  153. Buckets: metricsutil.BucketsBounds(buckets),
  154. }, labels)
  155. if err := r.rg.Register(vec); err != nil {
  156. var existErr prometheus.AlreadyRegisteredError
  157. if xerrors.As(err, &existErr) {
  158. return &HistogramVec{vec: existErr.ExistingCollector.(*prometheus.HistogramVec)}
  159. }
  160. panic(err)
  161. }
  162. return &HistogramVec{vec: vec}
  163. }
  164. // With creates new or returns existing histogram with given tags from vector.
  165. // It will panic if tags keys set is not equal to vector labels.
  166. func (v *HistogramVec) With(tags map[string]string) metrics.Histogram {
  167. return &Histogram{hm: v.vec.With(tags)}
  168. }
  169. // Reset deletes all metrics in this vector.
  170. func (v *HistogramVec) Reset() {
  171. v.vec.Reset()
  172. }
  173. var _ metrics.TimerVec = (*DurationHistogramVec)(nil)
  174. // DurationHistogramVec wraps prometheus.HistogramVec
  175. // and implements metrics.TimerVec interface.
  176. type DurationHistogramVec struct {
  177. vec *prometheus.HistogramVec
  178. }
  179. // DurationHistogramVec creates a new duration histograms vector with given metric name and buckets and
  180. // partitioned by the given label names.
  181. func (r *Registry) DurationHistogramVec(name string, buckets metrics.DurationBuckets, labels []string) metrics.TimerVec {
  182. name = r.sanitizeName(name)
  183. vec := prometheus.NewHistogramVec(prometheus.HistogramOpts{
  184. Namespace: r.prefix,
  185. Name: name,
  186. ConstLabels: r.tags,
  187. Buckets: metricsutil.DurationBucketsBounds(buckets),
  188. }, labels)
  189. if err := r.rg.Register(vec); err != nil {
  190. var existErr prometheus.AlreadyRegisteredError
  191. if xerrors.As(err, &existErr) {
  192. return &DurationHistogramVec{vec: existErr.ExistingCollector.(*prometheus.HistogramVec)}
  193. }
  194. panic(err)
  195. }
  196. return &DurationHistogramVec{vec: vec}
  197. }
  198. // With creates new or returns existing duration histogram with given tags from vector.
  199. // It will panic if tags keys set is not equal to vector labels.
  200. func (v *DurationHistogramVec) With(tags map[string]string) metrics.Timer {
  201. return &Histogram{hm: v.vec.With(tags)}
  202. }
  203. // Reset deletes all metrics in this vector.
  204. func (v *DurationHistogramVec) Reset() {
  205. v.vec.Reset()
  206. }