Skip to content

Commit 47f63f6

Browse files
Implement debounce for telemetry events
1 parent 98a29d2 commit 47f63f6

2 files changed

Lines changed: 24 additions & 4 deletions

File tree

extensions/ql-vscode/src/view/common/telemetry.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useEffect, useRef } from "react";
1+
import { useEffect, useMemo, useRef } from "react";
22
import { vscode } from "../vscode-api";
33

44
/**
@@ -9,16 +9,34 @@ import { vscode } from "../vscode-api";
99
* @param options Extra optional arguments, including:
1010
* filterTelemetryOnValue: If provided, only output telemetry events when the
1111
* predicate returns true. If not provided always outputs telemetry.
12+
* debounceTimeout: If provided, will not output telemetry events for every change
13+
* but will wait until specified timeout happens with no new events ocurring.
1214
*/
1315
export function useTelemetryOnChange<S>(
1416
value: S,
1517
telemetryAction: string,
1618
options?: {
1719
filterTelemetryOnValue?: (value: S) => boolean;
20+
debounceTimeoutMillis?: number;
1821
},
1922
) {
2023
const previousValue = useRef(value);
2124
const filterTelemetryOnValue = options?.filterTelemetryOnValue;
25+
const debounceTimeoutMillis = options?.debounceTimeoutMillis;
26+
27+
const sendTelemetryFunc = useMemo<() => void>(() => {
28+
if (debounceTimeoutMillis === undefined) {
29+
return () => sendTelemetry(telemetryAction);
30+
} else {
31+
let timer: NodeJS.Timeout;
32+
return () => {
33+
clearTimeout(timer);
34+
timer = setTimeout(() => {
35+
sendTelemetry(telemetryAction);
36+
}, debounceTimeoutMillis);
37+
};
38+
}
39+
}, [telemetryAction, debounceTimeoutMillis]);
2240

2341
useEffect(() => {
2442
if (value === previousValue.current) {
@@ -30,8 +48,8 @@ export function useTelemetryOnChange<S>(
3048
return;
3149
}
3250

33-
sendTelemetry(telemetryAction);
34-
}, [telemetryAction, filterTelemetryOnValue, value, previousValue]);
51+
sendTelemetryFunc();
52+
}, [sendTelemetryFunc, filterTelemetryOnValue, value, previousValue]);
3553
}
3654

3755
export function sendTelemetry(telemetryAction: string) {

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysis.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,9 @@ export function VariantAnalysis({
6868
const [filterSortState, setFilterSortState] = useState(
6969
defaultFilterSortState,
7070
);
71-
useTelemetryOnChange(filterSortState, "variant-analysis-filter-sort-state");
71+
useTelemetryOnChange(filterSortState, "variant-analysis-filter-sort-state", {
72+
debounceTimeoutMillis: 1000,
73+
});
7274

7375
useEffect(() => {
7476
const listener = (evt: MessageEvent) => {

0 commit comments

Comments
 (0)