Skip to content

Commit ed1748a

Browse files
committed
Improve logging in the extension
1 parent c565edb commit ed1748a

File tree

6 files changed

+51
-16
lines changed

6 files changed

+51
-16
lines changed

src/commands.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ export class Commands {
8686
if (this.deploymentManager.isAuthenticated()) {
8787
return;
8888
}
89-
this.logger.info("Logging in");
89+
this.logger.debug("Logging in");
9090

9191
const currentDeployment = await this.secretsManager.getCurrentDeployment();
9292
const url = await maybeAskUrl(
@@ -205,7 +205,7 @@ export class Commands {
205205
return;
206206
}
207207

208-
this.logger.info("Logging out");
208+
this.logger.debug("Logging out");
209209

210210
await this.deploymentManager.clearDeployment();
211211

src/deployment/deploymentManager.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import { type Logger } from "../logging/logger";
77
import { type OAuthSessionManager } from "../oauth/sessionManager";
88
import { type WorkspaceProvider } from "../workspace/workspacesProvider";
99

10-
import { type Deployment, type DeploymentWithAuth } from "./types";
10+
import {
11+
DeploymentSchema,
12+
type Deployment,
13+
type DeploymentWithAuth,
14+
} from "./types";
1115

1216
import type { User } from "coder/site/src/api/typesGenerated";
1317
import type * as vscode from "vscode";
@@ -115,6 +119,10 @@ export class DeploymentManager implements vscode.Disposable {
115119
public async setDeployment(
116120
deployment: DeploymentWithAuth & { user: User },
117121
): Promise<void> {
122+
this.logger.debug("Setting deployment", {
123+
hostname: deployment.safeHostname,
124+
user: deployment.user.username,
125+
});
118126
this.#deployment = { ...deployment };
119127

120128
// Updates client credentials
@@ -131,14 +139,17 @@ export class DeploymentManager implements vscode.Disposable {
131139
this.updateAuthContexts(deployment.user);
132140
this.refreshWorkspaces();
133141

134-
await this.oauthSessionManager.setDeployment(deployment);
135-
await this.persistDeployment(deployment);
142+
const deploymentWithoutAuth: Deployment =
143+
DeploymentSchema.parse(deployment);
144+
await this.oauthSessionManager.setDeployment(deploymentWithoutAuth);
145+
await this.persistDeployment(deploymentWithoutAuth);
136146
}
137147

138148
/**
139149
* Clears the current deployment.
140150
*/
141151
public async clearDeployment(): Promise<void> {
152+
this.logger.debug("Clearing deployment", this.#deployment?.safeHostname);
142153
this.suspendSession();
143154
this.#authListenerDisposable?.dispose();
144155
this.#authListenerDisposable = undefined;

src/login/loginCoordinator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ export class LoginCoordinator implements vscode.Disposable {
367367
*/
368368
private async loginWithOAuth(deployment: Deployment): Promise<LoginResult> {
369369
try {
370-
this.logger.info("Starting OAuth authentication");
370+
this.logger.debug("Starting OAuth authentication");
371371

372372
const { tokenResponse, user } = await vscode.window.withProgress(
373373
{

src/oauth/authorizer.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export class OAuthAuthorizer implements vscode.Disposable {
9696
reportProgress("fetching user...", 20);
9797
const user = await client.getAuthenticatedUser();
9898

99-
this.logger.info("OAuth login flow completed successfully");
99+
this.logger.debug("OAuth login flow completed successfully");
100100

101101
return {
102102
tokenResponse,
@@ -157,7 +157,7 @@ export class OAuthAuthorizer implements vscode.Disposable {
157157
deployment.safeHostname,
158158
response.data,
159159
);
160-
this.logger.info(
160+
this.logger.debug(
161161
"Saved OAuth client registration:",
162162
response.data.client_id,
163163
);

src/oauth/sessionManager.ts

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -311,12 +311,15 @@ export class OAuthSessionManager implements vscode.Disposable {
311311
) {
312312
return;
313313
}
314-
this.logger.debug("Switching OAuth deployment", deployment);
315314
this.deployment = deployment;
316315
this.clearRefreshState();
317316

318-
// Block on refresh if token is expired to ensure valid state for callers
319317
const storedTokens = await this.getStoredTokens();
318+
if (storedTokens) {
319+
this.logger.debug("Switching OAuth deployment", deployment);
320+
}
321+
322+
// Block on refresh if token is expired to ensure valid state for callers
320323
if (storedTokens && Date.now() >= storedTokens.expiry_timestamp) {
321324
try {
322325
await this.refreshToken();
@@ -331,7 +334,6 @@ export class OAuthSessionManager implements vscode.Disposable {
331334
}
332335

333336
public clearDeployment(): void {
334-
this.logger.debug("Clearing OAuth deployment state");
335337
this.deployment = null;
336338
this.clearRefreshState();
337339
}
@@ -422,7 +424,7 @@ export class OAuthSessionManager implements vscode.Disposable {
422424
public async revokeRefreshToken(): Promise<void> {
423425
const storedTokens = await this.getStoredTokens();
424426
if (!storedTokens?.refresh_token) {
425-
this.logger.info("No refresh token to revoke");
427+
this.logger.debug("No refresh token to revoke");
426428
return;
427429
}
428430

@@ -449,11 +451,13 @@ export class OAuthSessionManager implements vscode.Disposable {
449451
await this.prepareOAuthOperation(authToken);
450452

451453
if (!metadata.revocation_endpoint) {
452-
this.logger.info("No revocation endpoint available, skipping revocation");
454+
this.logger.debug(
455+
"No revocation endpoint available, skipping revocation",
456+
);
453457
return;
454458
}
455459

456-
this.logger.info("Revoking refresh token");
460+
this.logger.debug("Revoking refresh token");
457461

458462
const params: OAuth2TokenRevocationRequest = {
459463
token: tokenToRevoke,
@@ -475,7 +479,7 @@ export class OAuthSessionManager implements vscode.Disposable {
475479
},
476480
);
477481

478-
this.logger.info("Token revocation successful");
482+
this.logger.debug("Token revocation successful");
479483
} catch (error) {
480484
this.logger.error("Token revocation failed:", error);
481485
throw error;
@@ -503,6 +507,5 @@ export class OAuthSessionManager implements vscode.Disposable {
503507
public dispose(): void {
504508
this.disposed = true;
505509
this.clearDeployment();
506-
this.logger.debug("OAuth session manager disposed");
507510
}
508511
}

src/remote/remote.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,12 @@ export class Remote {
101101
return;
102102
}
103103

104+
this.logger.debug("Setting up remote connection", {
105+
hostname: parts.safeHostname,
106+
workspace: `${parts.username}/${parts.workspace}`,
107+
agent: parts.agent || "(default)",
108+
});
109+
104110
const workspaceName = `${parts.username}/${parts.workspace}`;
105111

106112
// Migrate existing legacy file-based auth to secrets storage.
@@ -110,6 +116,11 @@ export class Remote {
110116
const auth = await this.secretsManager.getSessionAuth(parts.safeHostname);
111117
const baseUrlRaw = auth?.url ?? "";
112118
const token = auth?.token;
119+
this.logger.debug("Retrieved auth for hostname", {
120+
hostname: parts.safeHostname,
121+
hasUrl: Boolean(baseUrlRaw),
122+
hasToken: token !== undefined,
123+
});
113124
// Empty token is valid for mTLS
114125
if (baseUrlRaw && token !== undefined) {
115126
await this.cliManager.configure(parts.safeHostname, baseUrlRaw, token);
@@ -343,6 +354,10 @@ export class Remote {
343354
);
344355

345356
// Wait for workspace to be running and agent to be ready
357+
this.logger.debug("Starting workspace state machine", {
358+
workspace: workspaceName,
359+
initialStatus: workspace.latest_build.status,
360+
});
346361
const stateMachine = new WorkspaceStateMachine(
347362
parts,
348363
workspaceClient,
@@ -423,6 +438,12 @@ export class Remote {
423438
throw new Error("Failed to get workspace or agent from state machine");
424439
}
425440

441+
this.logger.info("Workspace ready", {
442+
workspace: workspaceName,
443+
agent: agent.name,
444+
status: workspace.latest_build.status,
445+
});
446+
426447
this.commands.workspace = workspace;
427448

428449
// Watch coder inbox for messages

0 commit comments

Comments
 (0)