func runBench()

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
	})
}