diff --git a/components/server/ee/src/prebuilds/prebuild-manager.ts b/components/server/ee/src/prebuilds/prebuild-manager.ts index d57c43050ca81d..f0d79ed07b5acb 100644 --- a/components/server/ee/src/prebuilds/prebuild-manager.ts +++ b/components/server/ee/src/prebuilds/prebuild-manager.ts @@ -72,13 +72,14 @@ export class PrebuildManager { for (const instance of prebuild.instances) { log.info( { userId: user.id, instanceId: instance.id, workspaceId: instance.workspaceId }, - "Aborting Prebuild workspace because a newer commit was pushed to the same branch.", + "Cancelling Prebuild workspace because a newer commit was pushed to the same branch.", ); results.push( this.workspaceStarter.stopWorkspaceInstance( { span }, instance.id, instance.region, + "prebuild cancelled because a newer commit was pushed to the same branch", StopWorkspacePolicy.ABORT, ), ); diff --git a/components/server/ee/src/workspace/gitpod-server-impl.ts b/components/server/ee/src/workspace/gitpod-server-impl.ts index fb1170761194a6..9fbc36ad2880c0 100644 --- a/components/server/ee/src/workspace/gitpod-server-impl.ts +++ b/components/server/ee/src/workspace/gitpod-server-impl.ts @@ -634,6 +634,7 @@ export class GitpodServerEEImpl extends GitpodServerImpl { ctx, instance.id, instance.region, + "user blocked by admin", StopWorkspacePolicy.IMMEDIATELY, ), ); @@ -867,7 +868,7 @@ export class GitpodServerEEImpl extends GitpodServerImpl { const workspace = await this.workspaceDb.trace(ctx).findById(workspaceId); if (workspace) { - await this.internalStopWorkspace(ctx, workspace, StopWorkspacePolicy.IMMEDIATELY, true); + await this.internalStopWorkspace(ctx, workspace, "stopped by admin", StopWorkspacePolicy.IMMEDIATELY, true); } } diff --git a/components/server/src/user/user-deletion-service.ts b/components/server/src/user/user-deletion-service.ts index d7d63513e93c6f..9645bde4e0ecab 100644 --- a/components/server/src/user/user-deletion-service.ts +++ b/components/server/src/user/user-deletion-service.ts @@ -113,6 +113,10 @@ export class UserDeletionService { runningWorkspaces.map(async (info) => { const wsi = info.latestInstance; + log.info({ workspaceId: info.workspace.id, instanceId: wsi.id }, "Stopping workspace instance", { + reason: "deleting user", + }); + const req = new StopWorkspaceRequest(); req.setId(wsi.id); req.setPolicy(StopWorkspacePolicy.NORMALLY); diff --git a/components/server/src/workspace/gitpod-server-impl.ts b/components/server/src/workspace/gitpod-server-impl.ts index 9f17326403a967..9477129682642b 100644 --- a/components/server/src/workspace/gitpod-server-impl.ts +++ b/components/server/src/workspace/gitpod-server-impl.ts @@ -748,7 +748,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable { await this.guardAccess({ kind: "workspace", subject: workspace }, "get"); } - this.internalStopWorkspace(ctx, workspace).catch((err) => { + this.internalStopWorkspace(ctx, workspace, "stopped via API").catch((err) => { log.error(logCtx, "stopWorkspace error: ", err); }); } @@ -756,6 +756,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable { protected async internalStopWorkspace( ctx: TraceContext, workspace: Workspace, + reason: string, policy?: StopWorkspacePolicy, admin: boolean = false, ): Promise { @@ -782,7 +783,8 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable { await this.guardAccess({ kind: "workspaceInstance", subject: instance, workspace }, "update"); } } - await this.workspaceStarter.stopWorkspaceInstance(ctx, instance.id, instance.region, policy); + + await this.workspaceStarter.stopWorkspaceInstance(ctx, instance.id, instance.region, reason, policy); } protected async guardAdminAccess(method: string, params: any, requiredPermission: PermissionName) { @@ -834,7 +836,7 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable { await this.guardAccess({ kind: "workspace", subject: ws }, "delete"); // for good measure, try and stop running instances - await this.internalStopWorkspace(ctx, ws); + await this.internalStopWorkspace(ctx, ws, "deleted via API"); // actually delete the workspace await this.workspaceDeletionService.softDeleteWorkspace(ctx, ws, "user"); diff --git a/components/server/src/workspace/workspace-starter.ts b/components/server/src/workspace/workspace-starter.ts index 817dd08e405909..f9b799afeea273 100644 --- a/components/server/src/workspace/workspace-starter.ts +++ b/components/server/src/workspace/workspace-starter.ts @@ -439,8 +439,12 @@ export class WorkspaceStarter { ctx: TraceContext, instanceId: string, instanceRegion: string, + reason: string, policy?: StopWorkspacePolicy, ): Promise { + ctx.span?.setTag("stopWorkspaceReason", reason); + log.info({ instanceId }, "Stopping workspace instance", { reason }); + const req = new StopWorkspaceRequest(); req.setId(instanceId); req.setPolicy(policy || StopWorkspacePolicy.NORMALLY);