mirror of
https://github.com/coder/coder.git
synced 2025-07-12 00:14:10 +00:00
feat: track resource replacements when claiming a prebuilt workspace (#17571)
Closes https://github.com/coder/internal/issues/369 We can't know whether a replacement (i.e. drift of terraform state leading to a resource needing to be deleted/recreated) will take place apriori; we can only detect it at `plan` time, because the provider decides whether a resource must be replaced and it cannot be inferred through static analysis of the template. **This is likely to be the most common gotcha with using prebuilds, since it requires a slight template modification to use prebuilds effectively**, so let's head this off before it's an issue for customers. Drift details will now be logged in the workspace build logs:  Plus a notification will be sent to template admins when this situation arises:  A new metric - `coderd_prebuilt_workspaces_resource_replacements_total` - will also increment each time a workspace encounters replacements. We only track _that_ a resource replacement occurred, not how many. Just one is enough to ruin a prebuild, but we can't know apriori which replacement would cause this. For example, say we have 2 replacements: a `docker_container` and a `null_resource`; we don't know which one might cause an issue (or indeed if either would), so we just track the replacement. --------- Signed-off-by: Danny Kopping <dannykopping@gmail.com>
This commit is contained in:
131
coderd/notifications/testdata/rendered-templates/smtp/TemplateWorkspaceResourceReplaced.html.golden
vendored
Normal file
131
coderd/notifications/testdata/rendered-templates/smtp/TemplateWorkspaceResourceReplaced.html.golden
vendored
Normal file
@ -0,0 +1,131 @@
|
||||
From: system@coder.com
|
||||
To: bobby@coder.com
|
||||
Subject: There might be a problem with a recently claimed prebuilt workspace
|
||||
Message-Id: 02ee4935-73be-4fa1-a290-ff9999026b13@blush-whale-48
|
||||
Date: Fri, 11 Oct 2024 09:03:06 +0000
|
||||
Content-Type: multipart/alternative; boundary=bbe61b741255b6098bb6b3c1f41b885773df633cb18d2a3002b68e4bc9c4
|
||||
MIME-Version: 1.0
|
||||
|
||||
--bbe61b741255b6098bb6b3c1f41b885773df633cb18d2a3002b68e4bc9c4
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
|
||||
Hi Bobby,
|
||||
|
||||
Workspace my-workspace was claimed from a prebuilt workspace by prebuilds-c=
|
||||
laimer.
|
||||
|
||||
During the claim, Terraform destroyed and recreated the following resources
|
||||
because one or more immutable attributes changed:
|
||||
|
||||
docker_container[0] was replaced due to changes to env, hostname
|
||||
|
||||
When Terraform must change an immutable attribute, it replaces the entire r=
|
||||
esource.
|
||||
If you=E2=80=99re using prebuilds to speed up provisioning, unexpected repl=
|
||||
acements will slow down
|
||||
workspace startup=E2=80=94even when claiming a prebuilt environment.
|
||||
|
||||
For tips on preventing replacements and improving claim performance, see th=
|
||||
is guide (https://coder.com/docs/admin/templates/extending-templates/prebui=
|
||||
lt-workspaces#preventing-resource-replacement).
|
||||
|
||||
NOTE: this prebuilt workspace used the particle-accelerator preset.
|
||||
|
||||
|
||||
View workspace build: http://test.com/@prebuilds-claimer/my-workspace/build=
|
||||
s/2
|
||||
|
||||
View template version: http://test.com/templates/cern/docker/versions/angry=
|
||||
_torvalds
|
||||
|
||||
--bbe61b741255b6098bb6b3c1f41b885773df633cb18d2a3002b68e4bc9c4
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
Content-Type: text/html; charset=UTF-8
|
||||
|
||||
<!doctype html>
|
||||
<html lang=3D"en">
|
||||
<head>
|
||||
<meta charset=3D"UTF-8" />
|
||||
<meta name=3D"viewport" content=3D"width=3Ddevice-width, initial-scale=
|
||||
=3D1.0" />
|
||||
<title>There might be a problem with a recently claimed prebuilt worksp=
|
||||
ace</title>
|
||||
</head>
|
||||
<body style=3D"margin: 0; padding: 0; font-family: -apple-system, system-=
|
||||
ui, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarel=
|
||||
l', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif; color: #020617=
|
||||
; background: #f8fafc;">
|
||||
<div style=3D"max-width: 600px; margin: 20px auto; padding: 60px; borde=
|
||||
r: 1px solid #e2e8f0; border-radius: 8px; background-color: #fff; text-alig=
|
||||
n: left; font-size: 14px; line-height: 1.5;">
|
||||
<div style=3D"text-align: center;">
|
||||
<img src=3D"https://coder.com/coder-logo-horizontal.png" alt=3D"Cod=
|
||||
er Logo" style=3D"height: 40px;" />
|
||||
</div>
|
||||
<h1 style=3D"text-align: center; font-size: 24px; font-weight: 400; m=
|
||||
argin: 8px 0 32px; line-height: 1.5;">
|
||||
There might be a problem with a recently claimed prebuilt workspace
|
||||
</h1>
|
||||
<div style=3D"line-height: 1.5;">
|
||||
<p>Hi Bobby,</p>
|
||||
<p>Workspace <strong>my-workspace</strong> was claimed from a prebu=
|
||||
ilt workspace by <strong>prebuilds-claimer</strong>.</p>
|
||||
|
||||
<p>During the claim, Terraform destroyed and recreated the following resour=
|
||||
ces<br>
|
||||
because one or more immutable attributes changed:</p>
|
||||
|
||||
<ul>
|
||||
<li>_docker<em>container[0]</em> was replaced due to changes to <em>env, h=
|
||||
ostname</em><br>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>When Terraform must change an immutable attribute, it replaces the entir=
|
||||
e resource.<br>
|
||||
If you=E2=80=99re using prebuilds to speed up provisioning, unexpected repl=
|
||||
acements will slow down<br>
|
||||
workspace startup=E2=80=94even when claiming a prebuilt environment.</p>
|
||||
|
||||
<p>For tips on preventing replacements and improving claim performance, see=
|
||||
<a href=3D"https://coder.com/docs/admin/templates/extending-templates/preb=
|
||||
uilt-workspaces#preventing-resource-replacement">this guide</a>.</p>
|
||||
|
||||
<p>NOTE: this prebuilt workspace used the <strong>particle-accelerator</str=
|
||||
ong> preset.</p>
|
||||
</div>
|
||||
<div style=3D"text-align: center; margin-top: 32px;">
|
||||
=20
|
||||
<a href=3D"http://test.com/@prebuilds-claimer/my-workspace/builds/2=
|
||||
" style=3D"display: inline-block; padding: 13px 24px; background-color: #02=
|
||||
0617; color: #f8fafc; text-decoration: none; border-radius: 8px; margin: 0 =
|
||||
4px;">
|
||||
View workspace build
|
||||
</a>
|
||||
=20
|
||||
<a href=3D"http://test.com/templates/cern/docker/versions/angry_tor=
|
||||
valds" style=3D"display: inline-block; padding: 13px 24px; background-color=
|
||||
: #020617; color: #f8fafc; text-decoration: none; border-radius: 8px; margi=
|
||||
n: 0 4px;">
|
||||
View template version
|
||||
</a>
|
||||
=20
|
||||
</div>
|
||||
<div style=3D"border-top: 1px solid #e2e8f0; color: #475569; font-siz=
|
||||
e: 12px; margin-top: 64px; padding-top: 24px; line-height: 1.6;">
|
||||
<p>© 2024 Coder. All rights reserved - <a =
|
||||
href=3D"http://test.com" style=3D"color: #2563eb; text-decoration: none;">h=
|
||||
ttp://test.com</a></p>
|
||||
<p><a href=3D"http://test.com/settings/notifications" style=3D"colo=
|
||||
r: #2563eb; text-decoration: none;">Click here to manage your notification =
|
||||
settings</a></p>
|
||||
<p><a href=3D"http://test.com/settings/notifications?disabled=3D89d=
|
||||
9745a-816e-4695-a17f-3d0a229e2b8d" style=3D"color: #2563eb; text-decoration=
|
||||
: none;">Stop receiving emails like this</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
--bbe61b741255b6098bb6b3c1f41b885773df633cb18d2a3002b68e4bc9c4--
|
@ -0,0 +1,42 @@
|
||||
{
|
||||
"_version": "1.1",
|
||||
"msg_id": "00000000-0000-0000-0000-000000000000",
|
||||
"payload": {
|
||||
"_version": "1.2",
|
||||
"notification_name": "Prebuilt Workspace Resource Replaced",
|
||||
"notification_template_id": "00000000-0000-0000-0000-000000000000",
|
||||
"user_id": "00000000-0000-0000-0000-000000000000",
|
||||
"user_email": "bobby@coder.com",
|
||||
"user_name": "Bobby",
|
||||
"user_username": "bobby",
|
||||
"actions": [
|
||||
{
|
||||
"label": "View workspace build",
|
||||
"url": "http://test.com/@prebuilds-claimer/my-workspace/builds/2"
|
||||
},
|
||||
{
|
||||
"label": "View template version",
|
||||
"url": "http://test.com/templates/cern/docker/versions/angry_torvalds"
|
||||
}
|
||||
],
|
||||
"labels": {
|
||||
"claimant": "prebuilds-claimer",
|
||||
"org": "cern",
|
||||
"preset": "particle-accelerator",
|
||||
"template": "docker",
|
||||
"template_version": "angry_torvalds",
|
||||
"workspace": "my-workspace",
|
||||
"workspace_build_num": "2"
|
||||
},
|
||||
"data": {
|
||||
"replacements": {
|
||||
"docker_container[0]": "env, hostname"
|
||||
}
|
||||
},
|
||||
"targets": null
|
||||
},
|
||||
"title": "There might be a problem with a recently claimed prebuilt workspace",
|
||||
"title_markdown": "There might be a problem with a recently claimed prebuilt workspace",
|
||||
"body": "Workspace my-workspace was claimed from a prebuilt workspace by prebuilds-claimer.\n\nDuring the claim, Terraform destroyed and recreated the following resources\nbecause one or more immutable attributes changed:\n\ndocker_container[0] was replaced due to changes to env, hostname\n\nWhen Terraform must change an immutable attribute, it replaces the entire resource.\nIf you’re using prebuilds to speed up provisioning, unexpected replacements will slow down\nworkspace startup—even when claiming a prebuilt environment.\n\nFor tips on preventing replacements and improving claim performance, see this guide (https://coder.com/docs/admin/templates/extending-templates/prebuilt-workspaces#preventing-resource-replacement).\n\nNOTE: this prebuilt workspace used the particle-accelerator preset.",
|
||||
"body_markdown": "\nWorkspace **my-workspace** was claimed from a prebuilt workspace by **prebuilds-claimer**.\n\nDuring the claim, Terraform destroyed and recreated the following resources\nbecause one or more immutable attributes changed:\n\n- _docker_container[0]_ was replaced due to changes to _env, hostname_\n\n\nWhen Terraform must change an immutable attribute, it replaces the entire resource.\nIf you’re using prebuilds to speed up provisioning, unexpected replacements will slow down\nworkspace startup—even when claiming a prebuilt environment.\n\nFor tips on preventing replacements and improving claim performance, see [this guide](https://coder.com/docs/admin/templates/extending-templates/prebuilt-workspaces#preventing-resource-replacement).\n\nNOTE: this prebuilt workspace used the **particle-accelerator** preset.\n"
|
||||
}
|
Reference in New Issue
Block a user