From c5287910f95784ee3e700e842f3f8c0df87a8cb8 Mon Sep 17 00:00:00 2001 From: Kevin Ha Date: Wed, 11 Dec 2024 16:36:48 +1100 Subject: [PATCH] feat: add workspace build timing metrics (#15771) This PR introduces a new prometheus metrics for `workspace_build_timing_seconds`, which specifically reports workspace build times. To reduce cardinality, this metrics excludes `workspace_name` and `workspace_owner` that are present on the `workspace_builds_total` metrics. --- provisionerd/provisionerd.go | 16 ++++++++++++++++ provisionerd/runner/runner.go | 9 ++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/provisionerd/provisionerd.go b/provisionerd/provisionerd.go index deac80466b..4cf2436ea1 100644 --- a/provisionerd/provisionerd.go +++ b/provisionerd/provisionerd.go @@ -178,6 +178,22 @@ func NewMetrics(reg prometheus.Registerer) Metrics { Name: "workspace_builds_total", Help: "The number of workspaces started, updated, or deleted.", }, []string{"workspace_owner", "workspace_name", "template_name", "template_version", "workspace_transition", "status"}), + WorkspaceBuildTimings: auto.NewHistogramVec(prometheus.HistogramOpts{ + Namespace: "coderd", + Subsystem: "provisionerd", + Name: "workspace_build_timings_seconds", + Help: "The time taken for a workspace to build.", + Buckets: []float64{ + 1, // 1s + 10, + 30, + 60, // 1min + 60 * 5, + 60 * 10, + 60 * 30, // 30min + 60 * 60, // 1hr + }, + }, []string{"template_name", "template_version", "workspace_transition", "status"}), }, } } diff --git a/provisionerd/runner/runner.go b/provisionerd/runner/runner.go index d8b4149ec0..ebecc3c890 100644 --- a/provisionerd/runner/runner.go +++ b/provisionerd/runner/runner.go @@ -86,7 +86,8 @@ type Metrics struct { // JobTimings also counts the total amount of jobs. JobTimings *prometheus.HistogramVec // WorkspaceBuilds counts workspace build successes and failures. - WorkspaceBuilds *prometheus.CounterVec + WorkspaceBuilds *prometheus.CounterVec + WorkspaceBuildTimings *prometheus.HistogramVec } type JobUpdater interface { @@ -189,6 +190,12 @@ func (r *Runner) Run() { build.Metadata.WorkspaceTransition.String(), status, ).Inc() + r.metrics.WorkspaceBuildTimings.WithLabelValues( + build.Metadata.TemplateName, + build.Metadata.TemplateVersion, + build.Metadata.WorkspaceTransition.String(), + status, + ).Observe(time.Since(start).Seconds()) } r.metrics.JobTimings.WithLabelValues(r.job.Provisioner, status).Observe(time.Since(start).Seconds()) }()