package main import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "log" "math/rand" "net/http" "time" ) //Define a struct for you collector that contains pointers //to prometheus descriptors for each metric you wish to expose. //Note you can also include fields of other types if they provide utility //but we just won't be exposing them as metrics. type fooCollector struct { fooMetric *prometheus.Desc barMetric *prometheus.Desc } //You must create a constructor for you collector that //initializes every descriptor and returns a pointer to the collector func newFooCollector() *fooCollector { return &fooCollector{ fooMetric: prometheus.NewDesc("foo_metric", "Shows whether a foo has occurred in our cluster", nil, nil, ), barMetric: prometheus.NewDesc("bar_metric", "Shows whether a bar has occurred in our cluster", nil, nil, ), } } //Each and every collector must implement the Describe function. //It essentially writes all descriptors to the prometheus desc channel. func (collector *fooCollector) Describe(ch chan<- *prometheus.Desc) { //Update this section with the each metric you create for a given collector ch <- collector.fooMetric ch <- collector.barMetric } //Collect implements required collect function for all promehteus collectors func (collector *fooCollector) Collect(ch chan<- prometheus.Metric) { //Implement logic here to determine proper metric value to return to prometheus //for each descriptor or call other functions that do so. var metricValue float64 if 1 == 1 { metricValue += rand.Float64() } //Write latest value for each metric in the prometheus metric channel. //Note that you can pass CounterValue, GaugeValue, or UntypedValue types here. m1 := prometheus.MustNewConstMetric(collector.fooMetric, prometheus.GaugeValue, metricValue) m2 := prometheus.MustNewConstMetric(collector.barMetric, prometheus.GaugeValue, metricValue) m1 = prometheus.NewMetricWithTimestamp(time.Now().Add(-time.Hour), m1) m2 = prometheus.NewMetricWithTimestamp(time.Now(), m2) ch <- m1 ch <- m2 } func main() { foo := newFooCollector() prometheus.MustRegister(foo) http.Handle("/console/metrics", promhttp.Handler()) log.Fatal(http.ListenAndServe(":9101", nil)) }