summary.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package metric
  2. import (
  3. prom "github.com/prometheus/client_golang/prometheus"
  4. "github.com/zeromicro/go-zero/core/proc"
  5. "github.com/zeromicro/go-zero/core/prometheus"
  6. )
  7. type (
  8. // A SummaryVecOpts is a summary vector options
  9. SummaryVecOpts struct {
  10. VecOpt VectorOpts
  11. Objectives map[float64]float64
  12. }
  13. // A SummaryVec interface represents a summary vector.
  14. SummaryVec interface {
  15. // Observe adds observation v to labels.
  16. Observe(v float64, labels ...string)
  17. close() bool
  18. }
  19. promSummaryVec struct {
  20. summary *prom.SummaryVec
  21. }
  22. )
  23. // NewSummaryVec return a SummaryVec
  24. func NewSummaryVec(cfg *SummaryVecOpts) SummaryVec {
  25. if cfg == nil {
  26. return nil
  27. }
  28. vec := prom.NewSummaryVec(
  29. prom.SummaryOpts{
  30. Namespace: cfg.VecOpt.Namespace,
  31. Subsystem: cfg.VecOpt.Subsystem,
  32. Name: cfg.VecOpt.Name,
  33. Help: cfg.VecOpt.Help,
  34. Objectives: cfg.Objectives,
  35. },
  36. cfg.VecOpt.Labels,
  37. )
  38. prom.MustRegister(vec)
  39. sv := &promSummaryVec{
  40. summary: vec,
  41. }
  42. proc.AddShutdownListener(func() {
  43. sv.close()
  44. })
  45. return sv
  46. }
  47. func (sv *promSummaryVec) Observe(v float64, labels ...string) {
  48. if !prometheus.Enabled() {
  49. return
  50. }
  51. sv.summary.WithLabelValues(labels...).Observe(v)
  52. }
  53. func (sv *promSummaryVec) close() bool {
  54. return prom.Unregister(sv.summary)
  55. }