in internal/telemetrygen/traces/worker.go [50:116]
func (w worker) simulateTraces(telemetryAttributes []attribute.KeyValue) {
tracer := otel.Tracer("telemetrygen")
limiter := rate.NewLimiter(w.limitPerSecond, 1)
var i int
for w.running.Load() {
spanStart := time.Now()
spanEnd := spanStart.Add(w.spanDuration)
ctx, sp := tracer.Start(context.Background(), "lets-go", trace.WithAttributes(
semconv.NetPeerIPKey.String(fakeIP),
semconv.PeerServiceKey.String("telemetrygen-server"),
),
trace.WithSpanKind(trace.SpanKindClient),
trace.WithTimestamp(spanStart),
)
sp.SetAttributes(telemetryAttributes...)
for j := 0; j < w.loadSize; j++ {
sp.SetAttributes(attribute.String(fmt.Sprintf("load-%v", j), string(make([]byte, charactersPerMB))))
}
childCtx := ctx
if w.propagateContext {
header := propagation.HeaderCarrier{}
// simulates going remote
otel.GetTextMapPropagator().Inject(childCtx, header)
// simulates getting a request from a client
childCtx = otel.GetTextMapPropagator().Extract(childCtx, header)
}
var endTimestamp trace.SpanEventOption
for j := 0; j < w.numChildSpans; j++ {
_, child := tracer.Start(childCtx, "okey-dokey-"+strconv.Itoa(j), trace.WithAttributes(
semconv.NetPeerIPKey.String(fakeIP),
semconv.PeerServiceKey.String("telemetrygen-client"),
),
trace.WithSpanKind(trace.SpanKindServer),
trace.WithTimestamp(spanStart),
)
child.SetAttributes(telemetryAttributes...)
if err := limiter.Wait(context.Background()); err != nil {
w.logger.Fatal("limiter waited failed, retry", zap.Error(err))
}
endTimestamp = trace.WithTimestamp(spanEnd)
child.SetStatus(w.statusCode, "")
child.End(endTimestamp)
// Reset the start and end for next span
spanStart = spanEnd
spanEnd = spanStart.Add(w.spanDuration)
}
sp.SetStatus(w.statusCode, "")
sp.End(endTimestamp)
i++
if w.numTraces != 0 {
if i >= w.numTraces {
break
}
}
}
w.logger.Info("traces generated", zap.Int("traces", i))
w.wg.Done()
}