in internal/telemetrygen/traces/traces.go [117:176]
func Run(c *Config, logger *zap.Logger) error {
if c.TotalDuration > 0 {
c.NumTraces = 0
} else if c.NumTraces <= 0 {
return fmt.Errorf("either `traces` or `duration` must be greater than 0")
}
limit := rate.Limit(c.Rate)
if c.Rate == 0 {
limit = rate.Inf
logger.Info("generation of traces isn't being throttled")
} else {
logger.Info("generation of traces is limited", zap.Float64("per-second", float64(limit)))
}
var statusCode codes.Code
switch strings.ToLower(c.StatusCode) {
case "0", "unset", "":
statusCode = codes.Unset
case "1", "error":
statusCode = codes.Error
case "2", "ok":
statusCode = codes.Ok
default:
return fmt.Errorf("expected `status-code` to be one of (Unset, Error, Ok) or (0, 1, 2), got %q instead", c.StatusCode)
}
wg := sync.WaitGroup{}
running := &atomic.Bool{}
running.Store(true)
telemetryAttributes := c.GetTelemetryAttributes()
for i := 0; i < c.WorkerCount; i++ {
wg.Add(1)
w := worker{
numTraces: c.NumTraces,
numChildSpans: int(math.Max(1, float64(c.NumChildSpans))),
propagateContext: c.PropagateContext,
statusCode: statusCode,
limitPerSecond: limit,
totalDuration: c.TotalDuration,
running: running,
wg: &wg,
logger: logger.With(zap.Int("worker", i)),
loadSize: c.LoadSize,
spanDuration: c.SpanDuration,
}
go w.simulateTraces(telemetryAttributes)
}
if c.TotalDuration > 0 {
time.Sleep(c.TotalDuration)
running.Store(false)
}
wg.Wait()
return nil
}