From 79d46769fe448dc324a42ba4f56c805c88e5fae4 Mon Sep 17 00:00:00 2001 From: Susana Ferreira Date: Fri, 14 Nov 2025 12:26:32 +0000 Subject: [PATCH] chore: remove warning for non-trackable workspace builds in metrics (#20775) Previously, `UpdateWorkspaceTimingsMetrics` would log a warning for workspace builds that aren't tracked (restarts, stops, subsequent builds after creation). This was noisy since these are legitimate operations, not errors. `UpdateWorkspaceTimingsMetrics` is specifically designed to track only workspace creation, prebuild creation, and prebuild claim timings. Related with: https://github.com/coder/coder/pull/20772 --- coderd/provisionerdserver/metrics.go | 11 ++-- .../provisionerdserver/provisionerdserver.go | 60 ++++++++++--------- 2 files changed, 38 insertions(+), 33 deletions(-) diff --git a/coderd/provisionerdserver/metrics.go b/coderd/provisionerdserver/metrics.go index 442214f3c6..204bc2e717 100644 --- a/coderd/provisionerdserver/metrics.go +++ b/coderd/provisionerdserver/metrics.go @@ -100,6 +100,12 @@ func (m *Metrics) Register(reg prometheus.Registerer) error { return reg.Register(m.workspaceClaimTimings) } +// IsTrackable returns true if the workspace build should be tracked in metrics. +// This includes workspace creation, prebuild creation, and prebuild claims. +func (f WorkspaceTimingFlags) IsTrackable() bool { + return f.IsPrebuild || f.IsClaim || f.IsFirstBuild +} + // getWorkspaceTimingType classifies a workspace build: // - PrebuildCreation: creation of a prebuilt workspace // - PrebuildClaim: claim of an existing prebuilt workspace @@ -153,9 +159,6 @@ func (m *Metrics) UpdateWorkspaceTimingsMetrics( m.workspaceClaimTimings. WithLabelValues(organizationName, templateName, presetName).Observe(buildTime) default: - m.logger.Warn(ctx, "unsupported workspace timing flags", - "isPrebuild", flags.IsPrebuild, - "isClaim", flags.IsClaim, - "isWorkspaceFirstBuild", flags.IsFirstBuild) + // Not a trackable build type (e.g. restart, stop, subsequent builds) } } diff --git a/coderd/provisionerdserver/provisionerdserver.go b/coderd/provisionerdserver/provisionerdserver.go index 5ea01afcac..56670d8a2d 100644 --- a/coderd/provisionerdserver/provisionerdserver.go +++ b/coderd/provisionerdserver/provisionerdserver.go @@ -2336,40 +2336,42 @@ func (s *server) completeWorkspaceBuildJob(ctx context.Context, job database.Pro } // Update workspace (regular and prebuild) timing metrics - if s.metrics != nil { - // Only consider 'start' workspace builds - if workspaceBuild.Transition == database.WorkspaceTransitionStart { - // Get the updated job to report the metrics with correct data - updatedJob, err := s.Database.GetProvisionerJobByID(ctx, jobID) - if err != nil { - s.Logger.Error(ctx, "get updated job from database", slog.Error(err)) - } else - // Only consider 'succeeded' provisioner jobs - if updatedJob.JobStatus == database.ProvisionerJobStatusSucceeded { - presetName := "" - if workspaceBuild.TemplateVersionPresetID.Valid { - preset, err := s.Database.GetPresetByID(ctx, workspaceBuild.TemplateVersionPresetID.UUID) - if err != nil { - if !errors.Is(err, sql.ErrNoRows) { - s.Logger.Error(ctx, "get preset by ID for workspace timing metrics", slog.Error(err)) - } - } else { - presetName = preset.Name + // Only consider 'start' workspace builds + if s.metrics != nil && workspaceBuild.Transition == database.WorkspaceTransitionStart { + // Get the updated job to report the metrics with correct data + updatedJob, err := s.Database.GetProvisionerJobByID(ctx, jobID) + if err != nil { + s.Logger.Error(ctx, "get updated job from database", slog.Error(err)) + } else + // Only consider 'succeeded' provisioner jobs + if updatedJob.JobStatus == database.ProvisionerJobStatusSucceeded { + presetName := "" + if workspaceBuild.TemplateVersionPresetID.Valid { + preset, err := s.Database.GetPresetByID(ctx, workspaceBuild.TemplateVersionPresetID.UUID) + if err != nil { + if !errors.Is(err, sql.ErrNoRows) { + s.Logger.Error(ctx, "get preset by ID for workspace timing metrics", slog.Error(err)) } + } else { + presetName = preset.Name } + } - buildTime := updatedJob.CompletedAt.Time.Sub(updatedJob.StartedAt.Time).Seconds() + buildTime := updatedJob.CompletedAt.Time.Sub(updatedJob.StartedAt.Time).Seconds() + flags := WorkspaceTimingFlags{ + // Is a prebuilt workspace creation build + IsPrebuild: input.PrebuiltWorkspaceBuildStage.IsPrebuild(), + // Is a prebuilt workspace claim build + IsClaim: input.PrebuiltWorkspaceBuildStage.IsPrebuiltWorkspaceClaim(), + // Is a regular workspace creation build + // Only consider the first build number for regular workspaces + IsFirstBuild: workspaceBuild.BuildNumber == 1, + } + // Only track metrics for prebuild creation, prebuild claims and workspace creation + if flags.IsTrackable() { s.metrics.UpdateWorkspaceTimingsMetrics( ctx, - WorkspaceTimingFlags{ - // Is a prebuilt workspace creation build - IsPrebuild: input.PrebuiltWorkspaceBuildStage.IsPrebuild(), - // Is a prebuilt workspace claim build - IsClaim: input.PrebuiltWorkspaceBuildStage.IsPrebuiltWorkspaceClaim(), - // Is a regular workspace creation build - // Only consider the first build number for regular workspaces - IsFirstBuild: workspaceBuild.BuildNumber == 1, - }, + flags, workspace.OrganizationName, workspace.TemplateName, presetName,