forked from jriou/coller
feat: Add metrics
Fixes #7. Signed-off-by: Julien Riou <julien@riou.xyz>
This commit is contained in:
parent
e486d3df98
commit
0ce540e92d
7 changed files with 141 additions and 18 deletions
55
src/server/metrics.go
Normal file
55
src/server/metrics.go
Normal file
|
@ -0,0 +1,55 @@
|
|||
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)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue