github.com/influxdata/influxdb/v2@v2.7.6/telemetry/reporter.go (about)

     1  package telemetry
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	influxlogger "github.com/influxdata/influxdb/v2/logger"
     8  	"github.com/prometheus/client_golang/prometheus"
     9  	"go.uber.org/zap"
    10  )
    11  
    12  // Reporter reports telemetry metrics to a prometheus push
    13  // gateway every interval.
    14  type Reporter struct {
    15  	Pusher   *Pusher
    16  	log      *zap.Logger
    17  	Interval time.Duration
    18  }
    19  
    20  // NewReporter reports telemetry every 24 hours.
    21  func NewReporter(log *zap.Logger, g prometheus.Gatherer) *Reporter {
    22  	return &Reporter{
    23  		Pusher:   NewPusher(g),
    24  		log:      log,
    25  		Interval: 24 * time.Hour,
    26  	}
    27  }
    28  
    29  // Report starts periodic telemetry reporting each interval.
    30  func (r *Reporter) Report(ctx context.Context) {
    31  	logger := r.log.With(
    32  		zap.String("service", "telemetry"),
    33  		influxlogger.DurationLiteral("interval", r.Interval),
    34  	)
    35  
    36  	logger.Info("Starting")
    37  	if err := r.Pusher.Push(ctx); err != nil {
    38  		logger.Debug("Failure reporting telemetry metrics", zap.Error(err))
    39  	}
    40  
    41  	ticker := time.NewTicker(r.Interval)
    42  	defer ticker.Stop()
    43  	for {
    44  		select {
    45  		case <-ticker.C:
    46  			logger.Debug("Reporting")
    47  			if err := r.Pusher.Push(ctx); err != nil {
    48  				logger.Debug("Failure reporting telemetry metrics", zap.Error(err))
    49  			}
    50  		case <-ctx.Done():
    51  			logger.Info("Stopping")
    52  			return
    53  		}
    54  	}
    55  }