Skip to content

Commit 50c7ad8

Browse files
authored
add login telemetry (#773)
1 parent 9ab3cc9 commit 50c7ad8

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

src/observableApiAuth.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
} from "./observableApiConfig.js";
1515
import type {TtyEffects} from "./tty.js";
1616
import {bold, defaultEffects as defaultTtyEffects, inverse, link, yellow} from "./tty.js";
17+
import {Telemetry} from "./telemetry.js";
1718

1819
const OBSERVABLE_UI_ORIGIN = getObservableUiOrigin();
1920

@@ -36,6 +37,7 @@ export const defaultEffects: AuthEffects = {
3637

3738
export async function login(effects: AuthEffects = defaultEffects) {
3839
const {clack} = effects;
40+
Telemetry.record({event: "login", step: "start"});
3941
clack.intro(inverse(" observable login "));
4042

4143
const {currentUser} = await loginInner(effects);
@@ -52,8 +54,7 @@ export async function login(effects: AuthEffects = defaultEffects) {
5254
);
5355
}
5456
clack.outro("Logged in");
55-
56-
clack.outro();
57+
Telemetry.record({event: "login", step: "finish"});
5758
}
5859

5960
export async function loginInner(effects: AuthEffects): Promise<{currentUser: GetCurrentUserResponse; apiKey: ApiKey}> {
@@ -75,6 +76,7 @@ export async function loginInner(effects: AuthEffects): Promise<{currentUser: Ge
7576

7677
let apiKey: PostAuthRequestPollResponse["apiKey"] | null = null;
7778
while (apiKey === null) {
79+
await new Promise((resolve) => setTimeout(resolve, 1000));
7880
const requestPoll = await apiClient.postAuthRequestPoll(requestInfo.id);
7981
switch (requestPoll.status) {
8082
case "pending":
@@ -84,18 +86,23 @@ export async function loginInner(effects: AuthEffects): Promise<{currentUser: Ge
8486
break;
8587
case "expired":
8688
spinner.stop("Failed to confirm code.", 2);
89+
Telemetry.record({event: "login", step: "error", code: "expired"});
8790
throw new CliError("That confirmation code expired.");
8891
case "consumed":
8992
spinner.stop("Failed to confirm code.", 2);
93+
Telemetry.record({event: "login", step: "error", code: "consumed"});
9094
throw new CliError("That confirmation code has already been used.");
9195
default:
9296
spinner.stop("Failed to confirm code.", 2);
97+
Telemetry.record({event: "login", step: "error", code: `unknown-${requestPoll.status}`});
9398
throw new CliError(`Received an unknown polling status ${requestPoll.status}.`);
9499
}
95-
await new Promise((resolve) => setTimeout(resolve, 1000));
96100
}
97101

98-
if (!apiKey) throw new CliError("No API key returned from server.");
102+
if (!apiKey) {
103+
Telemetry.record({event: "login", step: "error", code: "no-key"});
104+
throw new CliError("No API key returned from server.");
105+
}
99106
await effects.setObservableApiKey(apiKey);
100107

101108
apiClient.setApiKey({source: "login", key: apiKey.key});

src/telemetry.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ type TelemetryTime = {
3838
};
3939

4040
type TelemetryData = {
41-
event: "build" | "deploy" | "preview" | "signal";
42-
step?: "start" | "finish";
41+
event: "build" | "deploy" | "preview" | "signal" | "login";
42+
step?: "start" | "finish" | "error";
4343
[key: string]: unknown;
4444
};
4545

0 commit comments

Comments
 (0)