package main import ( "log" "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" ) var ( prometheusEnabled = false prometheusRequestsTotal prometheus.Counter prometheusErrorsTotal *prometheus.CounterVec prometheusRequestDuration prometheus.Histogram prometheusDownloadDuration prometheus.Histogram prometheusProcessingDuration prometheus.Histogram ) func initPrometheus() { prometheusRequestsTotal = prometheus.NewCounter(prometheus.CounterOpts{ Name: "requests_total", Help: "A counter of the total number of HTTP requests imgproxy processed.", }) prometheusErrorsTotal = prometheus.NewCounterVec(prometheus.CounterOpts{ Name: "errors_total", Help: "A counter of the occured errors separated by type.", }, []string{"type"}) prometheusRequestDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "request_duration_seconds", Help: "A histogram of the response latency.", }) prometheusDownloadDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "download_duration_seconds", Help: "A histogram of the source image downloading latency.", }) prometheusProcessingDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ Name: "processing_duration_seconds", Help: "A histogram of the image processing latency.", }) prometheus.MustRegister( prometheusRequestsTotal, prometheusErrorsTotal, prometheusRequestDuration, prometheusDownloadDuration, prometheusProcessingDuration, ) prometheusEnabled = true s := http.Server{ Addr: conf.PrometheusBind, Handler: promhttp.Handler(), } go func() { log.Printf("Starting Prometheus server at %s\n", s.Addr) if err := s.ListenAndServe(); err != nil && err != http.ErrServerClosed { log.Fatalln(err) } }() } func startPrometheusDuration(m prometheus.Histogram) func() { t := time.Now() return func() { m.Observe(time.Since(t).Seconds()) } } func incrementPrometheusErrorsTotal(t string) { prometheusErrorsTotal.With(prometheus.Labels{"type": t}).Inc() }