in loadgen/cmd/otelbench/main.go [61:108]
func runBench(ctx context.Context, signal, exporter string, concurrency int, reporter func(b *testing.B)) testing.BenchmarkResult {
return testing.Benchmark(func(b *testing.B) {
// loadgenreceiver will send stats about generated telemetry when it finishes sending b.N iterations
logsDone := make(chan loadgenreceiver.Stats)
metricsDone := make(chan loadgenreceiver.Stats)
tracesDone := make(chan loadgenreceiver.Stats)
if signal != "logs" {
close(logsDone)
}
if signal != "metrics" {
close(metricsDone)
}
if signal != "traces" {
close(tracesDone)
}
stop := make(chan struct{}) // close channel to stop the loadgen collector
done := make(chan struct{}) // close channel to exit benchmark after stats were reported
go func() {
logsStats := <-logsDone
metricsStats := <-metricsDone
tracesStats := <-tracesDone
b.StopTimer()
stats := logsStats.Add(metricsStats).Add(tracesStats)
elapsedSeconds := b.Elapsed().Seconds()
close(stop)
b.ReportMetric(float64(stats.LogRecords)/elapsedSeconds, "logs/s")
b.ReportMetric(float64(stats.MetricDataPoints)/elapsedSeconds, "metric_points/s")
b.ReportMetric(float64(stats.Spans)/elapsedSeconds, "spans/s")
b.ReportMetric(float64(stats.Requests)/elapsedSeconds, "requests/s")
b.ReportMetric(float64(stats.FailedLogRecords)/elapsedSeconds, "failed_logs/s")
b.ReportMetric(float64(stats.FailedMetricDataPoints)/elapsedSeconds, "failed_metric_points/s")
b.ReportMetric(float64(stats.FailedSpans)/elapsedSeconds, "failed_spans/s")
b.ReportMetric(float64(stats.FailedRequests)/elapsedSeconds, "failed_requests/s")
reporter(b)
close(done)
}()
err := RunCollector(ctx, stop, configs(exporter, signal, b.N, concurrency), logsDone, metricsDone, tracesDone)
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
b.Fatal(err)
}
<-done
})
}