forked from jriou/coller
55 lines
1.2 KiB
Go
55 lines
1.2 KiB
Go
package server
|
|
|
|
import (
|
|
"fmt"
|
|
"log/slog"
|
|
"time"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
)
|
|
|
|
type Metrics struct {
|
|
logger *slog.Logger
|
|
notes prometheus.Gauge
|
|
db *Database
|
|
reg *prometheus.Registry
|
|
interval int
|
|
}
|
|
|
|
func NewMetrics(logger *slog.Logger, reg *prometheus.Registry, config *Config, db *Database) (*Metrics, error) {
|
|
l := logger.With("module", "metrics")
|
|
m := &Metrics{
|
|
logger: l,
|
|
db: db,
|
|
notes: prometheus.NewGauge(prometheus.GaugeOpts{
|
|
Name: config.PrometheusNotesMetric,
|
|
}),
|
|
reg: reg,
|
|
interval: config.ObservationInterval,
|
|
}
|
|
if err := reg.Register(m.notes); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
go m.ObserveThread()
|
|
|
|
return m, nil
|
|
}
|
|
|
|
func (m *Metrics) ObserveThread() {
|
|
m.logger.Debug("starting observations")
|
|
for {
|
|
m.logger.Debug("counting notes")
|
|
var count int64
|
|
m.db.db.Model(&Note{}).Count(&count)
|
|
m.notes.Set(float64(count))
|
|
m.logger.Debug("counted notes", slog.Any("count", count))
|
|
|
|
wording := "second"
|
|
if m.interval > 1 {
|
|
wording += "s"
|
|
}
|
|
m.logger.Debug(fmt.Sprintf("waiting for %d %s before next observation", m.interval, wording))
|
|
time.Sleep(time.Duration(m.interval) * time.Second)
|
|
}
|
|
}
|