Update random example to use custom registry
Signed-off-by: Jéssica Lins <jessicaalins@gmail.com>
This commit is contained in:
parent
0b7f4888b0
commit
6056615b26
|
@ -30,6 +30,39 @@ import (
|
||||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type metrics struct {
|
||||||
|
rpcDurations *prometheus.SummaryVec
|
||||||
|
rpcDurationsHistogram prometheus.Histogram
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewMetrics(reg prometheus.Registerer, normMean, normDomain float64) *metrics {
|
||||||
|
m := &metrics{
|
||||||
|
// Create a summary to track fictional inter service RPC latencies for three
|
||||||
|
// distinct services with different latency distributions. These services are
|
||||||
|
// differentiated via a "service" label.
|
||||||
|
rpcDurations: prometheus.NewSummaryVec(
|
||||||
|
prometheus.SummaryOpts{
|
||||||
|
Name: "rpc_durations_seconds",
|
||||||
|
Help: "RPC latency distributions.",
|
||||||
|
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
|
||||||
|
},
|
||||||
|
[]string{"service"},
|
||||||
|
),
|
||||||
|
// The same as above, but now as a histogram, and only for the normal
|
||||||
|
// distribution. The buckets are targeted to the parameters of the
|
||||||
|
// normal distribution, with 20 buckets centered on the mean, each
|
||||||
|
// half-sigma wide.
|
||||||
|
rpcDurationsHistogram: prometheus.NewHistogram(prometheus.HistogramOpts{
|
||||||
|
Name: "rpc_durations_histogram_seconds",
|
||||||
|
Help: "RPC latency distributions.",
|
||||||
|
Buckets: prometheus.LinearBuckets(normMean-5*normDomain, .5*normDomain, 20),
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
reg.MustRegister(m.rpcDurations)
|
||||||
|
reg.MustRegister(m.rpcDurationsHistogram)
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var (
|
var (
|
||||||
addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.")
|
addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.")
|
||||||
|
@ -41,34 +74,13 @@ func main() {
|
||||||
|
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
var (
|
// Create a non-global registry.
|
||||||
// Create a summary to track fictional interservice RPC latencies for three
|
reg := prometheus.NewRegistry()
|
||||||
// distinct services with different latency distributions. These services are
|
|
||||||
// differentiated via a "service" label.
|
|
||||||
rpcDurations = prometheus.NewSummaryVec(
|
|
||||||
prometheus.SummaryOpts{
|
|
||||||
Name: "rpc_durations_seconds",
|
|
||||||
Help: "RPC latency distributions.",
|
|
||||||
Objectives: map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001},
|
|
||||||
},
|
|
||||||
[]string{"service"},
|
|
||||||
)
|
|
||||||
// The same as above, but now as a histogram, and only for the normal
|
|
||||||
// distribution. The buckets are targeted to the parameters of the
|
|
||||||
// normal distribution, with 20 buckets centered on the mean, each
|
|
||||||
// half-sigma wide.
|
|
||||||
rpcDurationsHistogram = prometheus.NewHistogram(prometheus.HistogramOpts{
|
|
||||||
Name: "rpc_durations_histogram_seconds",
|
|
||||||
Help: "RPC latency distributions.",
|
|
||||||
Buckets: prometheus.LinearBuckets(*normMean-5**normDomain, .5**normDomain, 20),
|
|
||||||
})
|
|
||||||
)
|
|
||||||
|
|
||||||
// Register the summary and the histogram with Prometheus's default registry.
|
// Create new metrics and register them using the custom registry.
|
||||||
prometheus.MustRegister(rpcDurations)
|
m := NewMetrics(reg, *normMean, *normDomain)
|
||||||
prometheus.MustRegister(rpcDurationsHistogram)
|
|
||||||
// Add Go module build info.
|
// Add Go module build info.
|
||||||
prometheus.MustRegister(collectors.NewBuildInfoCollector())
|
reg.MustRegister(collectors.NewBuildInfoCollector())
|
||||||
|
|
||||||
start := time.Now()
|
start := time.Now()
|
||||||
|
|
||||||
|
@ -80,7 +92,7 @@ func main() {
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
v := rand.Float64() * *uniformDomain
|
v := rand.Float64() * *uniformDomain
|
||||||
rpcDurations.WithLabelValues("uniform").Observe(v)
|
m.rpcDurations.WithLabelValues("uniform").Observe(v)
|
||||||
time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond)
|
time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
@ -88,14 +100,14 @@ func main() {
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
v := (rand.NormFloat64() * *normDomain) + *normMean
|
v := (rand.NormFloat64() * *normDomain) + *normMean
|
||||||
rpcDurations.WithLabelValues("normal").Observe(v)
|
m.rpcDurations.WithLabelValues("normal").Observe(v)
|
||||||
// Demonstrate exemplar support with a dummy ID. This
|
// Demonstrate exemplar support with a dummy ID. This
|
||||||
// would be something like a trace ID in a real
|
// would be something like a trace ID in a real
|
||||||
// application. Note the necessary type assertion. We
|
// application. Note the necessary type assertion. We
|
||||||
// already know that rpcDurationsHistogram implements
|
// already know that rpcDurationsHistogram implements
|
||||||
// the ExemplarObserver interface and thus don't need to
|
// the ExemplarObserver interface and thus don't need to
|
||||||
// check the outcome of the type assertion.
|
// check the outcome of the type assertion.
|
||||||
rpcDurationsHistogram.(prometheus.ExemplarObserver).ObserveWithExemplar(
|
m.rpcDurationsHistogram.(prometheus.ExemplarObserver).ObserveWithExemplar(
|
||||||
v, prometheus.Labels{"dummyID": fmt.Sprint(rand.Intn(100000))},
|
v, prometheus.Labels{"dummyID": fmt.Sprint(rand.Intn(100000))},
|
||||||
)
|
)
|
||||||
time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond)
|
time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond)
|
||||||
|
@ -105,17 +117,19 @@ func main() {
|
||||||
go func() {
|
go func() {
|
||||||
for {
|
for {
|
||||||
v := rand.ExpFloat64() / 1e6
|
v := rand.ExpFloat64() / 1e6
|
||||||
rpcDurations.WithLabelValues("exponential").Observe(v)
|
m.rpcDurations.WithLabelValues("exponential").Observe(v)
|
||||||
time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond)
|
time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// Expose the registered metrics via HTTP.
|
// Expose the registered metrics via HTTP.
|
||||||
http.Handle("/metrics", promhttp.HandlerFor(
|
http.Handle("/metrics", promhttp.HandlerFor(
|
||||||
prometheus.DefaultGatherer,
|
reg,
|
||||||
promhttp.HandlerOpts{
|
promhttp.HandlerOpts{
|
||||||
// Opt into OpenMetrics to support exemplars.
|
// Opt into OpenMetrics to support exemplars.
|
||||||
EnableOpenMetrics: true,
|
EnableOpenMetrics: true,
|
||||||
|
// Pass custom registry
|
||||||
|
Registry: reg,
|
||||||
},
|
},
|
||||||
))
|
))
|
||||||
log.Fatal(http.ListenAndServe(*addr, nil))
|
log.Fatal(http.ListenAndServe(*addr, nil))
|
||||||
|
|
Loading…
Reference in New Issue