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

feat: implement autoscaling mechanism for prebuilds#18126

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.

Already on GitHub?Sign in to your account

Open
evgeniy-scherbina wants to merge6 commits intomain
base:main
Choose a base branch
Loading
fromyevhenii/prebuilds-autoscaling-mechanism

Conversation

evgeniy-scherbina
Copy link
Contributor

@evgeniy-scherbinaevgeniy-scherbina commentedMay 30, 2025
edited
Loading

Closescoder/internal#312
Depends oncoder/terraform-provider-coder#408

This PR adds support for defining anautoscaling block for prebuilds, allowing number of desired instances to scale dynamically based on a schedule.

Example usage:

data "coder_workspace_preset" "us-nix" {  ...    prebuilds = {    instances = 0                  # default to 0 instances        autoscaling = {      timezone = "UTC"             # a single timezone is used for simplicity            # Scale to 3 instances during the work week      schedule {        cron = "* 8-18 * * 1-5"    # from 8AM–6:59PM, Mon–Fri, UTC        instances = 3              # scale to 3 instances      }            # Scale to 1 instance on Saturdays for urgent support queries      schedule {        cron = "* 8-14 * * 6"      # from 8AM–2:59PM, Sat, UTC        instances = 1              # scale to 1 instance      }    }  }}

Behavior

  • Multipleschedule blocks perprebuilds block are supported.
  • If the current time matches any defined autoscaling schedule, the corresponding number of instances is used.
  • If no schedule matches, thedefault instance count (prebuilds.instances) is used as a fallback.

Why

This feature allows prebuild instance capacity to adapt to predictable usage patterns, such as:

  • Scaling up during business hours or high-demand periods
  • Reducing capacity during off-hours to save resources

Cron specification

The cron specification is interpreted as acontinuous time range.

For example, the expression:

* 9-18 * * 1-5

is intended to represent a continuous range from09:00 to 18:59, Monday through Friday.

However, due to minor implementation imprecision, it is currently interpreted as a range from08:59:00 to 18:58:59, Monday through Friday.

This slight discrepancy arises because the evaluation is based on whether a specificpoint in time falls within the range, using thegithub.com/coder/coder/v2/coderd/schedule/cron library, which performs per-minute matching rather than strict range evaluation.

@evgeniy-scherbinaevgeniy-scherbinaforce-pushed theyevhenii/prebuilds-autoscaling-mechanism branch from606894f toff0e813CompareMay 30, 2025 12:25
@evgeniy-scherbinaevgeniy-scherbina changed the titleImplement autoscaling mechanism for prebuildsfeat: implement autoscaling mechanism for prebuildsMay 30, 2025
@evgeniy-scherbinaevgeniy-scherbinaforce-pushed theyevhenii/prebuilds-autoscaling-mechanism branch 5 times, most recently from9af5e02 tobcfbb04CompareJune 6, 2025 19:53
@evgeniy-scherbinaevgeniy-scherbinaforce-pushed theyevhenii/prebuilds-autoscaling-mechanism branch 4 times, most recently from3a25178 toe0d1de7CompareJune 11, 2025 19:05
})
require.NoError(t, err, "insert preset")
return preset
}

func PresetPrebuildSchedule(t testing.TB, db database.Store, seed database.InsertPresetPrebuildScheduleParams) database.TemplateVersionPresetPrebuildSchedule {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Typicallydbgen help funcs define default values whenseed is a zero value. Can you add those please?

CronExpression: seed.CronExpression,
Instances: seed.Instances,
})
require.NoError(t, err, "insert preset")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Suggested change
require.NoError(t,err,"insert preset")
require.NoError(t,err,"insert preset prebuild schedule")

@@ -0,0 +1,12 @@
-- Add autoscaling_timezone column to template_version_presets table
ALTER TABLE template_version_presets
ADD COLUMN autoscaling_timezone TEXT DEFAULT 'UTC' NOT NULL;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Why do we need a default here, if the provider is not defining a default?

id UUID PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
preset_id UUID NOT NULL,
cron_expression TEXT NOT NULL,
instances INTEGER NOT NULL,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Nit: to matchtemplate_version_presets' definition.

Suggested change
instancesINTEGERNOT NULL,
desired_instancesINTEGERNOT NULL,

@@ -69,3 +83,6 @@ SELECT tvp.*, tv.template_id, tv.organization_id FROM
template_version_presets tvp
INNER JOIN template_versions tv ON tvp.template_version_id = tv.id
WHERE tvp.id = @preset_id;

-- name: GetPresetPrebuildSchedules :many
SELECT * FROM template_version_preset_prebuild_schedules;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Don't we want to constrain this to schedules that areonly associated to active template versions?

}

// Look for a schedule whose cron expression matches the provided time
for _, schedule := range p.PrebuildSchedules {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

This is my main reason for blocking this review. We have to deal with conflicting schedules here, explicitly.

If we take this current approach, and conflicting schedules are evaluated in different orders on each reconciliation loop, then that will cause a lot of churn by spinning up and down prebuilds if those schedules' instance counts differ.

Comment on lines 1069 to 1070
spec: "* 9-18 * * 1-5",
at: mustParseTime(t, time.RFC1123, "Mon, 02 Jun 2025 8:59:00 UTC"),
Copy link
Contributor

@dannykoppingdannykoppingJun 13, 2025
edited
Loading

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

This would violate my expectations as an operator. If the autoscaling schedule is going to kick in 1m before my given cron expression, that would be quite surprising and unintuitive.

I think we should try address this shortcoming if we can.
Edit: I looked into the implementation and made some suggestions.

This test could also be more explicit about why8:59:00 matches9-18.

Comment on lines +533 to +534

//replace github.com/coder/terraform-provider-coder/v2 => /home/coder/terraform-provider-coder
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Suggested change
//replacegithub.com/coder/terraform-provider-coder/v2=>/home/coder/terraform-provider-coder

@@ -101,7 +101,8 @@ require (
github.com/coder/quartz v0.2.1
github.com/coder/retry v1.5.1
github.com/coder/serpent v0.10.0
github.com/coder/terraform-provider-coder/v2 v2.5.3
// TODO: release new provider version and set it here
github.com/coder/terraform-provider-coder/v2 v2.5.4-0.20250611180058-d61894db8492
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others.Learn more.

Remember TODO.

@spikecurtis
Copy link
Contributor

The "continuous time" interpretation of the crontab makes it, I guess, relatively simple to specify spans that start and end on the hour, but consider attempting to program a span like 7:45am - 9:10am. You'd need 3 spans

45-59 7 * * 1-5
* 8 * * 1-5
0-10 9 * * 1-5

Are we just kind of assuming that operators likely only want hourly precision?

Sign up for freeto join this conversation on GitHub. Already have an account?Sign in to comment
Reviewers

@dannykoppingdannykoppingdannykopping requested changes

@spikecurtisspikecurtisAwaiting requested review from spikecurtisspikecurtis is a code owner

@johnstcnjohnstcnAwaiting requested review from johnstcnjohnstcn is a code owner

Requested changes must be addressed to merge this pull request.

Labels
None yet
Projects
None yet
Milestone
No milestone
Development

Successfully merging this pull request may close these issues.

coderd: implement autoscaling mechanism
3 participants
@evgeniy-scherbina@spikecurtis@dannykopping

[8]ページ先頭

©2009-2025 Movatter.jp