1
0
Fork 0
forked from jriou/coller
coller/src/server/metrics.go
Julien Riou 0ce540e92d
feat: Add metrics
Fixes #7.

Signed-off-by: Julien Riou <julien@riou.xyz>
2025-08-26 09:26:15 +02:00

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