feat: add prometheus summary metrics (#3440)
Co-authored-by: chen quan <chenquan.dev@gmail.com>master
parent
457eb1961b
commit
279123f4a7
@ -0,0 +1,65 @@
|
|||||||
|
package metric
|
||||||
|
|
||||||
|
import (
|
||||||
|
prom "github.com/prometheus/client_golang/prometheus"
|
||||||
|
"github.com/zeromicro/go-zero/core/proc"
|
||||||
|
"github.com/zeromicro/go-zero/core/prometheus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type (
|
||||||
|
// A SummaryVecOpts is a summary vector options
|
||||||
|
SummaryVecOpts struct {
|
||||||
|
VecOpt VectorOpts
|
||||||
|
Objectives map[float64]float64
|
||||||
|
}
|
||||||
|
|
||||||
|
// A SummaryVec interface represents a summary vector.
|
||||||
|
SummaryVec interface {
|
||||||
|
// Observe adds observation v to labels.
|
||||||
|
Observe(v float64, labels ...string)
|
||||||
|
close() bool
|
||||||
|
}
|
||||||
|
|
||||||
|
promSummaryVec struct {
|
||||||
|
summary *prom.SummaryVec
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
// NewSummaryVec return a SummaryVec
|
||||||
|
func NewSummaryVec(cfg *SummaryVecOpts) SummaryVec {
|
||||||
|
if cfg == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
vec := prom.NewSummaryVec(
|
||||||
|
prom.SummaryOpts{
|
||||||
|
Namespace: cfg.VecOpt.Namespace,
|
||||||
|
Subsystem: cfg.VecOpt.Subsystem,
|
||||||
|
Name: cfg.VecOpt.Name,
|
||||||
|
Help: cfg.VecOpt.Help,
|
||||||
|
Objectives: cfg.Objectives,
|
||||||
|
},
|
||||||
|
cfg.VecOpt.Labels,
|
||||||
|
)
|
||||||
|
prom.MustRegister(vec)
|
||||||
|
sv := &promSummaryVec{
|
||||||
|
summary: vec,
|
||||||
|
}
|
||||||
|
proc.AddShutdownListener(func() {
|
||||||
|
sv.close()
|
||||||
|
})
|
||||||
|
|
||||||
|
return sv
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sv *promSummaryVec) Observe(v float64, labels ...string) {
|
||||||
|
if !prometheus.Enabled() {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sv.summary.WithLabelValues(labels...).Observe(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (sv *promSummaryVec) close() bool {
|
||||||
|
return prom.Unregister(sv.summary)
|
||||||
|
}
|
@ -0,0 +1,68 @@
|
|||||||
|
package metric
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/prometheus/testutil"
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/zeromicro/go-zero/core/proc"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestNewSummaryVec(t *testing.T) {
|
||||||
|
summaryVec := NewSummaryVec(&SummaryVecOpts{
|
||||||
|
VecOpt: VectorOpts{
|
||||||
|
Namespace: "http_server",
|
||||||
|
Subsystem: "requests",
|
||||||
|
Name: "duration_quantiles",
|
||||||
|
Help: "rpc client requests duration(ms) φ quantiles ",
|
||||||
|
Labels: []string{"method"},
|
||||||
|
},
|
||||||
|
Objectives: map[float64]float64{
|
||||||
|
0.5: 0.01,
|
||||||
|
0.9: 0.01,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
defer summaryVec.close()
|
||||||
|
summaryVecNil := NewSummaryVec(nil)
|
||||||
|
assert.NotNil(t, summaryVec)
|
||||||
|
assert.Nil(t, summaryVecNil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestSummaryObserve(t *testing.T) {
|
||||||
|
startAgent()
|
||||||
|
summaryVec := NewSummaryVec(&SummaryVecOpts{
|
||||||
|
VecOpt: VectorOpts{
|
||||||
|
Namespace: "http_server",
|
||||||
|
Subsystem: "requests",
|
||||||
|
Name: "duration_quantiles",
|
||||||
|
Help: "rpc client requests duration(ms) φ quantiles ",
|
||||||
|
Labels: []string{"method"},
|
||||||
|
},
|
||||||
|
Objectives: map[float64]float64{
|
||||||
|
0.3: 0.01,
|
||||||
|
0.6: 0.01,
|
||||||
|
1: 0.01,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
defer summaryVec.close()
|
||||||
|
sv := summaryVec.(*promSummaryVec)
|
||||||
|
sv.Observe(100, "GET")
|
||||||
|
sv.Observe(200, "GET")
|
||||||
|
sv.Observe(300, "GET")
|
||||||
|
metadata := `
|
||||||
|
# HELP http_server_requests_duration_quantiles rpc client requests duration(ms) φ quantiles
|
||||||
|
# TYPE http_server_requests_duration_quantiles summary
|
||||||
|
`
|
||||||
|
val := `
|
||||||
|
http_server_requests_duration_quantiles{method="GET",quantile="0.3"} 100
|
||||||
|
http_server_requests_duration_quantiles{method="GET",quantile="0.6"} 200
|
||||||
|
http_server_requests_duration_quantiles{method="GET",quantile="1"} 300
|
||||||
|
http_server_requests_duration_quantiles_sum{method="GET"} 600
|
||||||
|
http_server_requests_duration_quantiles_count{method="GET"} 3
|
||||||
|
`
|
||||||
|
|
||||||
|
err := testutil.CollectAndCompare(sv.summary, strings.NewReader(metadata+val))
|
||||||
|
assert.Nil(t, err)
|
||||||
|
proc.Shutdown()
|
||||||
|
}
|
Loading…
Reference in New Issue