Created
December 24, 2020 07:18
-
-
Save fl64/a86b3d375deb947fa11099dd374660da to your computer and use it in GitHub Desktop.
golang prometheus exporter example
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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