hashicorp / go-metrics

A Golang library for exporting performance and runtime metrics to external metrics systems (i.e. statsite, statsd)
MIT License
1.45k stars 177 forks source link

Prometheus usage instructions #35

Open maticmeznar opened 8 years ago

maticmeznar commented 8 years ago

How can go-metrics be used with Prometheus? The farthest I came is:

package main

import (
    "net/http"
    "time"

    "github.com/armon/go-metrics"
    "github.com/armon/go-metrics/prometheus"
)

func main() {
    sink, _ := prometheus.NewPrometheusSink()
    m, err := metrics.NewGlobal(metrics.DefaultConfig("goTest"), sink)
    if err != nil {
        panic(err)
    }

    go func() {
        for {
            m.IncrCounter([]string{"requestCounter"}, 1)
            time.Sleep(time.Second)
        }
    }()

    select {}
}

Some parts are missing like setting up an HTTP handler, HTTP server, etc ... And I don't know how to enable Prometheus server to scrape this. I've looked at the source code and I have a feeling that something is missing.

brianhama commented 7 years ago

Did you ever figure this out?

maticmeznar commented 7 years ago

@brianhama Yes, I think go-metrics uses DefaultServeMux by default, while I was using github.com/julienschmidt/httprouter.

When I used it like this it worked, although on a dedicated port:

    // Prepare metrics
    sink, _ := prometheus.NewPrometheusSink()
    m, err := metrics.NewGlobal(metrics.DefaultConfig("apiserver"), sink)
    m.EnableHostname = false
    if err != nil {
        logger.Fatal("Unable to create metrics",
            zap.Error(err),
        )
    }

    mux := http.NewServeMux()
    mux.Handle("/metrics", prom.Handler())
    metricsServer := &http.Server{
        Addr:    ":" + strconv.Itoa(*cfgHTTPMetricsPort),
        Handler: mux,
    }

    go func() {
        if err := metricsServer.ListenAndServe(); err != nil {
            logger.Fatal("Unable to start metrics HTTP server", zap.Error(err))
        }
    }()