in metricsgenreceiver/receiver.go [179:210]
func (r *MetricsGenReceiver) produceMetrics(ctx context.Context, currentTime time.Time) uint64 {
dataPoints := new(uint64)
wg := sync.WaitGroup{}
for _, scn := range r.scenarios {
// we don't keep track of the data points for each instance individually to reduce memory pressure
// we still advance the metrics template have a new baseline that's used when simulating the metrics for each individual instance
// this makes sure counters are increasing over time
dp.ForEachDataPoint(scn.metricsTemplate, func(res pcommon.Resource, is pcommon.InstrumentationScope, m pmetric.Metric, dp dp.DataPoint) {
distribution.AdvanceDataPoint(dp, r.rand, m, r.cfg.Distribution)
})
if scn.config.Concurrency == 0 {
for i := range scn.config.Scale {
*dataPoints += uint64(r.produceMetricsForInstance(ctx, currentTime, scn, scn.resources[i]))
}
continue
}
for i := 0; i < scn.config.Concurrency; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for j := 0; j < scn.config.Scale/scn.config.Concurrency; j++ {
resource := scn.resources[j+i*scn.config.Scale/scn.config.Concurrency]
currentDataPoints := r.produceMetricsForInstance(ctx, currentTime, scn, resource)
atomic.AddUint64(dataPoints, uint64(currentDataPoints))
}
}()
}
}
wg.Wait()
return *dataPoints
}