Skip to content

Commit 141ef23

Browse files
authored
fix: introduce dedicated queries for workspaces and workspace agents metrics (coder#19786)
aid in differentiation between sources of calls to `GetWorkspaces` but introducing new queries for metrics specific use cases --------- Signed-off-by: Callum Styan <callumstyan@gmail.com>
1 parent b0a045c commit 141ef23

File tree

10 files changed

+313
-69
lines changed

10 files changed

+313
-69
lines changed

coderd/database/dbauthz/dbauthz.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3552,6 +3552,13 @@ func (q *querier) GetWorkspaceAgentsCreatedAfter(ctx context.Context, createdAt
35523552
return q.db.GetWorkspaceAgentsCreatedAfter(ctx, createdAt)
35533553
}
35543554

3555+
func (q *querier) GetWorkspaceAgentsForMetrics(ctx context.Context) ([]database.GetWorkspaceAgentsForMetricsRow, error) {
3556+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceWorkspace); err != nil {
3557+
return nil, err
3558+
}
3559+
return q.db.GetWorkspaceAgentsForMetrics(ctx)
3560+
}
3561+
35553562
func (q *querier) GetWorkspaceAgentsInLatestBuildByWorkspaceID(ctx context.Context, workspaceID uuid.UUID) ([]database.WorkspaceAgent, error) {
35563563
workspace, err := q.GetWorkspaceByID(ctx, workspaceID)
35573564
if err != nil {
@@ -3857,6 +3864,13 @@ func (q *querier) GetWorkspacesEligibleForTransition(ctx context.Context, now ti
38573864
return q.db.GetWorkspacesEligibleForTransition(ctx, now)
38583865
}
38593866

3867+
func (q *querier) GetWorkspacesForWorkspaceMetrics(ctx context.Context) ([]database.GetWorkspacesForWorkspaceMetricsRow, error) {
3868+
if err := q.authorizeContext(ctx, policy.ActionRead, rbac.ResourceWorkspace); err != nil {
3869+
return nil, err
3870+
}
3871+
return q.db.GetWorkspacesForWorkspaceMetrics(ctx)
3872+
}
3873+
38603874
func (q *querier) InsertAIBridgeInterception(ctx context.Context, arg database.InsertAIBridgeInterceptionParams) (database.AIBridgeInterception, error) {
38613875
return insert(q.log, q.auth, rbac.ResourceAibridgeInterception.WithOwner(arg.InitiatorID.String()), q.db.InsertAIBridgeInterception)(ctx, arg)
38623876
}

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,6 +1689,15 @@ func (s *MethodTestSuite) TestWorkspace() {
16891689
// No asserts here because SQLFilter.
16901690
check.Args(arg).Asserts()
16911691
}))
1692+
s.Run("GetWorkspaceAgentsForMetrics", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
1693+
row := testutil.Fake(s.T(), faker, database.GetWorkspaceAgentsForMetricsRow{})
1694+
dbm.EXPECT().GetWorkspaceAgentsForMetrics(gomock.Any()).Return([]database.GetWorkspaceAgentsForMetricsRow{row}, nil).AnyTimes()
1695+
check.Args().Asserts(rbac.ResourceWorkspace, policy.ActionRead).Returns([]database.GetWorkspaceAgentsForMetricsRow{row})
1696+
}))
1697+
s.Run("GetWorkspacesForWorkspaceMetrics", s.Mocked(func(dbm *dbmock.MockStore, _ *gofakeit.Faker, check *expects) {
1698+
dbm.EXPECT().GetWorkspacesForWorkspaceMetrics(gomock.Any()).Return([]database.GetWorkspacesForWorkspaceMetricsRow{}, nil).AnyTimes()
1699+
check.Args().Asserts(rbac.ResourceWorkspace, policy.ActionRead)
1700+
}))
16921701
s.Run("GetAuthorizedWorkspaces", s.Mocked(func(dbm *dbmock.MockStore, _ *gofakeit.Faker, check *expects) {
16931702
arg := database.GetWorkspacesParams{}
16941703
dbm.EXPECT().GetAuthorizedWorkspaces(gomock.Any(), arg, gomock.Any()).Return([]database.GetWorkspacesRow{}, nil).AnyTimes()

coderd/database/dbmetrics/querymetrics.go

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

coderd/database/dbmock/dbmock.go

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

coderd/database/querier.go

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

coderd/database/queries.sql.go

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

coderd/database/queries/workspaceagents.sql

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,3 +365,26 @@ WHERE
365365
id = $1
366366
AND parent_id IS NOT NULL
367367
AND deleted = FALSE;
368+
369+
-- name: GetWorkspaceAgentsForMetrics :many
370+
SELECT
371+
w.id as workspace_id,
372+
w.name as workspace_name,
373+
u.username as owner_username,
374+
t.name as template_name,
375+
tv.name as template_version_name,
376+
sqlc.embed(workspace_agents)
377+
FROM workspaces w
378+
JOIN users u ON w.owner_id = u.id
379+
JOIN templates t ON w.template_id = t.id
380+
JOIN workspace_builds wb ON w.id = wb.workspace_id
381+
LEFT JOIN template_versions tv ON wb.template_version_id = tv.id
382+
JOIN workspace_resources wr ON wb.job_id = wr.job_id
383+
JOIN workspace_agents ON wr.id = workspace_agents.resource_id
384+
WHERE w.deleted = false
385+
AND wb.build_number = (
386+
SELECT MAX(wb2.build_number)
387+
FROM workspace_builds wb2
388+
WHERE wb2.workspace_id = w.id
389+
)
390+
AND workspace_agents.deleted = FALSE;

coderd/database/queries/workspaces.sql

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -983,3 +983,23 @@ WHERE
983983
AND fsb.initiator_id != 'c42fdf75-3097-471c-8c33-fb52454d81c0'::uuid
984984
GROUP BY t.name, COALESCE(tvp.name, ''), o.name
985985
ORDER BY t.name, preset_name, o.name;
986+
987+
-- name: GetWorkspacesForWorkspaceMetrics :many
988+
SELECT
989+
u.username as owner_username,
990+
t.name as template_name,
991+
tv.name as template_version_name,
992+
pj.job_status as latest_build_status,
993+
wb.transition as latest_build_transition
994+
FROM workspaces w
995+
JOIN users u ON w.owner_id = u.id
996+
JOIN templates t ON w.template_id = t.id
997+
JOIN workspace_builds wb ON w.id = wb.workspace_id
998+
JOIN provisioner_jobs pj ON wb.job_id = pj.id
999+
LEFT JOIN template_versions tv ON wb.template_version_id = tv.id
1000+
WHERE w.deleted = false
1001+
AND wb.build_number = (
1002+
SELECT MAX(wb2.build_number)
1003+
FROM workspace_builds wb2
1004+
WHERE wb2.workspace_id = w.id
1005+
);

0 commit comments

Comments
 (0)