Skip to content

Instantly share code, notes, and snippets.

@udhos
Forked from fl64/main.go
Created January 13, 2024 02:35
Show Gist options
  • Save udhos/222b3e5a8c3c4b58a8ec74d44925e302 to your computer and use it in GitHub Desktop.
Save udhos/222b3e5a8c3c4b58a8ec74d44925e302 to your computer and use it in GitHub Desktop.

Revisions

  1. flsixtyfour created this gist Dec 24, 2020.
    74 changes: 74 additions & 0 deletions main.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,74 @@
    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))
    }