From 6056615b26b67cdcef113c8fa84b8e1ab44c84b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9ssica=20Lins?= Date: Fri, 21 Oct 2022 16:47:21 +0200 Subject: [PATCH] Update random example to use custom registry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jéssica Lins --- examples/random/main.go | 76 ++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 31 deletions(-) diff --git a/examples/random/main.go b/examples/random/main.go index 1321423..cedfe3e 100644 --- a/examples/random/main.go +++ b/examples/random/main.go @@ -30,6 +30,39 @@ import ( "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() { var ( addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.") @@ -41,34 +74,13 @@ func main() { flag.Parse() - var ( - // Create a summary to track fictional interservice 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), - }) - ) + // Create a non-global registry. + reg := prometheus.NewRegistry() - // Register the summary and the histogram with Prometheus's default registry. - prometheus.MustRegister(rpcDurations) - prometheus.MustRegister(rpcDurationsHistogram) + // Create new metrics and register them using the custom registry. + m := NewMetrics(reg, *normMean, *normDomain) // Add Go module build info. - prometheus.MustRegister(collectors.NewBuildInfoCollector()) + reg.MustRegister(collectors.NewBuildInfoCollector()) start := time.Now() @@ -80,7 +92,7 @@ func main() { go func() { for { v := rand.Float64() * *uniformDomain - rpcDurations.WithLabelValues("uniform").Observe(v) + m.rpcDurations.WithLabelValues("uniform").Observe(v) time.Sleep(time.Duration(100*oscillationFactor()) * time.Millisecond) } }() @@ -88,14 +100,14 @@ func main() { go func() { for { v := (rand.NormFloat64() * *normDomain) + *normMean - rpcDurations.WithLabelValues("normal").Observe(v) + m.rpcDurations.WithLabelValues("normal").Observe(v) // Demonstrate exemplar support with a dummy ID. This // would be something like a trace ID in a real // application. Note the necessary type assertion. We // already know that rpcDurationsHistogram implements // the ExemplarObserver interface and thus don't need to // 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))}, ) time.Sleep(time.Duration(75*oscillationFactor()) * time.Millisecond) @@ -105,17 +117,19 @@ func main() { go func() { for { v := rand.ExpFloat64() / 1e6 - rpcDurations.WithLabelValues("exponential").Observe(v) + m.rpcDurations.WithLabelValues("exponential").Observe(v) time.Sleep(time.Duration(50*oscillationFactor()) * time.Millisecond) } }() // Expose the registered metrics via HTTP. http.Handle("/metrics", promhttp.HandlerFor( - prometheus.DefaultGatherer, + reg, promhttp.HandlerOpts{ // Opt into OpenMetrics to support exemplars. EnableOpenMetrics: true, + // Pass custom registry + Registry: reg, }, )) log.Fatal(http.ListenAndServe(*addr, nil))