diff --git a/extensions/ql-vscode/src/interface.ts b/extensions/ql-vscode/src/interface.ts index 179e6dced56..c27cb1b83e1 100644 --- a/extensions/ql-vscode/src/interface.ts +++ b/extensions/ql-vscode/src/interface.ts @@ -65,6 +65,7 @@ import { import { AbstractWebview, WebviewPanelConfig } from "./abstract-webview"; import { PAGE_SIZE } from "./config"; import { HistoryItemLabelProvider } from "./history-item-label-provider"; +import { telemetryListener } from "./telemetry"; /** * interface.ts @@ -255,6 +256,7 @@ export class ResultsView extends AbstractWebview< } case "changeSort": await this.changeRawSortState(msg.resultSetName, msg.sortState); + telemetryListener?.sendUIInteraction("local-results-column-sorting"); break; case "changeInterpretedSort": await this.changeInterpretedSortState(msg.sortState); @@ -282,6 +284,9 @@ export class ResultsView extends AbstractWebview< case "openFile": await this.openFile(msg.filePath); break; + case "telemetry": + telemetryListener?.sendUIInteraction(msg.action); + break; default: assertNever(msg); } diff --git a/extensions/ql-vscode/src/pure/interface-types.ts b/extensions/ql-vscode/src/pure/interface-types.ts index dabf31369fb..39850e7c324 100644 --- a/extensions/ql-vscode/src/pure/interface-types.ts +++ b/extensions/ql-vscode/src/pure/interface-types.ts @@ -200,7 +200,8 @@ export type FromResultsViewMsg = | ChangeInterpretedResultsSortMsg | ViewLoadedMsg | ChangePage - | OpenFileMsg; + | OpenFileMsg + | TelemetryMessage; /** * Message from the results view to open a database source diff --git a/extensions/ql-vscode/src/view/results/alert-table.tsx b/extensions/ql-vscode/src/view/results/alert-table.tsx index 88b85885f58..f9945f51868 100644 --- a/extensions/ql-vscode/src/view/results/alert-table.tsx +++ b/extensions/ql-vscode/src/view/results/alert-table.tsx @@ -30,6 +30,7 @@ import { import { vscode } from "../vscode-api"; import { isWholeFileLoc, isLineColumnLoc } from "../../pure/bqrs-utils"; import { ScrollIntoViewHelper } from "./scroll-into-view-helper"; +import { sendTelemetry } from "../common/telemetry"; export type PathTableProps = ResultTableProps & { resultSet: InterpretedResultSet; @@ -64,6 +65,9 @@ export class PathTable extends React.Component { expanded.add(str); } } + if (expanded) { + sendTelemetry("local-results-alert-table-path-expanded"); + } return { expanded }; }); e.stopPropagation(); @@ -185,6 +189,7 @@ export class PathTable extends React.Component { ...previousState, selectedItem: resultKey, })); + sendTelemetry("local-results-alert-table-path-selected"); }; }; diff --git a/extensions/ql-vscode/src/view/results/raw-results-table.tsx b/extensions/ql-vscode/src/view/results/raw-results-table.tsx index c30005bbea0..76ddad3b7de 100644 --- a/extensions/ql-vscode/src/view/results/raw-results-table.tsx +++ b/extensions/ql-vscode/src/view/results/raw-results-table.tsx @@ -18,6 +18,7 @@ import { ResultRow } from "../../pure/bqrs-cli-types"; import { onNavigation } from "./results"; import { tryGetResolvableLocation } from "../../pure/bqrs-utils"; import { ScrollIntoViewHelper } from "./scroll-into-view-helper"; +import { sendTelemetry } from "../common/telemetry"; export type RawTableProps = ResultTableProps & { resultSet: RawTableResultSet; @@ -44,6 +45,7 @@ export class RawTable extends React.Component { ...prev, selectedItem: { row, column }, })); + sendTelemetry("local-results-raw-results-table-selected"); } render(): React.ReactNode { diff --git a/extensions/ql-vscode/src/view/results/result-table-utils.tsx b/extensions/ql-vscode/src/view/results/result-table-utils.tsx index 417667177fd..af1037dd1fd 100644 --- a/extensions/ql-vscode/src/view/results/result-table-utils.tsx +++ b/extensions/ql-vscode/src/view/results/result-table-utils.tsx @@ -10,6 +10,7 @@ import { import { assertNever } from "../../pure/helpers-pure"; import { vscode } from "../vscode-api"; import { convertNonPrintableChars } from "../../text-utils"; +import { sendTelemetry } from "../common/telemetry"; export interface ResultTableProps { resultSet: ResultSet; @@ -160,13 +161,20 @@ export function nextSortDirection( } } +function sendCodeQLLanguageGuidesTelemetry() { + sendTelemetry("codeql-language-guides-link"); +} + export function emptyQueryResultsMessage(): JSX.Element { return (
This query returned no results. If this isn't what you were expecting, and for effective query-writing tips, check out the{" "} - + CodeQL language guides . diff --git a/extensions/ql-vscode/src/view/results/result-tables.tsx b/extensions/ql-vscode/src/view/results/result-tables.tsx index 476ab9bcb06..43de84f9f00 100644 --- a/extensions/ql-vscode/src/view/results/result-tables.tsx +++ b/extensions/ql-vscode/src/view/results/result-tables.tsx @@ -26,6 +26,7 @@ import { openFile, } from "./result-table-utils"; import { vscode } from "../vscode-api"; +import { sendTelemetry } from "../common/telemetry"; const FILE_PATH_REGEX = /^(?:.+[\\/])*(.+)$/; @@ -153,6 +154,7 @@ export class ResultTables extends React.Component< pageNumber: 0, selectedTable, }); + sendTelemetry("local-results-table-selection"); }; private alertTableExtras(): JSX.Element | undefined { @@ -165,6 +167,9 @@ export class ResultTables extends React.Component< this.setState({ problemsViewSelected: e.target.checked, }); + if (e.target.checked) { + sendTelemetry("local-results-show-results-in-problems-view"); + } if (resultsPath !== undefined) { vscode.postMessage({ t: "toggleDiagnostics", @@ -199,6 +204,10 @@ export class ResultTables extends React.Component< return parsedResultSets.pageNumber * parsedResultSets.pageSize; } + sendResultsPageChangedTelemetry() { + sendTelemetry("local-results-alert-table-page-changed"); + } + renderPageButtons(): JSX.Element { const { parsedResultSets } = this.props; const selectedTable = this.state.selectedTable; @@ -217,6 +226,7 @@ export class ResultTables extends React.Component< const onChange = (e: React.ChangeEvent) => { this.setState({ selectedPage: e.target.value }); + this.sendResultsPageChangedTelemetry(); }; const choosePage = (input: string) => { const pageNumber = parseInt(input); @@ -239,6 +249,7 @@ export class ResultTables extends React.Component< pageNumber: Math.max(parsedResultSets.pageNumber - 1, 0), selectedTable, }); + this.sendResultsPageChangedTelemetry(); }; const nextPage = (e: React.MouseEvent) => { vscode.postMessage({ @@ -246,10 +257,12 @@ export class ResultTables extends React.Component< pageNumber: Math.min(parsedResultSets.pageNumber + 1, numPages - 1), selectedTable, }); + this.sendResultsPageChangedTelemetry(); }; const openQuery = () => { openFile(this.props.queryPath); + sendTelemetry("local-results-open-query-file"); }; const fileName = FILE_PATH_REGEX.exec(this.props.queryPath)?.[1] || "query"; @@ -334,6 +347,7 @@ export class ResultTables extends React.Component< nonemptyRawResults={nonemptyRawResults} showRawResults={() => { this.setState({ selectedTable: SELECT_TABLE_NAME }); + sendTelemetry("local-results-show-raw-results"); }} offset={this.getOffset()} />