Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1b66495

Browse files
authored
fix(coderd/prometheusmetrics)!: filter deleted wsbuilds to reduce db load (#19197)
This change removes the `GetLatestWorkspaceBuilds` query which includesall workspaces for all time (including deleted). This allows us to alsostop using `GetProvisionerJobsByIDs` for said builds as the job statusis included in `GetWorkspaces` called separately.**BREAKING CHANGE**: The `coderd_api_workspace_latest_build` Prometheusmetric no longer includes builds belonging to deleted workspaces, assuch, this metric will show fewer statuses.Fixescoder/internal#717
1 parent060fb57 commit1b66495

File tree

9 files changed

+95
-157
lines changed

9 files changed

+95
-157
lines changed

‎coderd/database/dbauthz/dbauthz.go‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2178,17 +2178,6 @@ func (q *querier) GetLatestWorkspaceBuildByWorkspaceID(ctx context.Context, work
21782178
returnq.db.GetLatestWorkspaceBuildByWorkspaceID(ctx,workspaceID)
21792179
}
21802180

2181-
func (q*querier)GetLatestWorkspaceBuilds(ctx context.Context) ([]database.WorkspaceBuild,error) {
2182-
// This function is a system function until we implement a join for workspace builds.
2183-
// This is because we need to query for all related workspaces to the returned builds.
2184-
// This is a very inefficient method of fetching the latest workspace builds.
2185-
// We should just join the rbac properties.
2186-
iferr:=q.authorizeContext(ctx,policy.ActionRead,rbac.ResourceSystem);err!=nil {
2187-
returnnil,err
2188-
}
2189-
returnq.db.GetLatestWorkspaceBuilds(ctx)
2190-
}
2191-
21922181
func (q*querier)GetLatestWorkspaceBuildsByWorkspaceIDs(ctx context.Context,ids []uuid.UUID) ([]database.WorkspaceBuild,error) {
21932182
// This function is a system function until we implement a join for workspace builds.
21942183
iferr:=q.authorizeContext(ctx,policy.ActionRead,rbac.ResourceSystem);err!=nil {

‎coderd/database/dbauthz/dbauthz_test.go‎

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4035,12 +4035,6 @@ func (s *MethodTestSuite) TestSystemFunctions() {
40354035
LoginType:l.LoginType,
40364036
}).Asserts(rbac.ResourceSystem,policy.ActionRead).Returns(l)
40374037
}))
4038-
s.Run("GetLatestWorkspaceBuilds",s.Subtest(func(db database.Store,check*expects) {
4039-
dbtestutil.DisableForeignKeysAndTriggers(s.T(),db)
4040-
dbgen.WorkspaceBuild(s.T(),db, database.WorkspaceBuild{})
4041-
dbgen.WorkspaceBuild(s.T(),db, database.WorkspaceBuild{})
4042-
check.Args().Asserts(rbac.ResourceSystem,policy.ActionRead)
4043-
}))
40444038
s.Run("GetActiveUserCount",s.Subtest(func(db database.Store,check*expects) {
40454039
check.Args(false).Asserts(rbac.ResourceSystem,policy.ActionRead).Returns(int64(0))
40464040
}))

‎coderd/database/dbmetrics/querymetrics.go‎

Lines changed: 0 additions & 7 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎coderd/database/dbmock/dbmock.go‎

Lines changed: 0 additions & 15 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎coderd/database/querier.go‎

Lines changed: 0 additions & 1 deletion
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎coderd/database/queries.sql.go‎

Lines changed: 0 additions & 59 deletions
Some generated files are not rendered by default. Learn more aboutcustomizing how changed files appear on GitHub.

‎coderd/database/queries/workspacebuilds.sql‎

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -91,20 +91,6 @@ JOIN
9191
workspace_build_with_userAS wb
9292
ONm.workspace_id=wb.workspace_idANDm.max_build_number=wb.build_number;
9393

94-
-- name: GetLatestWorkspaceBuilds :many
95-
SELECT wb.*
96-
FROM (
97-
SELECT
98-
workspace_id,MAX(build_number)as max_build_number
99-
FROM
100-
workspace_build_with_userAS workspace_builds
101-
GROUP BY
102-
workspace_id
103-
) m
104-
JOIN
105-
workspace_build_with_userAS wb
106-
ONm.workspace_id=wb.workspace_idANDm.max_build_number=wb.build_number;
107-
10894
-- name: InsertWorkspaceBuild :exec
10995
INSERT INTO
11096
workspace_builds (

‎coderd/prometheusmetrics/prometheusmetrics.go‎

Lines changed: 21 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
150150
Namespace:"coderd",
151151
Subsystem:"api",
152152
Name:"workspace_latest_build",
153-
Help:"The current number of workspace builds by status.",
153+
Help:"The current number of workspace builds by status for all non-deleted workspaces.",
154154
}, []string{"status"})
155155
iferr:=registerer.Register(workspaceLatestBuildTotals);err!=nil {
156156
returnnil,err
@@ -159,7 +159,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
159159
workspaceLatestBuildStatuses:=prometheus.NewGaugeVec(prometheus.GaugeOpts{
160160
Namespace:"coderd",
161161
Name:"workspace_latest_build_status",
162-
Help:"The current workspace statuses by template, transition, and owner.",
162+
Help:"The current workspace statuses by template, transition, and owner for all non-deleted workspaces.",
163163
}, []string{"status","template_name","template_version","workspace_owner","workspace_transition"})
164164
iferr:=registerer.Register(workspaceLatestBuildStatuses);err!=nil {
165165
returnnil,err
@@ -168,59 +168,37 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
168168
ctx,cancelFunc:=context.WithCancel(ctx)
169169
done:=make(chanstruct{})
170170

171-
updateWorkspaceTotals:=func() {
172-
builds,err:=db.GetLatestWorkspaceBuilds(ctx)
173-
iferr!=nil {
174-
iferrors.Is(err,sql.ErrNoRows) {
175-
// clear all series if there are no database entries
176-
workspaceLatestBuildTotals.Reset()
177-
}else {
178-
logger.Warn(ctx,"failed to load latest workspace builds",slog.Error(err))
179-
}
180-
return
181-
}
182-
jobIDs:=make([]uuid.UUID,0,len(builds))
183-
for_,build:=rangebuilds {
184-
jobIDs=append(jobIDs,build.JobID)
185-
}
186-
jobs,err:=db.GetProvisionerJobsByIDs(ctx,jobIDs)
187-
iferr!=nil {
188-
ids:=make([]string,0,len(jobIDs))
189-
for_,id:=rangejobIDs {
190-
ids=append(ids,id.String())
191-
}
192-
193-
logger.Warn(ctx,"failed to load provisioner jobs",slog.F("ids",ids),slog.Error(err))
194-
return
195-
}
196-
197-
workspaceLatestBuildTotals.Reset()
198-
for_,job:=rangejobs {
199-
status:=codersdk.ProvisionerJobStatus(job.JobStatus)
200-
workspaceLatestBuildTotals.WithLabelValues(string(status)).Add(1)
201-
// TODO: deprecated: remove in the future
202-
workspaceLatestBuildTotalsDeprecated.WithLabelValues(string(status)).Add(1)
203-
}
204-
}
205-
206-
updateWorkspaceStatuses:=func() {
171+
updateWorkspaceMetrics:=func() {
207172
ws,err:=db.GetWorkspaces(ctx, database.GetWorkspacesParams{
208173
Deleted:false,
209174
WithSummary:false,
210175
})
211176
iferr!=nil {
212177
iferrors.Is(err,sql.ErrNoRows) {
213-
// clear all series if there are no database entries
178+
workspaceLatestBuildTotals.Reset()
214179
workspaceLatestBuildStatuses.Reset()
180+
}else {
181+
logger.Warn(ctx,"failed to load active workspaces for metrics",slog.Error(err))
215182
}
216-
217-
logger.Warn(ctx,"failed to load active workspaces",slog.Error(err))
218183
return
219184
}
220185

186+
workspaceLatestBuildTotals.Reset()
221187
workspaceLatestBuildStatuses.Reset()
188+
222189
for_,w:=rangews {
223-
workspaceLatestBuildStatuses.WithLabelValues(string(w.LatestBuildStatus),w.TemplateName,w.TemplateVersionName.String,w.OwnerUsername,string(w.LatestBuildTransition)).Add(1)
190+
status:=string(w.LatestBuildStatus)
191+
workspaceLatestBuildTotals.WithLabelValues(status).Add(1)
192+
// TODO: deprecated: remove in the future
193+
workspaceLatestBuildTotalsDeprecated.WithLabelValues(status).Add(1)
194+
195+
workspaceLatestBuildStatuses.WithLabelValues(
196+
status,
197+
w.TemplateName,
198+
w.TemplateVersionName.String,
199+
w.OwnerUsername,
200+
string(w.LatestBuildTransition),
201+
).Add(1)
224202
}
225203
}
226204

@@ -230,8 +208,7 @@ func Workspaces(ctx context.Context, logger slog.Logger, registerer prometheus.R
230208
doTick:=func() {
231209
deferticker.Reset(duration)
232210

233-
updateWorkspaceTotals()
234-
updateWorkspaceStatuses()
211+
updateWorkspaceMetrics()
235212
}
236213

237214
gofunc() {

‎coderd/prometheusmetrics/prometheusmetrics_test.go‎

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,32 @@ func TestWorkspaceLatestBuildTotals(t *testing.T) {
247247
codersdk.ProvisionerJobSucceeded:3,
248248
codersdk.ProvisionerJobRunning:1,
249249
},
250+
}, {
251+
Name:"MultipleWithDeleted",
252+
Database:func() database.Store {
253+
db,_:=dbtestutil.NewDB(t)
254+
u:=dbgen.User(t,db, database.User{})
255+
org:=dbgen.Organization(t,db, database.Organization{})
256+
insertCanceled(t,db,u,org)
257+
insertFailed(t,db,u,org)
258+
insertSuccess(t,db,u,org)
259+
insertRunning(t,db,u,org)
260+
261+
// Verify that deleted workspaces/builds are NOT counted in metrics.
262+
n,err:=cryptorand.Intn(5)
263+
require.NoError(t,err)
264+
forrange1+n {
265+
insertDeleted(t,db,u,org)
266+
}
267+
returndb
268+
},
269+
Total:4,// Only non-deleted workspaces should be counted
270+
Status:map[codersdk.ProvisionerJobStatus]int{
271+
codersdk.ProvisionerJobCanceled:1,
272+
codersdk.ProvisionerJobFailed:1,
273+
codersdk.ProvisionerJobSucceeded:1,
274+
codersdk.ProvisionerJobRunning:1,
275+
},
250276
}} {
251277
t.Run(tc.Name,func(t*testing.T) {
252278
t.Parallel()
@@ -323,6 +349,33 @@ func TestWorkspaceLatestBuildStatuses(t *testing.T) {
323349
codersdk.ProvisionerJobSucceeded:3,
324350
codersdk.ProvisionerJobRunning:1,
325351
},
352+
}, {
353+
Name:"MultipleWithDeleted",
354+
Database:func() database.Store {
355+
db,_:=dbtestutil.NewDB(t)
356+
u:=dbgen.User(t,db, database.User{})
357+
org:=dbgen.Organization(t,db, database.Organization{})
358+
insertTemplates(t,db,u,org)
359+
insertCanceled(t,db,u,org)
360+
insertFailed(t,db,u,org)
361+
insertSuccess(t,db,u,org)
362+
insertRunning(t,db,u,org)
363+
364+
// Verify that deleted workspaces/builds are NOT counted in metrics.
365+
n,err:=cryptorand.Intn(5)
366+
require.NoError(t,err)
367+
forrange1+n {
368+
insertDeleted(t,db,u,org)
369+
}
370+
returndb
371+
},
372+
ExpectedWorkspaces:4,// Only non-deleted workspaces should be counted
373+
ExpectedStatuses:map[codersdk.ProvisionerJobStatus]int{
374+
codersdk.ProvisionerJobCanceled:1,
375+
codersdk.ProvisionerJobFailed:1,
376+
codersdk.ProvisionerJobSucceeded:1,
377+
codersdk.ProvisionerJobRunning:1,
378+
},
326379
}} {
327380
t.Run(tc.Name,func(t*testing.T) {
328381
t.Parallel()
@@ -907,3 +960,24 @@ func insertSuccess(t *testing.T, db database.Store, u database.User, org databas
907960
})
908961
require.NoError(t,err)
909962
}
963+
964+
funcinsertDeleted(t*testing.T,db database.Store,u database.User,org database.Organization) {
965+
job:=insertRunning(t,db,u,org)
966+
err:=db.UpdateProvisionerJobWithCompleteByID(context.Background(), database.UpdateProvisionerJobWithCompleteByIDParams{
967+
ID:job.ID,
968+
CompletedAt: sql.NullTime{
969+
Time:dbtime.Now(),
970+
Valid:true,
971+
},
972+
})
973+
require.NoError(t,err)
974+
975+
build,err:=db.GetWorkspaceBuildByJobID(context.Background(),job.ID)
976+
require.NoError(t,err)
977+
978+
err=db.UpdateWorkspaceDeletedByID(context.Background(), database.UpdateWorkspaceDeletedByIDParams{
979+
ID:build.WorkspaceID,
980+
Deleted:true,
981+
})
982+
require.NoError(t,err)
983+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp