Merge pull request #1976 from github/robertbrignull/local_results_telemetry
Emit telemetry for user interactions in the local results view
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -200,7 +200,8 @@ export type FromResultsViewMsg =
|
||||
| ChangeInterpretedResultsSortMsg
|
||||
| ViewLoadedMsg
|
||||
| ChangePage
|
||||
| OpenFileMsg;
|
||||
| OpenFileMsg
|
||||
| TelemetryMessage;
|
||||
|
||||
/**
|
||||
* Message from the results view to open a database source
|
||||
|
||||
@@ -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<SarifInterpretationData>;
|
||||
@@ -64,6 +65,9 @@ export class PathTable extends React.Component<PathTableProps, PathTableState> {
|
||||
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<PathTableProps, PathTableState> {
|
||||
...previousState,
|
||||
selectedItem: resultKey,
|
||||
}));
|
||||
sendTelemetry("local-results-alert-table-path-selected");
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -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<RawTableProps, RawTableState> {
|
||||
...prev,
|
||||
selectedItem: { row, column },
|
||||
}));
|
||||
sendTelemetry("local-results-raw-results-table-selected");
|
||||
}
|
||||
|
||||
render(): React.ReactNode {
|
||||
|
||||
@@ -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 (
|
||||
<div className="vscode-codeql__empty-query-message">
|
||||
<span>
|
||||
This query returned no results. If this isn't what you were
|
||||
expecting, and for effective query-writing tips, check out the{" "}
|
||||
<a href="https://codeql.github.com/docs/codeql-language-guides/">
|
||||
<a
|
||||
href="https://codeql.github.com/docs/codeql-language-guides/"
|
||||
onClick={sendCodeQLLanguageGuidesTelemetry}
|
||||
>
|
||||
CodeQL language guides
|
||||
</a>
|
||||
.
|
||||
|
||||
@@ -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<HTMLInputElement>) => {
|
||||
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<HTMLButtonElement, 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()}
|
||||
/>
|
||||
|
||||
Reference in New Issue
Block a user