Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 50260c3

Browse files
committed
Add workspace counts to deployment stats
1 parent 93f013b commit 50260c3

File tree

22 files changed

+772
-71
lines changed

22 files changed

+772
-71
lines changed

coderd/apidoc/docs.go

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

coderd/apidoc/swagger.json

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

coderd/database/dbauthz/system.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,10 @@ func (q *querier) GetDeploymentWorkspaceAgentStats(ctx context.Context, createdA
205205
return q.db.GetDeploymentWorkspaceAgentStats(ctx, createdAfter)
206206
}
207207

208+
func (q *querier) GetDeploymentWorkspaceStats(ctx context.Context) (database.GetDeploymentWorkspaceStatsRow, error) {
209+
return q.db.GetDeploymentWorkspaceStats(ctx)
210+
}
211+
208212
func (q *querier) GetParameterSchemasCreatedAfter(ctx context.Context, createdAt time.Time) ([]database.ParameterSchema, error) {
209213
return q.db.GetParameterSchemasCreatedAfter(ctx, createdAt)
210214
}

coderd/database/dbfake/databasefake.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3547,6 +3547,50 @@ func (q *fakeQuerier) UpdateWorkspaceLastUsedAt(_ context.Context, arg database.
35473547
return sql.ErrNoRows
35483548
}
35493549

3550+
func (q *fakeQuerier) GetDeploymentWorkspaceStats(ctx context.Context) (database.GetDeploymentWorkspaceStatsRow, error) {
3551+
q.mutex.RLock()
3552+
defer q.mutex.RUnlock()
3553+
3554+
stat := database.GetDeploymentWorkspaceStatsRow{}
3555+
for _, workspace := range q.workspaces {
3556+
build, err := q.GetLatestWorkspaceBuildByWorkspaceID(ctx, workspace.ID)
3557+
if err != nil {
3558+
return stat, err
3559+
}
3560+
job, err := q.getProvisionerJobByIDNoLock(ctx, build.JobID)
3561+
if err != nil {
3562+
return stat, err
3563+
}
3564+
if !job.StartedAt.Valid {
3565+
stat.PendingWorkspaces++
3566+
continue
3567+
}
3568+
if job.StartedAt.Valid &&
3569+
!job.CanceledAt.Valid &&
3570+
time.Since(job.UpdatedAt) <= 30*time.Second &&
3571+
!job.CompletedAt.Valid {
3572+
stat.BuildingWorkspaces++
3573+
continue
3574+
}
3575+
if job.CompletedAt.Valid &&
3576+
!job.CanceledAt.Valid &&
3577+
!job.Error.Valid {
3578+
if build.Transition == database.WorkspaceTransitionStart {
3579+
stat.RunningWorkspaces++
3580+
}
3581+
if build.Transition == database.WorkspaceTransitionStop {
3582+
stat.StoppedWorkspaces++
3583+
}
3584+
continue
3585+
}
3586+
if job.CanceledAt.Valid || job.Error.Valid {
3587+
stat.FailedWorkspaces++
3588+
continue
3589+
}
3590+
}
3591+
return stat, nil
3592+
}
3593+
35503594
func (q *fakeQuerier) UpdateWorkspaceBuildByID(_ context.Context, arg database.UpdateWorkspaceBuildByIDParams) (database.WorkspaceBuild, error) {
35513595
if err := validateDatabaseType(arg); err != nil {
35523596
return database.WorkspaceBuild{}, err

coderd/database/querier.go

Lines changed: 1 addition & 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: 84 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/workspaces.sql

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,3 +316,65 @@ SET
316316
last_used_at = $2
317317
WHERE
318318
id = $1;
319+
320+
-- name: GetDeploymentWorkspaceStats :one
321+
WITH workspaces_with_jobs AS (
322+
SELECT
323+
latest_build.* FROM workspaces
324+
LEFT JOIN LATERAL (
325+
SELECT
326+
workspace_builds.transition,
327+
provisioner_jobs.id AS provisioner_job_id,
328+
provisioner_jobs.started_at,
329+
provisioner_jobs.updated_at,
330+
provisioner_jobs.canceled_at,
331+
provisioner_jobs.completed_at,
332+
provisioner_jobs.error
333+
FROM
334+
workspace_builds
335+
LEFT JOIN
336+
provisioner_jobs
337+
ON
338+
provisioner_jobs.id = workspace_builds.job_id
339+
WHERE
340+
workspace_builds.workspace_id = workspaces.id
341+
ORDER BY
342+
build_number DESC
343+
LIMIT
344+
1
345+
) latest_build ON TRUE
346+
), pending_workspaces AS (
347+
SELECT COUNT(*) AS count FROM workspaces_with_jobs WHERE
348+
started_at IS NULL
349+
), building_workspaces AS (
350+
SELECT COUNT(*) AS count FROM workspaces_with_jobs WHERE
351+
started_at IS NOT NULL AND
352+
canceled_at IS NULL AND
353+
updated_at - INTERVAL '30 seconds' < NOW() AND
354+
completed_at IS NULL
355+
), running_workspaces AS (
356+
SELECT COUNT(*) AS count FROM workspaces_with_jobs WHERE
357+
completed_at IS NOT NULL AND
358+
canceled_at IS NULL AND
359+
error IS NULL AND
360+
transition = 'start'::workspace_transition
361+
), failed_workspaces AS (
362+
SELECT COUNT(*) AS count FROM workspaces_with_jobs WHERE
363+
(canceled_at IS NOT NULL AND
364+
error IS NOT NULL) OR
365+
(completed_at IS NOT NULL AND
366+
error IS NOT NULL)
367+
), stopped_workspaces AS (
368+
SELECT COUNT(*) AS count FROM workspaces_with_jobs WHERE
369+
completed_at IS NOT NULL AND
370+
canceled_at IS NULL AND
371+
error IS NULL AND
372+
transition = 'stop'::workspace_transition
373+
)
374+
SELECT
375+
pending_workspaces.count AS pending_workspaces,
376+
building_workspaces.count AS building_workspaces,
377+
running_workspaces.count AS running_workspaces,
378+
failed_workspaces.count AS failed_workspaces,
379+
stopped_workspaces.count AS stopped_workspaces
380+
FROM pending_workspaces, building_workspaces, running_workspaces, failed_workspaces, stopped_workspaces;

coderd/metricscache/metricscache.go

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,11 @@ func (c *Cache) refreshTemplateDAUs(ctx context.Context) error {
224224

225225
func (c *Cache) refreshDeploymentStats(ctx context.Context) error {
226226
from := database.Now().Add(-15 * time.Minute)
227-
deploymentStats, err := c.database.GetDeploymentWorkspaceAgentStats(ctx, from)
227+
agentStats, err := c.database.GetDeploymentWorkspaceAgentStats(ctx, from)
228+
if err != nil {
229+
return err
230+
}
231+
workspaceStats, err := c.database.GetDeploymentWorkspaceStats(ctx)
228232
if err != nil {
229233
return err
230234
}
@@ -233,15 +237,21 @@ func (c *Cache) refreshDeploymentStats(ctx context.Context) error {
233237
CollectedAt: database.Now(),
234238
RefreshingAt: database.Now().Add(c.intervals.DeploymentStats),
235239
WorkspaceConnectionLatencyMS: codersdk.WorkspaceConnectionLatencyMS{
236-
P50: deploymentStats.WorkspaceConnectionLatency50,
237-
P95: deploymentStats.WorkspaceConnectionLatency95,
240+
P50: agentStats.WorkspaceConnectionLatency50,
241+
P95: agentStats.WorkspaceConnectionLatency95,
238242
},
239-
SessionCountVSCode: deploymentStats.SessionCountVSCode,
240-
SessionCountSSH: deploymentStats.SessionCountSSH,
241-
SessionCountJetBrains: deploymentStats.SessionCountJetBrains,
242-
SessionCountReconnectingPTY: deploymentStats.SessionCountReconnectingPTY,
243-
WorkspaceRxBytes: deploymentStats.WorkspaceRxBytes,
244-
WorkspaceTxBytes: deploymentStats.WorkspaceTxBytes,
243+
SessionCountVSCode: agentStats.SessionCountVSCode,
244+
SessionCountSSH: agentStats.SessionCountSSH,
245+
SessionCountJetBrains: agentStats.SessionCountJetBrains,
246+
SessionCountReconnectingPTY: agentStats.SessionCountReconnectingPTY,
247+
WorkspaceRxBytes: agentStats.WorkspaceRxBytes,
248+
WorkspaceTxBytes: agentStats.WorkspaceTxBytes,
249+
250+
PendingWorkspaces: workspaceStats.PendingWorkspaces,
251+
BuildingWorkspaces: workspaceStats.BuildingWorkspaces,
252+
RunningWorkspaces: workspaceStats.RunningWorkspaces,
253+
FailedWorkspaces: workspaceStats.FailedWorkspaces,
254+
StoppedWorkspaces: workspaceStats.StoppedWorkspaces,
245255
})
246256
return nil
247257
}

codersdk/deployment.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,12 @@ type DeploymentStats struct {
559559
// be refreshed.
560560
RefreshingAt time.Time `json:"refreshing_at"`
561561

562-
WorkspacesByTransition map[WorkspaceTransition]int `json:"workspaces_by_transition"`
562+
PendingWorkspaces int64 `json:"pending_workspaces"`
563+
BuildingWorkspaces int64 `json:"building_workspaces"`
564+
RunningWorkspaces int64 `json:"running_workspaces"`
565+
FailedWorkspaces int64 `json:"failed_workspaces"`
566+
StoppedWorkspaces int64 `json:"stopped_workspaces"`
567+
563568
WorkspaceConnectionLatencyMS WorkspaceConnectionLatencyMS `json:"workspace_connection_latency_ms"`
564569

565570
SessionCountVSCode int64 `json:"session_count_vscode"`

0 commit comments

Comments
 (0)