Skip to content

Commit adc4585

Browse files
kburtramBenjinLauren Nathan
authored
Adding additional logging and telemetry for Build features (#19449) (#19452)
* additonal Entra sign-in logging for connection dialog * added error telemetry * query result and execution plan error telemetry * pr comments + fixed test * fix unit test * table designer error reporting --------- Co-authored-by: Benjin Dubishar <[email protected]> Co-authored-by: Lauren Nathan <[email protected]>
1 parent b851da7 commit adc4585

File tree

6 files changed

+84
-14
lines changed

6 files changed

+84
-14
lines changed

src/connectionconfig/connectionDialogWebviewController.ts

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -922,15 +922,29 @@ export class ConnectionDialogWebviewController extends FormWebviewController<
922922
id: "azureSignIn",
923923
callback: async () => {
924924
const account = await this._mainController.azureAccountService.addAccount();
925+
this.logger.verbose(
926+
`Added Azure account '${account.displayInfo}', ${account.key.id}`,
927+
);
928+
925929
const accountsComponent = this.getFormComponent(this.state, "accountId");
926-
if (accountsComponent) {
927-
accountsComponent.options = await getAccounts(
928-
this._mainController.azureAccountService,
929-
);
930-
this.state.connectionProfile.accountId = account.key.id;
931-
this.updateState();
932-
await this.handleAzureMFAEdits("accountId");
930+
931+
if (!accountsComponent) {
932+
this.logger.error("Account component not found");
933+
return;
933934
}
935+
936+
accountsComponent.options = await getAccounts(
937+
this._mainController.azureAccountService,
938+
);
939+
940+
this.state.connectionProfile.accountId = account.key.id;
941+
942+
this.logger.verbose(
943+
`Read ${accountsComponent.options.length} Azure accounts, selecting '${account.key.id}'`,
944+
);
945+
946+
this.updateState();
947+
await this.handleAzureMFAEdits("accountId");
934948
},
935949
});
936950

src/controllers/mainController.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2359,6 +2359,8 @@ export default class MainController implements vscode.Disposable {
23592359
);
23602360

23612361
executionPlanController.revealToForeground();
2362+
2363+
sendActionEvent(TelemetryViews.ExecutionPlan, TelemetryActions.Open);
23622364
}
23632365
};
23642366
}

src/controllers/sharedExecutionPlanUtils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export async function saveExecutionPlan(
3737
if (saveUri) {
3838
// Write the content to the new file
3939
void vscode.workspace.fs.writeFile(saveUri, Buffer.from(payload.sqlPlanContent));
40+
sendActionEvent(TelemetryViews.ExecutionPlan, TelemetryActions.SavePlan);
4041
}
4142

4243
return state;
@@ -92,7 +93,9 @@ export async function createExecutionPlanGraphs(
9293
let newState = {
9394
...state.executionPlanState,
9495
};
96+
9597
const startTime = performance.now(); // timer for telemetry
98+
9699
for (const plan of xmlPlans) {
97100
const planFile: ExecutionPlanGraphInfo = {
98101
graphFileContent: plan,

src/queryResult/queryResultWebViewController.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as Constants from "../constants/constants";
99
import * as LocalizedConstants from "../constants/locConstants";
1010
import { ReactWebviewViewController } from "../controllers/reactWebviewViewController";
1111
import { SqlOutputContentProvider } from "../models/sqlOutputContentProvider";
12-
import { sendActionEvent } from "../telemetry/telemetry";
12+
import { sendActionEvent, sendErrorEvent } from "../telemetry/telemetry";
1313
import { TelemetryActions, TelemetryViews } from "../sharedInterfaces/telemetry";
1414
import { randomUUID } from "crypto";
1515
import { ApiStatus } from "../sharedInterfaces/webview";
@@ -331,7 +331,17 @@ export class QueryResultWebviewController extends ReactWebviewViewController<
331331
var res = this._queryResultStateMap.get(uri);
332332
if (!res) {
333333
// This should never happen
334-
throw new Error(`No query result state found for uri ${uri}`);
334+
335+
const error = new Error(`No query result state found for uri ${uri}`);
336+
337+
sendErrorEvent(
338+
TelemetryViews.QueryResult,
339+
TelemetryActions.GetQueryResultState,
340+
error,
341+
false, // includeErrorMessage
342+
);
343+
344+
throw error;
335345
}
336346
return res;
337347
}

src/sharedInterfaces/telemetry.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ export enum TelemetryActions {
9292
Feedback = "Feedback",
9393
ChatWithDatabase = "ChatWithDatabase",
9494
StartConversation = "StartConversation",
95+
GetQueryResultState = "GetQueryResultState",
96+
SavePlan = "SavePlan",
9597
}
9698

9799
/**

src/tableDesigner/tableDesignerWebviewController.ts

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import * as designer from "../sharedInterfaces/tableDesigner";
1111
import UntitledSqlDocumentService from "../controllers/untitledSqlDocumentService";
1212
import { getDesignerView } from "./tableDesignerTabDefinition";
1313
import { TreeNodeInfo } from "../objectExplorer/nodes/treeNodeInfo";
14-
import { sendActionEvent, startActivity } from "../telemetry/telemetry";
14+
import { sendActionEvent, sendErrorEvent, startActivity } from "../telemetry/telemetry";
1515
import { ActivityStatus, TelemetryActions, TelemetryViews } from "../sharedInterfaces/telemetry";
1616
import { copied, scriptCopiedToClipboard } from "../constants/locConstants";
1717
import { UserSurvey } from "../nps/userSurvey";
@@ -73,7 +73,18 @@ export class TableDesignerWebviewController extends ReactWebviewPanelController<
7373

7474
private async initialize() {
7575
if (!this._targetNode) {
76-
await vscode.window.showErrorMessage("Unable to find object explorer node");
76+
const errorMessage = "Unable to find object explorer node";
77+
await vscode.window.showErrorMessage(errorMessage);
78+
79+
sendErrorEvent(
80+
TelemetryViews.TableDesigner,
81+
TelemetryActions.Initialize,
82+
new Error(errorMessage),
83+
true, //includeErrorMessage
84+
undefined, // errorCode
85+
"unableToFindObjectExplorerNode",
86+
);
87+
7788
return;
7889
}
7990

@@ -103,12 +114,32 @@ export class TableDesignerWebviewController extends ReactWebviewPanelController<
103114
);
104115

105116
if (!connectionString || connectionString === "") {
106-
await vscode.window.showErrorMessage(
107-
"Unable to find connection string for the connection",
117+
const errorMessage = "Unable to find connection string for the connection";
118+
119+
await vscode.window.showErrorMessage(errorMessage);
120+
121+
sendErrorEvent(
122+
TelemetryViews.TableDesigner,
123+
TelemetryActions.Initialize,
124+
new Error(errorMessage),
125+
true, //includeErrorMessage
126+
undefined, // errorCode
127+
"unableToFindConnectionString",
108128
);
129+
109130
return;
110131
}
111132
} catch (e) {
133+
const error = e instanceof Error ? e : new Error(getErrorMessage(e));
134+
135+
sendErrorEvent(
136+
TelemetryViews.TableDesigner,
137+
TelemetryActions.Initialize,
138+
error,
139+
false, //includeErrorMessage
140+
undefined, // errorCode
141+
"unableToFindConnectionString",
142+
);
112143
await vscode.window.showErrorMessage(
113144
"Unable to find connection string for the connection: " + getErrorMessage(e),
114145
);
@@ -240,7 +271,15 @@ export class TableDesignerWebviewController extends ReactWebviewPanelController<
240271

241272
return afterEditState;
242273
} catch (e) {
243-
vscode.window.showErrorMessage(e.message);
274+
const error = e instanceof Error ? e : new Error(getErrorMessage(e));
275+
276+
sendErrorEvent(
277+
TelemetryViews.TableDesigner,
278+
TelemetryActions.Edit,
279+
error,
280+
false, //includeErrorMessage
281+
);
282+
vscode.window.showErrorMessage(getErrorMessage(e));
244283
return state;
245284
}
246285
});

0 commit comments

Comments
 (0)