Files
go-sdk/metriccollector/metriccollector.go
2026-01-06 15:09:21 +01:00

92 lines
1.7 KiB
Go

package metriccollector
import (
"log/slog"
"time"
"git.fancyinnovations.com/fancyanalytics/go-sdk/client"
"github.com/OliverSchlueter/goutils/sloki"
)
type Service struct {
c *client.Client
interval time.Duration
providers []MetricProvider
schedulerStarted bool
abortScheduler chan struct{}
}
type Configuration struct {
Client *client.Client
Interval time.Duration
Providers []MetricProvider
}
func NewService(cfg *Configuration) *Service {
if cfg.Interval <= 0 {
cfg.Interval = 60
}
if cfg.Providers == nil {
cfg.Providers = []MetricProvider{}
}
return &Service{
c: cfg.Client,
interval: cfg.Interval,
providers: cfg.Providers,
schedulerStarted: false,
abortScheduler: make(chan struct{}),
}
}
func (s *Service) AddProvider(provider MetricProvider) {
s.providers = append(s.providers, provider)
}
func (s *Service) Send() error {
var records []client.RecordData
for _, provider := range s.providers {
providerRecords, err := provider()
if err != nil {
continue
}
records = append(records, providerRecords...)
}
if err := s.c.SendRecord(records); err != nil {
return err
}
return nil
}
func (s *Service) StartScheduler() {
if s.schedulerStarted {
return
}
s.schedulerStarted = true
go func() {
ticker := time.NewTicker(s.interval)
defer ticker.Stop()
for {
select {
case <-ticker.C:
if err := s.Send(); err != nil {
slog.Warn("failed to send metrics", sloki.WrapError(err))
}
case <-s.abortScheduler:
return
}
}
}()
}
func (s *Service) StopScheduler() {
s.abortScheduler <- struct{}{}
s.schedulerStarted = false
}