mirror of
https://github.com/coder/coder.git
synced 2025-07-15 22:20:27 +00:00
Add template build time stats (#4557)
- Expose time in Template pages - Show progress bar when building a workspace
This commit is contained in:
@ -235,6 +235,35 @@ func (q *fakeQuerier) GetTemplateDAUs(_ context.Context, templateID uuid.UUID) (
|
||||
return rs, nil
|
||||
}
|
||||
|
||||
func (q *fakeQuerier) GetTemplateAverageBuildTime(ctx context.Context, arg database.GetTemplateAverageBuildTimeParams) (float64, error) {
|
||||
var times []float64
|
||||
for _, wb := range q.workspaceBuilds {
|
||||
if wb.Transition != database.WorkspaceTransitionStart {
|
||||
continue
|
||||
}
|
||||
version, err := q.GetTemplateVersionByID(ctx, wb.TemplateVersionID)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
if version.TemplateID != arg.TemplateID {
|
||||
continue
|
||||
}
|
||||
|
||||
job, err := q.GetProvisionerJobByID(ctx, wb.JobID)
|
||||
if err != nil {
|
||||
return -1, err
|
||||
}
|
||||
if job.CompletedAt.Valid {
|
||||
times = append(times, job.CompletedAt.Time.Sub(job.StartedAt.Time).Seconds())
|
||||
}
|
||||
}
|
||||
sort.Float64s(times)
|
||||
if len(times) == 0 {
|
||||
return -1, nil
|
||||
}
|
||||
return times[len(times)/2], nil
|
||||
}
|
||||
|
||||
func (q *fakeQuerier) ParameterValue(_ context.Context, id uuid.UUID) (database.ParameterValue, error) {
|
||||
q.mutex.Lock()
|
||||
defer q.mutex.Unlock()
|
||||
|
@ -67,6 +67,7 @@ type sqlcQuerier interface {
|
||||
GetProvisionerJobsByIDs(ctx context.Context, ids []uuid.UUID) ([]ProvisionerJob, error)
|
||||
GetProvisionerJobsCreatedAfter(ctx context.Context, createdAt time.Time) ([]ProvisionerJob, error)
|
||||
GetProvisionerLogsByIDBetween(ctx context.Context, arg GetProvisionerLogsByIDBetweenParams) ([]ProvisionerJobLog, error)
|
||||
GetTemplateAverageBuildTime(ctx context.Context, arg GetTemplateAverageBuildTimeParams) (float64, error)
|
||||
GetTemplateByID(ctx context.Context, id uuid.UUID) (Template, error)
|
||||
GetTemplateByOrganizationAndName(ctx context.Context, arg GetTemplateByOrganizationAndNameParams) (Template, error)
|
||||
GetTemplateDAUs(ctx context.Context, templateID uuid.UUID) ([]GetTemplateDAUsRow, error)
|
||||
|
@ -2597,6 +2597,42 @@ func (q *sqlQuerier) InsertDeploymentID(ctx context.Context, value string) error
|
||||
return err
|
||||
}
|
||||
|
||||
const getTemplateAverageBuildTime = `-- name: GetTemplateAverageBuildTime :one
|
||||
WITH build_times AS (
|
||||
SELECT
|
||||
EXTRACT(EPOCH FROM (pj.completed_at - pj.started_at))::FLOAT AS exec_time_sec
|
||||
FROM
|
||||
workspace_builds
|
||||
JOIN template_versions ON
|
||||
workspace_builds.template_version_id = template_versions.id
|
||||
JOIN provisioner_jobs pj ON
|
||||
workspace_builds.job_id = pj.id
|
||||
WHERE
|
||||
template_versions.template_id = $1 AND
|
||||
(workspace_builds.transition = 'start') AND
|
||||
(pj.completed_at IS NOT NULL) AND (pj.started_at IS NOT NULL) AND
|
||||
(pj.started_at > $2) AND
|
||||
(pj.canceled_at IS NULL) AND
|
||||
((pj.error IS NULL) OR (pj.error = ''))
|
||||
ORDER BY
|
||||
workspace_builds.created_at DESC
|
||||
)
|
||||
SELECT coalesce((PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY exec_time_sec)), -1)::FLOAT
|
||||
FROM build_times
|
||||
`
|
||||
|
||||
type GetTemplateAverageBuildTimeParams struct {
|
||||
TemplateID uuid.NullUUID `db:"template_id" json:"template_id"`
|
||||
StartTime sql.NullTime `db:"start_time" json:"start_time"`
|
||||
}
|
||||
|
||||
func (q *sqlQuerier) GetTemplateAverageBuildTime(ctx context.Context, arg GetTemplateAverageBuildTimeParams) (float64, error) {
|
||||
row := q.db.QueryRowContext(ctx, getTemplateAverageBuildTime, arg.TemplateID, arg.StartTime)
|
||||
var column_1 float64
|
||||
err := row.Scan(&column_1)
|
||||
return column_1, err
|
||||
}
|
||||
|
||||
const getTemplateByID = `-- name: GetTemplateByID :one
|
||||
SELECT
|
||||
id, created_at, updated_at, organization_id, deleted, name, provisioner, active_version_id, description, max_ttl, min_autostart_interval, created_by, icon, user_acl, group_acl
|
||||
|
@ -105,3 +105,27 @@ WHERE
|
||||
id = $1
|
||||
RETURNING
|
||||
*;
|
||||
|
||||
-- name: GetTemplateAverageBuildTime :one
|
||||
WITH build_times AS (
|
||||
SELECT
|
||||
EXTRACT(EPOCH FROM (pj.completed_at - pj.started_at))::FLOAT AS exec_time_sec
|
||||
FROM
|
||||
workspace_builds
|
||||
JOIN template_versions ON
|
||||
workspace_builds.template_version_id = template_versions.id
|
||||
JOIN provisioner_jobs pj ON
|
||||
workspace_builds.job_id = pj.id
|
||||
WHERE
|
||||
template_versions.template_id = @template_id AND
|
||||
(workspace_builds.transition = 'start') AND
|
||||
(pj.completed_at IS NOT NULL) AND (pj.started_at IS NOT NULL) AND
|
||||
(pj.started_at > @start_time) AND
|
||||
(pj.canceled_at IS NULL) AND
|
||||
((pj.error IS NULL) OR (pj.error = ''))
|
||||
ORDER BY
|
||||
workspace_builds.created_at DESC
|
||||
)
|
||||
SELECT coalesce((PERCENTILE_DISC(0.5) WITHIN GROUP(ORDER BY exec_time_sec)), -1)::FLOAT
|
||||
FROM build_times
|
||||
;
|
||||
|
Reference in New Issue
Block a user