mirror of
https://github.com/Chipazawra/v8-1c-cluster-pde.git
synced 2025-03-21 21:17:03 +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
|
||
|
}
|