summary.go 1.2 KB

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