diff --git a/provisionerd/provisionerd.go b/provisionerd/provisionerd.go index deac80466b48d..4cf2436ea1267 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 d8b4149ec075f..ebecc3c89099e 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()) }()