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) } }