Skip to content

Instantly share code, notes, and snippets.

@fl64
Created December 24, 2020 07:18
Show Gist options
  • Save fl64/a86b3d375deb947fa11099dd374660da to your computer and use it in GitHub Desktop.
Save fl64/a86b3d375deb947fa11099dd374660da to your computer and use it in GitHub Desktop.
golang prometheus exporter example
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))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment