Skip to content

Commit bf40d67

Browse files
fix(cli): close prebuild runner prometheus server last (#21053)
## Description Fixes the prebuilds scaletest command where the prometheus server was being shut down before waiting for metrics to be scraped. The issue was the defer order - since defers execute in LIFO (last-in, first-out) order: **Before (broken):** 1. Register tracing defer (includes wait for prometheus scrape) 2. Register prometheus server defer Execution order: prometheus closes first, then wait happens (server already gone!) **After (fixed):** 1. Register prometheus server defer 2. Register tracing defer (includes wait for prometheus scrape) Execution order: wait happens first (server still up), then prometheus closes. This matches the pattern used in other scaletest commands. ## Impact The `coderd_scaletest_prebuild_deletion_jobs_completed` metric (and potentially others) was always showing 0 because the server shut down before Prometheus could scrape the final values. _This PR was generated by [`mux`](https://github.com/coder/mux) and reviewed by a human._
1 parent a47b3a4 commit bf40d67

File tree

2 files changed

+19
-16
lines changed

2 files changed

+19
-16
lines changed

cli/exp_scaletest.go

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1559,6 +1559,15 @@ func (r *RootCmd) scaletestDashboard() *serpent.Command {
15591559
if err != nil {
15601560
return xerrors.Errorf("create tracer provider: %w", err)
15611561
}
1562+
tracer := tracerProvider.Tracer(scaletestTracerName)
1563+
outputs, err := output.parse()
1564+
if err != nil {
1565+
return xerrors.Errorf("could not parse --output flags")
1566+
}
1567+
reg := prometheus.NewRegistry()
1568+
prometheusSrvClose := ServeHandler(ctx, logger, promhttp.HandlerFor(reg, promhttp.HandlerOpts{}), prometheusFlags.Address, "prometheus")
1569+
defer prometheusSrvClose()
1570+
15621571
defer func() {
15631572
// Allow time for traces to flush even if command context is
15641573
// canceled. This is a no-op if tracing is not enabled.
@@ -1570,14 +1579,7 @@ func (r *RootCmd) scaletestDashboard() *serpent.Command {
15701579
_, _ = fmt.Fprintf(inv.Stderr, "Waiting %s for prometheus metrics to be scraped\n", prometheusFlags.Wait)
15711580
<-time.After(prometheusFlags.Wait)
15721581
}()
1573-
tracer := tracerProvider.Tracer(scaletestTracerName)
1574-
outputs, err := output.parse()
1575-
if err != nil {
1576-
return xerrors.Errorf("could not parse --output flags")
1577-
}
1578-
reg := prometheus.NewRegistry()
1579-
prometheusSrvClose := ServeHandler(ctx, logger, promhttp.HandlerFor(reg, promhttp.HandlerOpts{}), prometheusFlags.Address, "prometheus")
1580-
defer prometheusSrvClose()
1582+
15811583
metrics := dashboard.NewMetrics(reg)
15821584

15831585
th := harness.NewTestHarness(strategy.toStrategy(), cleanupStrategy.toStrategy())

cli/exp_scaletest_prebuilds.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,6 @@ func (r *RootCmd) scaletestPrebuilds() *serpent.Command {
8484
if err != nil {
8585
return xerrors.Errorf("create tracer provider: %w", err)
8686
}
87-
defer func() {
88-
_, _ = fmt.Fprintln(inv.Stderr, "\nUploading traces...")
89-
if err := closeTracing(ctx); err != nil {
90-
_, _ = fmt.Fprintf(inv.Stderr, "\nError uploading traces: %+v\n", err)
91-
}
92-
_, _ = fmt.Fprintf(inv.Stderr, "Waiting %s for prometheus metrics to be scraped\n", prometheusFlags.Wait)
93-
<-time.After(prometheusFlags.Wait)
94-
}()
9587
tracer := tracerProvider.Tracer(scaletestTracerName)
9688

9789
reg := prometheus.NewRegistry()
@@ -101,6 +93,15 @@ func (r *RootCmd) scaletestPrebuilds() *serpent.Command {
10193
prometheusSrvClose := ServeHandler(ctx, logger, promhttp.HandlerFor(reg, promhttp.HandlerOpts{}), prometheusFlags.Address, "prometheus")
10294
defer prometheusSrvClose()
10395

96+
defer func() {
97+
_, _ = fmt.Fprintln(inv.Stderr, "\nUploading traces...")
98+
if err := closeTracing(ctx); err != nil {
99+
_, _ = fmt.Fprintf(inv.Stderr, "\nError uploading traces: %+v\n", err)
100+
}
101+
_, _ = fmt.Fprintf(inv.Stderr, "Waiting %s for prometheus metrics to be scraped\n", prometheusFlags.Wait)
102+
<-time.After(prometheusFlags.Wait)
103+
}()
104+
104105
err = client.PutPrebuildsSettings(ctx, codersdk.PrebuildsSettings{
105106
ReconciliationPaused: true,
106107
})

0 commit comments

Comments
 (0)