Skip to content

Commit d0b8398

Browse files
committed
WIP
1 parent 7307bd3 commit d0b8398

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

cli/server.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,12 @@ func (r *RootCmd) Server(newAPI func(context.Context, *coderd.Options) (*coderd.
844844
}
845845
defer closeWorkspacesFunc()
846846

847+
closeAgentStatsFunc, err := prometheusmetrics.AgentStats(ctx, logger, options.PrometheusRegistry, options.Database, 0)
848+
if err != nil {
849+
return xerrors.Errorf("register agent stats prometheus metric: %w", err)
850+
}
851+
defer closeAgentStatsFunc()
852+
847853
//nolint:revive
848854
defer serveHandler(ctx, logger, promhttp.InstrumentMetricHandler(
849855
options.PrometheusRegistry, promhttp.HandlerFor(options.PrometheusRegistry, promhttp.HandlerOpts{}),

coderd/prometheusmetrics/prometheusmetrics.go

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ func Agents(ctx context.Context, logger slog.Logger, registerer prometheus.Regis
200200
})
201201
if err != nil {
202202
logger.Error(ctx, "can't get workspace rows", slog.Error(err))
203-
continue
203+
goto done
204204
}
205205

206206
for _, workspace := range workspaceRows {
@@ -283,9 +283,59 @@ func Agents(ctx context.Context, logger slog.Logger, registerer prometheus.Regis
283283
agentsConnectionLatenciesGauge.Commit()
284284
agentsAppsGauge.Commit()
285285

286+
done:
286287
logger.Debug(ctx, "Agent metrics collection is done")
287288
metricsCollectorAgents.Observe(timer.ObserveDuration().Seconds())
288289
}
289290
}()
290291
return cancelFunc, nil
291292
}
293+
294+
func AgentStats(ctx context.Context, logger slog.Logger, registerer prometheus.Registerer, db database.Store, duration time.Duration) (context.CancelFunc, error) {
295+
if duration == 0 {
296+
duration = 1 * time.Minute
297+
}
298+
299+
metricsCollectorAgentStats := prometheus.NewHistogram(prometheus.HistogramOpts{
300+
Namespace: "coderd",
301+
Subsystem: "prometheusmetrics",
302+
Name: "agentstats_execution_seconds",
303+
Help: "Histogram for duration of agent stats metrics collection in seconds.",
304+
Buckets: []float64{0.001, 0.005, 0.010, 0.025, 0.050, 0.100, 0.500, 1, 5, 10, 30},
305+
})
306+
err := registerer.Register(metricsCollectorAgentStats)
307+
if err != nil {
308+
return nil, err
309+
}
310+
311+
createdAfter := database.Now().Add(-duration)
312+
ctx, cancelFunc := context.WithCancel(ctx)
313+
ticker := time.NewTicker(duration)
314+
go func() {
315+
defer ticker.Stop()
316+
for {
317+
select {
318+
case <-ctx.Done():
319+
return
320+
case <-ticker.C:
321+
}
322+
323+
logger.Debug(ctx, "Agent metrics collection is starting")
324+
timer := prometheus.NewTimer(metricsCollectorAgentStats)
325+
326+
_, err := db.GetWorkspaceAgentStats(ctx, createdAfter)
327+
if err != nil {
328+
logger.Error(ctx, "can't get agent stats", slog.Error(err))
329+
goto done
330+
}
331+
332+
db.GetWorkspAgents
333+
334+
done:
335+
logger.Debug(ctx, "Agent metrics collection is done")
336+
metricsCollectorAgentStats.Observe(timer.ObserveDuration().Seconds())
337+
}
338+
}()
339+
return cancelFunc, nil
340+
341+
}

0 commit comments

Comments
 (0)