Go中Prometheus的多个端点

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?)?

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