// +build !noprometheus package instrument import ( log "github.com/cihub/seelog" "net/http" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) const ( promAddr = ":9123" ) type promInst struct { visits *prometheus.CounterVec reqDur *prometheus.HistogramVec search *prometheus.CounterVec searchDur *prometheus.GaugeVec } func Init() Instrument { go promHandle() visits := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "trantor_visits_total", Help: "Number of visits.", }, []string{"section"}, ) reqDur := prometheus.NewHistogramVec( prometheus.HistogramOpts{ Name: "trantor_request_duration_seconds", Help: "Duration of the request in seconds.", }, []string{"section"}, ) search := prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "trantor_search_total", Help: "Number of searches.", }, []string{"search"}, ) searchDur := prometheus.NewGaugeVec( prometheus.GaugeOpts{ Name: "trantor_search_duration_seconds", Help: "Duration of the search in seconds.", }, []string{"search"}, ) prometheus.MustRegister(visits) prometheus.MustRegister(reqDur) prometheus.MustRegister(search) prometheus.MustRegister(searchDur) return &promInst{ visits: visits, reqDur: reqDur, search: search, searchDur: searchDur, } } func promHandle() { server := http.Server{ Addr: promAddr, Handler: promhttp.Handler(), } log.Error(server.ListenAndServe()) } func (in promInst) Request(req RequestData) { in.visits.WithLabelValues(req.Section).Inc() in.reqDur.WithLabelValues(req.Section).Observe(req.Duration.Seconds()) in.search.WithLabelValues(req.Search).Inc() in.searchDur.WithLabelValues(req.Search).Set(req.Duration.Seconds()) }