mirror of
https://github.com/Chipazawra/v8-1c-cluster-pde.git
synced 2025-03-19 21:07:45 +02:00
83 lines
1.5 KiB
Go
83 lines
1.5 KiB
Go
package pusher
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"github.com/prometheus/client_golang/prometheus/push"
|
|
)
|
|
|
|
var (
|
|
defaultIntervalMillis int = 500
|
|
defaultJobname string = "v8-1C-cluster-pde"
|
|
)
|
|
|
|
type Pusher struct {
|
|
intervalMillis int
|
|
collector prometheus.Collector
|
|
url string
|
|
jobName string
|
|
pusher *push.Pusher
|
|
}
|
|
|
|
type PusherOption func(*Pusher)
|
|
|
|
func WithInterval(millis int) PusherOption {
|
|
return func(p *Pusher) {
|
|
p.intervalMillis = millis
|
|
}
|
|
}
|
|
|
|
func WithJobName(Name string) PusherOption {
|
|
return func(p *Pusher) {
|
|
p.jobName = Name
|
|
}
|
|
}
|
|
|
|
func New(collector prometheus.Collector, url string, opts ...PusherOption) *Pusher {
|
|
|
|
p := &Pusher{
|
|
collector: collector,
|
|
intervalMillis: defaultIntervalMillis,
|
|
url: url,
|
|
jobName: defaultJobname,
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
opt(p)
|
|
}
|
|
|
|
p.pusher = push.New(url, p.jobName).Collector(collector)
|
|
|
|
return p
|
|
}
|
|
|
|
func (p *Pusher) Run(ctx context.Context) error {
|
|
|
|
ticker := time.NewTicker(time.Duration(p.intervalMillis * int(time.Microsecond)))
|
|
done := make(chan error)
|
|
go func(done chan error) {
|
|
Loop:
|
|
for {
|
|
select {
|
|
case <-ticker.C:
|
|
err := p.pusher.Push()
|
|
if err != nil {
|
|
done <- fmt.Errorf("puser: %v", err)
|
|
break Loop
|
|
}
|
|
case <-ctx.Done():
|
|
log.Println("INFO: pusher context complete")
|
|
done <- nil
|
|
break Loop
|
|
}
|
|
}
|
|
close(done)
|
|
}(done)
|
|
|
|
return <-done
|
|
}
|