Search code examples
gomicroservicesprometheusexporter

Multiple Endpoints for Prometheus in Go


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)

  • How do I expose this last Gauge on the different endpoint without firing up another server (different port)?
  • Do I have to create my own Collector (I have no custom metrics, so no, right?)?

Solution

  • 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{}))
    }