Skip to content

Commit 84c6c1e

Browse files
Merge pull request #1976 from github/robertbrignull/local_results_telemetry
Emit telemetry for user interactions in the local results view
2 parents e230bf4 + 37e3e04 commit 84c6c1e

6 files changed

Lines changed: 37 additions & 2 deletions

File tree

extensions/ql-vscode/src/interface.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ import {
6565
import { AbstractWebview, WebviewPanelConfig } from "./abstract-webview";
6666
import { PAGE_SIZE } from "./config";
6767
import { HistoryItemLabelProvider } from "./history-item-label-provider";
68+
import { telemetryListener } from "./telemetry";
6869

6970
/**
7071
* interface.ts
@@ -255,6 +256,7 @@ export class ResultsView extends AbstractWebview<
255256
}
256257
case "changeSort":
257258
await this.changeRawSortState(msg.resultSetName, msg.sortState);
259+
telemetryListener?.sendUIInteraction("local-results-column-sorting");
258260
break;
259261
case "changeInterpretedSort":
260262
await this.changeInterpretedSortState(msg.sortState);
@@ -282,6 +284,9 @@ export class ResultsView extends AbstractWebview<
282284
case "openFile":
283285
await this.openFile(msg.filePath);
284286
break;
287+
case "telemetry":
288+
telemetryListener?.sendUIInteraction(msg.action);
289+
break;
285290
default:
286291
assertNever(msg);
287292
}

extensions/ql-vscode/src/pure/interface-types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ export type FromResultsViewMsg =
200200
| ChangeInterpretedResultsSortMsg
201201
| ViewLoadedMsg
202202
| ChangePage
203-
| OpenFileMsg;
203+
| OpenFileMsg
204+
| TelemetryMessage;
204205

205206
/**
206207
* Message from the results view to open a database source

extensions/ql-vscode/src/view/results/alert-table.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {
3030
import { vscode } from "../vscode-api";
3131
import { isWholeFileLoc, isLineColumnLoc } from "../../pure/bqrs-utils";
3232
import { ScrollIntoViewHelper } from "./scroll-into-view-helper";
33+
import { sendTelemetry } from "../common/telemetry";
3334

3435
export type PathTableProps = ResultTableProps & {
3536
resultSet: InterpretedResultSet<SarifInterpretationData>;
@@ -64,6 +65,9 @@ export class PathTable extends React.Component<PathTableProps, PathTableState> {
6465
expanded.add(str);
6566
}
6667
}
68+
if (expanded) {
69+
sendTelemetry("local-results-alert-table-path-expanded");
70+
}
6771
return { expanded };
6872
});
6973
e.stopPropagation();
@@ -185,6 +189,7 @@ export class PathTable extends React.Component<PathTableProps, PathTableState> {
185189
...previousState,
186190
selectedItem: resultKey,
187191
}));
192+
sendTelemetry("local-results-alert-table-path-selected");
188193
};
189194
};
190195

extensions/ql-vscode/src/view/results/raw-results-table.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { ResultRow } from "../../pure/bqrs-cli-types";
1818
import { onNavigation } from "./results";
1919
import { tryGetResolvableLocation } from "../../pure/bqrs-utils";
2020
import { ScrollIntoViewHelper } from "./scroll-into-view-helper";
21+
import { sendTelemetry } from "../common/telemetry";
2122

2223
export type RawTableProps = ResultTableProps & {
2324
resultSet: RawTableResultSet;
@@ -44,6 +45,7 @@ export class RawTable extends React.Component<RawTableProps, RawTableState> {
4445
...prev,
4546
selectedItem: { row, column },
4647
}));
48+
sendTelemetry("local-results-raw-results-table-selected");
4749
}
4850

4951
render(): React.ReactNode {

extensions/ql-vscode/src/view/results/result-table-utils.tsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import { assertNever } from "../../pure/helpers-pure";
1111
import { vscode } from "../vscode-api";
1212
import { convertNonPrintableChars } from "../../text-utils";
13+
import { sendTelemetry } from "../common/telemetry";
1314

1415
export interface ResultTableProps {
1516
resultSet: ResultSet;
@@ -160,13 +161,20 @@ export function nextSortDirection(
160161
}
161162
}
162163

164+
function sendCodeQLLanguageGuidesTelemetry() {
165+
sendTelemetry("codeql-language-guides-link");
166+
}
167+
163168
export function emptyQueryResultsMessage(): JSX.Element {
164169
return (
165170
<div className="vscode-codeql__empty-query-message">
166171
<span>
167172
This query returned no results. If this isn&apos;t what you were
168173
expecting, and for effective query-writing tips, check out the{" "}
169-
<a href="https://codeql.github.com/docs/codeql-language-guides/">
174+
<a
175+
href="https://codeql.github.com/docs/codeql-language-guides/"
176+
onClick={sendCodeQLLanguageGuidesTelemetry}
177+
>
170178
CodeQL language guides
171179
</a>
172180
.

extensions/ql-vscode/src/view/results/result-tables.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import {
2626
openFile,
2727
} from "./result-table-utils";
2828
import { vscode } from "../vscode-api";
29+
import { sendTelemetry } from "../common/telemetry";
2930

3031
const FILE_PATH_REGEX = /^(?:.+[\\/])*(.+)$/;
3132

@@ -153,6 +154,7 @@ export class ResultTables extends React.Component<
153154
pageNumber: 0,
154155
selectedTable,
155156
});
157+
sendTelemetry("local-results-table-selection");
156158
};
157159

158160
private alertTableExtras(): JSX.Element | undefined {
@@ -165,6 +167,9 @@ export class ResultTables extends React.Component<
165167
this.setState({
166168
problemsViewSelected: e.target.checked,
167169
});
170+
if (e.target.checked) {
171+
sendTelemetry("local-results-show-results-in-problems-view");
172+
}
168173
if (resultsPath !== undefined) {
169174
vscode.postMessage({
170175
t: "toggleDiagnostics",
@@ -199,6 +204,10 @@ export class ResultTables extends React.Component<
199204
return parsedResultSets.pageNumber * parsedResultSets.pageSize;
200205
}
201206

207+
sendResultsPageChangedTelemetry() {
208+
sendTelemetry("local-results-alert-table-page-changed");
209+
}
210+
202211
renderPageButtons(): JSX.Element {
203212
const { parsedResultSets } = this.props;
204213
const selectedTable = this.state.selectedTable;
@@ -217,6 +226,7 @@ export class ResultTables extends React.Component<
217226

218227
const onChange = (e: React.ChangeEvent<HTMLInputElement>) => {
219228
this.setState({ selectedPage: e.target.value });
229+
this.sendResultsPageChangedTelemetry();
220230
};
221231
const choosePage = (input: string) => {
222232
const pageNumber = parseInt(input);
@@ -239,17 +249,20 @@ export class ResultTables extends React.Component<
239249
pageNumber: Math.max(parsedResultSets.pageNumber - 1, 0),
240250
selectedTable,
241251
});
252+
this.sendResultsPageChangedTelemetry();
242253
};
243254
const nextPage = (e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
244255
vscode.postMessage({
245256
t: "changePage",
246257
pageNumber: Math.min(parsedResultSets.pageNumber + 1, numPages - 1),
247258
selectedTable,
248259
});
260+
this.sendResultsPageChangedTelemetry();
249261
};
250262

251263
const openQuery = () => {
252264
openFile(this.props.queryPath);
265+
sendTelemetry("local-results-open-query-file");
253266
};
254267
const fileName = FILE_PATH_REGEX.exec(this.props.queryPath)?.[1] || "query";
255268

@@ -334,6 +347,7 @@ export class ResultTables extends React.Component<
334347
nonemptyRawResults={nonemptyRawResults}
335348
showRawResults={() => {
336349
this.setState({ selectedTable: SELECT_TABLE_NAME });
350+
sendTelemetry("local-results-show-raw-results");
337351
}}
338352
offset={this.getOffset()}
339353
/>

0 commit comments

Comments
 (0)