mirror of
https://github.com/coder/coder.git
synced 2026-09-21 20:51:01 +08:00
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
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user