in internal/telemetrygen/metrics/metrics.go [82:124]
func Run(c *Config, exp func() (sdkmetric.Exporter, error), logger *zap.Logger) error {
if c.TotalDuration > 0 {
c.NumMetrics = 0
} else if c.NumMetrics <= 0 {
return fmt.Errorf("either `metrics` or `duration` must be greater than 0")
}
limit := rate.Limit(c.Rate)
if c.Rate == 0 {
limit = rate.Inf
logger.Info("generation of metrics isn't being throttled")
} else {
logger.Info("generation of metrics is limited", zap.Float64("per-second", float64(limit)))
}
wg := sync.WaitGroup{}
res := resource.NewWithAttributes(semconv.SchemaURL, c.GetAttributes()...)
running := &atomic.Bool{}
running.Store(true)
for i := 0; i < c.WorkerCount; i++ {
wg.Add(1)
w := worker{
numMetrics: c.NumMetrics,
metricType: c.MetricType,
limitPerSecond: limit,
totalDuration: c.TotalDuration,
running: running,
wg: &wg,
logger: logger.With(zap.Int("worker", i)),
index: i,
}
go w.simulateMetrics(res, exp, c.GetTelemetryAttributes())
}
if c.TotalDuration > 0 {
time.Sleep(c.TotalDuration)
running.Store(false)
}
wg.Wait()
return nil
}