sweet/benchmarks/etcd: use new diagnostics framework

Change-Id: I242b0f6a6a857277023cbcd7a1ba5b204f278a9e
Cq-Include-Trybots: luci.golang.try:x_benchmarks-gotip-linux-amd64-longtest
Reviewed-on: https://go-review.googlesource.com/c/benchmarks/+/600064
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Pratt <mpratt@google.com>
diff --git a/sweet/benchmarks/etcd/main.go b/sweet/benchmarks/etcd/main.go
index 64025e0..444a087 100644
--- a/sweet/benchmarks/etcd/main.go
+++ b/sweet/benchmarks/etcd/main.go
@@ -18,7 +18,6 @@
 	"runtime"
 	"strconv"
 	"strings"
-	"sync/atomic"
 
 	clientv3 "go.etcd.io/etcd/client/v3"
 	"golang.org/x/benchmarks/sweet/benchmarks/internal/driver"
@@ -363,52 +362,24 @@
 	return driver.RunBenchmark(cfg.bench.reportName, func(d *driver.B) error {
 		// Set up diagnostics.
 		var stopAll par.Funcs
-		if driver.DiagnosticEnabled(diagnostics.CPUProfile) {
-			for _, inst := range instances {
-				stop := server.PollDiagnostic(
-					inst.host(clientPort),
-					cfg.tmpDir,
-					cfg.bench.reportName,
-					diagnostics.CPUProfile,
-				)
+		diag := driver.NewDiagnostics(cfg.bench.reportName)
+		for _, typ := range diagnostics.Types() {
+			if typ.HTTPEndpoint() == "" {
+				continue
+			}
+			for i, inst := range instances {
+				name := ""
+				if !typ.CanMerge() {
+					// Create a separate file for each instance.
+					name = fmt.Sprintf("inst%d", i)
+				}
+				stop := server.FetchDiagnostic(inst.host(clientPort), diag, typ, name)
 				stopAll.Add(stop)
 			}
 		}
-		if driver.DiagnosticEnabled(diagnostics.Trace) {
-			var sum atomic.Uint64
-			for _, inst := range instances {
-				stopTrace := server.PollDiagnostic(
-					inst.host(clientPort),
-					cfg.tmpDir,
-					cfg.bench.reportName,
-					diagnostics.Trace,
-				)
-				stopAll.Add(func() {
-					n := stopTrace()
-					sum.Add(n)
-				})
-			}
-			defer func() {
-				d.Report("trace-bytes", sum.Load())
-			}()
-		}
-		if driver.DiagnosticEnabled(diagnostics.MemProfile) {
-			for _, inst := range instances {
-				inst := inst
-				stopAll.Add(func() {
-					_, err := server.CollectDiagnostic(
-						inst.host(clientPort),
-						cfg.tmpDir,
-						cfg.bench.reportName,
-						diagnostics.MemProfile,
-					)
-					if err != nil {
-						fmt.Fprintf(os.Stderr, "failed to read memprofile: %v", err)
-					}
-				})
-			}
-		}
+		defer diag.Commit(d)
 		defer stopAll.Run()
+
 		// Actually run the benchmark.
 		return runBenchmark(d, cfg, instances)
 	}, opts...)