Skip to content

Commit 8afef7c

Browse files
committed
Add duration to error event
1 parent 0ae62e6 commit 8afef7c

8 files changed

Lines changed: 79 additions & 57 deletions

File tree

web-common/src/features/add-data/form/ConnectorForm.svelte

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,12 @@
1313
} from "@rilldata/web-common/features/add-data/manager/steps/connector.ts";
1414
import { getLabelsForConnector } from "@rilldata/web-common/features/add-data/form/form-labels.ts";
1515
import { setSubmitError } from "@rilldata/web-common/features/add-data/form/errors.ts";
16-
import type {
17-
AddDataConfig,
18-
CreateConnectorStep,
19-
} from "@rilldata/web-common/features/add-data/manager/steps/types.ts";
16+
import type { CreateConnectorStep } from "@rilldata/web-common/features/add-data/manager/steps/types.ts";
2017
import { addLeadingSlash } from "@rilldata/web-common/features/entity-management/entity-mappers.ts";
2118
import { getConnectorDriverForSchema } from "@rilldata/web-common/features/add-data/manager/steps/utils.ts";
22-
import { errorEventHandler } from "@rilldata/web-common/metrics/initMetrics.ts";
19+
import type { AddDataStateManager } from "@rilldata/web-common/features/add-data/manager/AddDataStateManager.svelte.ts";
2320
24-
export let config: AddDataConfig;
21+
export let stateManager: AddDataStateManager;
2522
export let step: CreateConnectorStep;
2623
export let onSubmit: (
2724
connectorName: string,
@@ -58,13 +55,7 @@
5855
5956
onSubmit(connectorName, form.data);
6057
} catch (e) {
61-
void errorEventHandler?.fireAddDataErrorEvent(
62-
config.space,
63-
config.screen,
64-
step.step,
65-
step.schema,
66-
e.message,
67-
);
58+
stateManager.fireErrorEvent(e.message);
6859
setSubmitError(form, e);
6960
}
7061
},

web-common/src/features/add-data/form/ConnectorFormWrapper.svelte

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
<script lang="ts">
2-
import type {
3-
AddDataConfig,
4-
CreateConnectorStep,
5-
} from "@rilldata/web-common/features/add-data/manager/steps/types.ts";
2+
import type { CreateConnectorStep } from "@rilldata/web-common/features/add-data/manager/steps/types.ts";
63
import { connectorFormCache } from "@rilldata/web-common/features/add-data/manager/steps/connector.ts";
74
import { onMount } from "svelte";
85
import ConnectorForm from "@rilldata/web-common/features/add-data/form/ConnectorForm.svelte";
6+
import type { AddDataStateManager } from "@rilldata/web-common/features/add-data/manager/AddDataStateManager.svelte.ts";
97
108
// Wrapper to initialize the ConnectorForm with cached data.
119
// Has async logic to fetch the .env file. So to ensure we load the form on init, we use this wrapper.
1210
13-
export let config: AddDataConfig;
11+
export let stateManager: AddDataStateManager;
1412
export let step: CreateConnectorStep;
1513
export let onSubmit: (
1614
connectorName: string,
@@ -33,7 +31,7 @@
3331

3432
{#if connectorName != null && cachedEnvBlob != null && cachedFormValues != null}
3533
<ConnectorForm
36-
{config}
34+
{stateManager}
3735
{step}
3836
{onSubmit}
3937
{onBack}

web-common/src/features/add-data/manager/AddDataManager.svelte

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@
167167
<SourceSelector {config} onSelect={schemaSelected} {onBack} />
168168
{:else if stepState.step === AddDataStep.CreateConnector}
169169
<ConnectorFormWrapper
170-
{config}
170+
{stateManager}
171171
step={stepState}
172172
onSubmit={(connectorName, connectorFormValues) =>
173173
void connectorSelected(connectorName, connectorFormValues)}
@@ -198,10 +198,16 @@
198198
stepState.config.importSteps[0] === ImportDataStep.CreateModel}
199199
{#if isImportOnlyStep}
200200
<!-- Special case for import only, we show additional options to handle success and failures. -->
201-
<ImportDataStatus {config} importAddDataStep={stepState} {onDone} />
201+
<ImportDataStatus
202+
{config}
203+
{stateManager}
204+
importAddDataStep={stepState}
205+
{onDone}
206+
/>
202207
{:else}
203208
<GenerateDashboardStatus
204209
{config}
210+
{stateManager}
205211
importAddDataStep={stepState}
206212
{onBack}
207213
{onDone}

web-common/src/features/add-data/manager/AddDataStateManager.svelte.ts

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ import {
1111
} from "@rilldata/web-common/features/add-data/manager/steps/utils.ts";
1212
import type { V1ConnectorDriver } from "@rilldata/web-common/runtime-client";
1313
import { connectorFormCache } from "@rilldata/web-common/features/add-data/manager/steps/connector.ts";
14-
import { behaviourEvent } from "@rilldata/web-common/metrics/initMetrics.ts";
14+
import {
15+
behaviourEvent,
16+
errorEventHandler,
17+
} from "@rilldata/web-common/metrics/initMetrics.ts";
1518
import {
1619
type AddDataBehaviourEventFields,
1720
BehaviourEventAction,
@@ -59,7 +62,7 @@ export class AddDataStateManager {
5962
private onStepChange: ((step: AddDataStep) => void) | undefined = undefined;
6063
private config: AddDataConfig | undefined = undefined;
6164

62-
private lastTransitionTime: number = 0;
65+
private startTime = Date.now();
6366

6467
public setCallbacks(
6568
onDone: (() => void) | undefined,
@@ -244,8 +247,42 @@ export class AddDataStateManager {
244247
break;
245248
}
246249
}
250+
}
251+
252+
public fireErrorEvent(
253+
message: string,
254+
step: AddDataStep | ImportDataStep = this.state.step,
255+
) {
256+
if (!this.config) return;
257+
258+
const addDataFields: AddDataBehaviourEventFields = {
259+
step,
260+
duration: Date.now() - this.startTime,
261+
};
262+
if (
263+
this.state.step === AddDataStep.CreateConnector ||
264+
this.state.step === AddDataStep.CreateModel ||
265+
this.state.step === AddDataStep.ExploreConnector ||
266+
this.state.step === AddDataStep.Import
267+
) {
268+
addDataFields.schema = this.state.schema;
269+
}
270+
if (
271+
this.state.step === AddDataStep.CreateModel ||
272+
this.state.step === AddDataStep.ExploreConnector
273+
) {
274+
addDataFields.connector = this.state.connector;
275+
}
276+
if (this.state.step === AddDataStep.Import) {
277+
addDataFields.connector = this.state.config.connector;
278+
}
247279

248-
this.lastTransitionTime = Date.now();
280+
void errorEventHandler?.fireAddDataErrorEvent(
281+
this.config.space,
282+
this.config.screen,
283+
message,
284+
addDataFields,
285+
);
249286
}
250287

251288
private pushState(state: AddDataState) {
@@ -261,8 +298,6 @@ export class AddDataStateManager {
261298
this.state = this.stateStack.pop() ?? { step: AddDataStep.Init };
262299
if (this.stateStack.length === 0) this.onClose?.();
263300
this.onStepChange?.(this.state.step);
264-
265-
this.lastTransitionTime = Date.now();
266301
}
267302

268303
// For lateral state change, going back is not supported.
@@ -276,15 +311,15 @@ export class AddDataStateManager {
276311
fields: AddDataBehaviourEventFields,
277312
) {
278313
if (!this.config) return;
279-
const duration = this.lastTransitionTime
280-
? Date.now() - this.lastTransitionTime
281-
: 0;
282314
void behaviourEvent?.fireAddDataStepEvent(
283315
action,
284316
this.config.medium,
285317
this.config.space,
286318
this.config.screen,
287-
{ ...fields, duration },
319+
{
320+
...fields,
321+
duration: Date.now() - this.startTime,
322+
},
288323
);
289324
}
290325
}

web-common/src/features/add-data/manager/GenerateDashboardStatus.svelte

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121
import { addLeadingSlash } from "@rilldata/web-common/features/entity-management/entity-mappers.ts";
2222
import { queryClient } from "@rilldata/web-common/lib/svelte-query/globalQueryClient.ts";
2323
import FeatherCheckCircle from "@rilldata/web-common/components/icons/FeatherCheckCircle.svelte";
24-
import { errorEventHandler } from "@rilldata/web-common/metrics/initMetrics.ts";
24+
import type { AddDataStateManager } from "@rilldata/web-common/features/add-data/manager/AddDataStateManager.svelte.ts";
2525
2626
export let config: AddDataConfig;
27+
export let stateManager: AddDataStateManager;
2728
export let importAddDataStep: ImportAddDataStep;
2829
export let onBack: () => void;
2930
export let onDone: () => void;
@@ -80,13 +81,7 @@
8081
return goto(currentFileRoute);
8182
} catch (e) {
8283
error = e?.response?.data?.message ?? e?.message ?? "Unknown error";
83-
void errorEventHandler?.fireAddDataErrorEvent(
84-
config.space,
85-
config.screen,
86-
importStep,
87-
importAddDataStep.config.connector,
88-
error!,
89-
);
84+
stateManager.fireErrorEvent(error!, importStep);
9085
}
9186
}
9287

web-common/src/features/add-data/manager/ImportDataStatus.svelte

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,10 @@
2222
import { featureFlags } from "@rilldata/web-common/features/feature-flags.ts";
2323
import { addLeadingSlash } from "@rilldata/web-common/features/entity-management/entity-mappers.ts";
2424
import { runImportSteps } from "@rilldata/web-common/features/add-data/manager/steps/import.ts";
25-
import { errorEventHandler } from "@rilldata/web-common/metrics/initMetrics.ts";
25+
import type { AddDataStateManager } from "@rilldata/web-common/features/add-data/manager/AddDataStateManager.svelte.ts";
2626
2727
export let config: AddDataConfig;
28+
export let stateManager: AddDataStateManager;
2829
export let importAddDataStep: ImportAddDataStep;
2930
export let onDone: () => void;
3031
@@ -64,13 +65,7 @@
6465
);
6566
} catch (e) {
6667
error = e?.response?.data?.message ?? e?.message ?? "Unknown error";
67-
void errorEventHandler?.fireAddDataErrorEvent(
68-
config.space,
69-
config.screen,
70-
importAddDataStep.config.connector,
71-
importStep,
72-
error!,
73-
);
68+
stateManager.fireErrorEvent(error!, importStep);
7469
}
7570
}
7671

web-common/src/metrics/ErrorEventHandler.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type {
1717
SourceFileType,
1818
} from "./service/SourceEventTypes";
1919
import { categorizeSourceError } from "@rilldata/web-common/features/sources/errors/errors.ts";
20+
import type { AddDataBehaviourEventFields } from "@rilldata/web-common/metrics/service/BehaviourEventTypes.ts";
2021

2122
export class ErrorEventHandler {
2223
public constructor(
@@ -117,18 +118,16 @@ export class ErrorEventHandler {
117118
public fireAddDataErrorEvent(
118119
space: MetricsEventSpace,
119120
screen_name: MetricsEventScreenName,
120-
step: string,
121-
schema: string,
122121
message: string,
122+
addDataFields: AddDataBehaviourEventFields,
123123
) {
124124
const code = categorizeSourceError(message);
125125
return this.metricsService.dispatch("addDataErrorEvent", [
126126
this.commonUserMetrics,
127127
space,
128128
screen_name,
129-
step,
130-
schema,
131129
code,
130+
addDataFields,
132131
]);
133132
}
134133

web-common/src/metrics/service/ErrorEventFactory.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import type {
1111
SourceErrorCodes,
1212
SourceFileType,
1313
} from "./SourceEventTypes";
14+
import type { AddDataBehaviourEventFields } from "@rilldata/web-common/metrics/service/BehaviourEventTypes.ts";
1415

1516
export enum ErrorEventAction {
1617
SourceError = "source-error",
@@ -45,13 +46,13 @@ export interface JavascriptErrorEvent extends MetricsEvent {
4546
page_url: string;
4647
}
4748

48-
export interface AddDataErrorEvent extends MetricsEvent {
49+
export interface AddDataErrorEvent
50+
extends MetricsEvent,
51+
AddDataBehaviourEventFields {
4952
action: ErrorEventAction;
5053
error_code: SourceErrorCodes;
5154
space: MetricsEventSpace;
5255
screen_name: MetricsEventScreenName;
53-
step: string;
54-
schema: string;
5556
}
5657

5758
export class ErrorEventFactory extends MetricsEventFactory {
@@ -86,9 +87,8 @@ export class ErrorEventFactory extends MetricsEventFactory {
8687
commonUserFields: CommonUserFields,
8788
space: MetricsEventSpace,
8889
screen_name: MetricsEventScreenName,
89-
step: string,
90-
schema: string,
9190
error_code: SourceErrorCodes,
91+
addDataFields: AddDataBehaviourEventFields,
9292
) {
9393
const event = this.getBaseMetricsEvent(
9494
"error",
@@ -99,9 +99,12 @@ export class ErrorEventFactory extends MetricsEventFactory {
9999
event.action = ErrorEventAction.SourceError;
100100
event.space = space;
101101
event.screen_name = screen_name;
102-
event.step = step;
103-
event.schema = schema;
104102
event.error_code = error_code;
103+
if (addDataFields) {
104+
for (const key in addDataFields) {
105+
event[key] = addDataFields[key];
106+
}
107+
}
105108
return event;
106109
}
107110

0 commit comments

Comments
 (0)