// +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
}
func Init() Instrument {
go promHandle()
visits := prometheus.NewCounterVec(
prometheus.CounterOpts{
Name: "trantor_visits_total",
Help: "Number of visits.",
},
[]string{"section", "id", "search", "fmt"},
reqDur := prometheus.NewHistogramVec(
prometheus.HistogramOpts{
Name: "trantor_request_duration_seconds",
Help: "Duration of the request in seconds.",
[]string{"section"},
prometheus.MustRegister(visits)
prometheus.MustRegister(reqDur)
return &promInst{
visits: visits,
reqDur: reqDur,
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, req.ID, req.Search, req.Fmt).Inc()
in.reqDur.WithLabelValues(req.Section).Observe(req.Duration.Seconds())