Hermes/src/integrations/prometheus.go

80 lines
1.8 KiB
Go

package integrations
import (
"net/http"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/collectors"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
type Prometheus struct {
reg *prometheus.Registry
rpsGauge prometheus.Gauge
avgReqTimeHist prometheus.Histogram
panicsHist prometheus.Histogram
}
func NewPrometheus() *Prometheus {
reg := prometheus.NewRegistry()
// Add go runtime metrics and process collectors.
reg.MustRegister(
collectors.NewGoCollector(),
collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}),
)
// errorsCounter := prometheus.NewCounter(
// prometheus.CounterOpts{
// Name: "backend_errors_count",
// Help: "Summary errors count",
// },
// )
rpsGauge := prometheus.NewGauge(
prometheus.GaugeOpts{
Name: "backend_requests_per_second",
Help: "Requests per second metric",
},
)
avgReqTimeHist := prometheus.NewHistogram(
prometheus.HistogramOpts{
Name: "backend_requests_average_time",
Help: "Average time of requests",
},
)
panicsHist := prometheus.NewHistogram(
prometheus.HistogramOpts{
Name: "backend_panics",
Help: "Panics histogram metric",
},
)
reg.MustRegister(rpsGauge, avgReqTimeHist, panicsHist)
return &Prometheus{
panicsHist: panicsHist,
avgReqTimeHist: avgReqTimeHist,
rpsGauge: rpsGauge,
reg: reg,
}
}
func (p *Prometheus) GetRequestHandler() http.Handler {
return promhttp.HandlerFor(p.reg, promhttp.HandlerOpts{Registry: p.reg})
}
func (p *Prometheus) RequestInc() {
p.rpsGauge.Inc()
}
func (p *Prometheus) RequestDec() {
p.rpsGauge.Dec()
}
func (p *Prometheus) AddRequestTime(reqTime float64) {
p.avgReqTimeHist.Observe(reqTime)
}
func (p *Prometheus) AddPanic() {
p.panicsHist.Observe(1)
}