From 9b5c5b8a47043de1112749de1bb50bda925010d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9ssica=20Lins?= Date: Fri, 21 Oct 2022 15:47:51 +0200 Subject: [PATCH 1/4] Update basic 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 --- prometheus/doc.go | 56 ++++++++++++++++++++++++++++------------------- 1 file changed, 34 insertions(+), 22 deletions(-) diff --git a/prometheus/doc.go b/prometheus/doc.go index 9845012..8b20c3b 100644 --- a/prometheus/doc.go +++ b/prometheus/doc.go @@ -35,39 +35,51 @@ // "github.com/prometheus/client_golang/prometheus/promhttp" // ) // -// var ( -// cpuTemp = prometheus.NewGauge(prometheus.GaugeOpts{ -// Name: "cpu_temperature_celsius", -// Help: "Current temperature of the CPU.", -// }) -// hdFailures = prometheus.NewCounterVec( -// prometheus.CounterOpts{ -// Name: "hd_errors_total", -// Help: "Number of hard-disk errors.", -// }, -// []string{"device"}, -// ) -// ) +// type metrics struct { +// cpuTemp prometheus.Gauge +// hdFailures *prometheus.CounterVec +// } // -// func init() { -// // Metrics have to be registered to be exposed: -// prometheus.MustRegister(cpuTemp) -// prometheus.MustRegister(hdFailures) +// func NewMetrics(reg prometheus.Registerer) *metrics { +// m := &metrics{ +// cpuTemp: prometheus.NewGauge(prometheus.GaugeOpts{ +// Name: "cpu_temperature_celsius", +// Help: "Current temperature of the CPU.", +// }), +// hdFailures: prometheus.NewCounterVec( +// prometheus.CounterOpts{ +// Name: "hd_errors_total", +// Help: "Number of hard-disk errors.", +// }, +// []string{"device"}, +// ), +// } +// reg.MustRegister(m.cpuTemp) +// reg.MustRegister(m.hdFailures) +// return m // } // // func main() { -// cpuTemp.Set(65.3) -// hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() +// // Create a non-global registry. +// reg := prometheus.NewRegistry() // -// // The Handler function provides a default handler to expose metrics -// // via an HTTP server. "/metrics" is the usual endpoint for that. -// http.Handle("/metrics", promhttp.Handler()) +// // Create new metrics and register them using the custom registry. +// m := NewMetrics(reg) +// // Set values for the new created metrics. +// m.cpuTemp.Set(65.3) +// m.hdFailures.With(prometheus.Labels{"device":"/dev/sda"}).Inc() +// +// // Expose metrics and custom registry via an HTTP server +// // using the HandleFor function. "/metrics" is the usual endpoint for that. +// http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{Registry: reg})) // log.Fatal(http.ListenAndServe(":8080", nil)) // } // // // This is a complete program that exports two metrics, a Gauge and a Counter, // the latter with a label attached to turn it into a (one-dimensional) vector. +// It register the metrics using a custom registry and exposes them via an HTTP server +// on the /metrics endpoint. // // Metrics // From 0b7f4888b0e336ae1d2dbfc1b499888d764a3124 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9ssica=20Lins?= Date: Fri, 21 Oct 2022 16:21:19 +0200 Subject: [PATCH 2/4] Update simple 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/simple/main.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/examples/simple/main.go b/examples/simple/main.go index 1fc2324..e2c0310 100644 --- a/examples/simple/main.go +++ b/examples/simple/main.go @@ -18,7 +18,8 @@ import ( "flag" "log" "net/http" - + + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) @@ -26,6 +27,11 @@ var addr = flag.String("listen-address", ":8080", "The address to listen on for func main() { flag.Parse() - http.Handle("/metrics", promhttp.Handler()) + + // Create non-global registry. + reg := prometheus.NewRegistry() + + // Expose /metrics HTTP endpoint using the created custom registry. + http.Handle("/metrics", promhttp.HandlerFor(reg, promhttp.HandlerOpts{Registry: reg})) log.Fatal(http.ListenAndServe(*addr, nil)) } 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 3/4] 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)) From a340ca4ba611ac0f8c2dd88a6ecfeb55ee0ac269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9ssica=20Lins?= Date: Fri, 21 Oct 2022 17:23:15 +0200 Subject: [PATCH 4/4] Run make format MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jéssica Lins --- examples/simple/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/simple/main.go b/examples/simple/main.go index e2c0310..1d82e74 100644 --- a/examples/simple/main.go +++ b/examples/simple/main.go @@ -18,7 +18,7 @@ import ( "flag" "log" "net/http" - + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" )