I'm currently working on a program written in Go (golang)
that is monitored by Prometheus.
Now the program should serve two endpoints /metrics
and /service
.
When scraped by Prometheus on /metrics
, it should expose it's own metrics (e.g. requests made, request latency, ...) and when scraped on /service
, it should query an API, get metrics from there and expose them to Prometheus.
For the first part I create e.g. a Counter via
requestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "SERVICE",
Subsystem: "service_metrics",
Name: "request_count",
Help: "Number of requests received.",
}, fieldKeys)
and serve the stuff via:
http.Handle("/metrics", promhttp.Handler())
http.ListenAndServe(":8090", nil)
for the /service
part, I query the API, extract a value and update a different Gauge via Gauge.Set(value)
You can use prometheus.NewRegistry
to create a custom collector, and expose it to some endpoint you want by using promhttp.HandlerFor
.
var (
// custom collector
reg = prometheus.NewRegistry()
// some metrics
myGauge = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Name: "gauge_name",
Help: "guage_help",
},
[]string{"l"},
)
)
func init() {
// register metrics to my collector
reg.MustRegister(myGauge)
}
func main() {
// instrument
myGauge.WithLabelValues("l").Set(123)
// expose endpoint
http.Handle("/service", promhttp.HandlerFor(reg, promhttp.HandlerOpts{}))
}