简体   繁体   中英

How do I add histogram to prometheus exporter in golang?

Here is the example of my code.Now I want add histogram in my code.
but I can't find a way to add histogram like this.

Is anybody could help me?
I am able to write histogram sample but I can't add it in my below code

package main
import (
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
    "github.com/prometheus/common/log"
    "net/http"
)

type fooCollector struct {
    fooMetric *prometheus.Desc
}

func newFooCollector(label1 string) *fooCollector {
    return &fooCollector{
        fooMetric: prometheus.NewDesc("fff_metric",
            "Shows whether a foo has occurred in our cluster",
            nil, prometheus.Labels{"env":label1},
        ),
        
    }
}

func (collector *fooCollector) Describe(ch chan<- *prometheus.Desc) {

    //Update this section with the each metric you create for a given collector
    ch <- collector.fooMetric
}

func (collector *fooCollector) Collect(ch chan<- prometheus.Metric) {

    ch <- prometheus.MustNewConstMetric(collector.fooMetric, prometheus.GaugeValue, 111111)

}
func main() {
    prometheus.MustRegister(newFooCollector("dev"))
    http.Handle("/metrics", promhttp.Handler())
    http.ListenAndServe(":80", nil)
}

finally I learned how histogram works.here is my code

package main

import (
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
    "net/http"
)

type fooCollector struct {
    fooMetric *prometheus.Desc
}
//First,we define the variable of histogram
var (
    hbrms_histovec = prometheus.NewHistogramVec(
        prometheus.HistogramOpts{
            Name:        "hbrms_histogram",
            Help:        "hbrms_histogram",
            ConstLabels: prometheus.Labels{"constname": "constvalue"},
            Buckets: prometheus.ExponentialBuckets(50, 1.3, 15),//50*1.3,15times
        },
        []string{"env"},
    )

)

func newFooCollector() *fooCollector {
    return &fooCollector{
        fooMetric: prometheus.NewDesc("fff_metric",
            "Shows whether a foo has occurred in our cluster",
            nil, nil,
        ),
    }
}

func (collector *fooCollector) Describe(ch chan<- *prometheus.Desc) {
    ch <- collector.fooMetric
}

func (collector *fooCollector) Collect(ch chan<- prometheus.Metric) {
    ch <- prometheus.MustNewConstMetric(collector.fooMetric, prometheus.CounterValue, float64(1))
    // 2nd,we set metrics in this way instead of write to channel,we just find a way of calling the code below when we visit the url.
    hbrms_histovec.WithLabelValues("val1").Observe(float64(10))
}

func main() {
    reg := prometheus.NewPedanticRegistry()
    reg.MustRegister(newFooCollector())
    // finally,we register the metrics "hbrms_histovec" in this way
    reg.MustRegister(hbrms_histovec)
    gatherers := prometheus.Gatherers{reg}

    h := promhttp.HandlerFor(gatherers,
        promhttp.HandlerOpts{
            ErrorHandling: promhttp.ContinueOnError,
        })

    http.HandleFunc("/metrics", func(w http.ResponseWriter, r *http.Request) {
        h.ServeHTTP(w, r)
    })
    http.ListenAndServe(":80", nil)
}

You can just simply call.Collect(ch) method for each metric(thats both includes description and values). Also you don't need to extend default prometheus route handler - just be careful you don't have collision with default metric names

package main

import (
    "github.com/prometheus/client_golang/prometheus"
    "github.com/prometheus/client_golang/prometheus/promhttp"
    "net/http"
)

type fooCollector struct {
    fooMetric      *prometheus.GaugeVec
    hmdrsHistogram *prometheus.HistogramVec
}

func newFooCollector() *fooCollector {
    return &fooCollector{
        fooMetric: prometheus.NewGaugeVec(prometheus.GaugeOpts{
            Name: "fff_metric",
            Help: "Shows whether a foo has occurred in our cluster",
        }, []string{"country"}),
        hmdrsHistogram: prometheus.NewHistogramVec(
            prometheus.HistogramOpts{
                Name:        "hbrms_histogram",
                Help:        "hbrms_histogram",
                ConstLabels: prometheus.Labels{"constname": "constvalue"},
                Buckets:     prometheus.ExponentialBuckets(50, 1.3, 15), //50*1.3,15times
            },
            []string{"env"},
        ),
    }
}

func (collector *fooCollector) Describe(ch chan<- *prometheus.Desc) {
    // don't need to manually call .Describe() here,
    // because description was defined with prometheus.MustRegister method

    //collector.fooMetric.Describe(ch)
    //collector.hmdrsHistogram.Describe(ch)
}

func (collector *fooCollector) Collect(ch chan<- prometheus.Metric) {
    v := 14 // get value from DB/External service/etc

    collector.fooMetric.WithLabelValues("qwe").Set(float64(v))

    collector.fooMetric.WithLabelValues("qwe").Set(v)
    collector.fooMetric.Collect(ch)

    collector.hmdrsHistogram.WithLabelValues("val1").Observe(float64(10))
    collector.hmdrsHistogram.Collect(ch)
}

func RegisterFooCollector() {
    fc := newFooCollector()
    prometheus.MustRegister(fc)
}

func main() {
    RegisterFooCollector()

    // also includes default metrics
    http.Handle("/metrics", promhttp.Handler())
    
    err := http.ListenAndServe(":80", nil)

    if err != nil {
        return
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM