diff --git a/extensions/sql-bindings/src/common/azureFunctionsUtils.ts b/extensions/sql-bindings/src/common/azureFunctionsUtils.ts index d19ddbf8ee..d02fd03bb0 100644 --- a/extensions/sql-bindings/src/common/azureFunctionsUtils.ts +++ b/extensions/sql-bindings/src/common/azureFunctionsUtils.ts @@ -14,6 +14,7 @@ import { ConnectionDetails, IConnectionInfo } from 'vscode-mssql'; import { AzureFunctionsExtensionApi } from '../../../types/vscode-azurefunctions.api'; // https://github.com/microsoft/vscode-azuretools/blob/main/ui/api.d.ts import { AzureExtensionApiProvider } from '../../../types/vscode-azuretools.api'; +import { TelemetryActions, TelemetryReporter, TelemetryViews } from './telemetry'; /** * Represents the settings in an Azure function project's locawl.settings.json file */ @@ -239,6 +240,7 @@ export function waitForNewHostFile(): IFileFunctionObject { */ export async function addSqlNugetReferenceToProjectFile(selectedProjectFile: string): Promise { await utils.executeCommand(`dotnet add "${selectedProjectFile}" package ${constants.sqlExtensionPackageName} --prerelease`); + TelemetryReporter.sendActionEvent(TelemetryViews.CreateAzureFunctionWithSqlBinding, TelemetryActions.addSQLNugetPackage); } /** diff --git a/extensions/sql-bindings/src/common/telemetry.ts b/extensions/sql-bindings/src/common/telemetry.ts index 4758211788..1df12de347 100644 --- a/extensions/sql-bindings/src/common/telemetry.ts +++ b/extensions/sql-bindings/src/common/telemetry.ts @@ -11,7 +11,8 @@ export const TelemetryReporter = new AdsTelemetryReporter(packageInfo.name, pack export enum TelemetryViews { SqlBindingsQuickPick = 'SqlBindingsQuickPick', - CreateAzureFunctionWithSqlBinding = 'CreateAzureFunctionWithSqlBinding' + CreateAzureFunctionWithSqlBinding = 'CreateAzureFunctionWithSqlBinding', + AzureFunctionsUtils = 'AzureFunctionsUtils', } export enum TelemetryActions { @@ -28,9 +29,13 @@ export enum TelemetryActions { updateConnectionString = 'updateConnectionString', finishAddSqlBinding = 'finishAddSqlBinding', exitSqlBindingsQuickpick = 'exitSqlBindingsQuickpick', + + // Azure Functions Utils + addSQLNugetPackage = 'addSQLNugetPackage', } export enum CreateAzureFunctionStep { + noAzureFunctionsExtension = 'noAzureFunctionsExtension', getAzureFunctionProject = 'getAzureFunctionProject', learnMore = 'learnMore', helpCreateAzureFunctionProject = 'helpCreateAzureFunctionProject', diff --git a/extensions/sql-bindings/src/services/azureFunctionsService.ts b/extensions/sql-bindings/src/services/azureFunctionsService.ts index f817704e65..64b0227d9e 100644 --- a/extensions/sql-bindings/src/services/azureFunctionsService.ts +++ b/extensions/sql-bindings/src/services/azureFunctionsService.ts @@ -29,11 +29,13 @@ export async function createAzureFunction(node?: ITreeNodeInfo): Promise { let newFunctionFileObject: azureFunctionsUtils.IFileFunctionObject | undefined; try { + // check to see if Azure Functions Extension is installed const azureFunctionApi = await azureFunctionsUtils.getAzureFunctionsExtensionApi(); if (!azureFunctionApi) { exitReason = ExitReason.error; propertyBag.exitReason = exitReason; - TelemetryReporter.createErrorEvent(TelemetryViews.CreateAzureFunctionWithSqlBinding, TelemetryActions.exitCreateAzureFunctionQuickpick) + telemetryStep = CreateAzureFunctionStep.noAzureFunctionsExtension; + TelemetryReporter.createErrorEvent(TelemetryViews.CreateAzureFunctionWithSqlBinding, telemetryStep) .withAdditionalProperties(propertyBag).send(); return; } @@ -70,6 +72,7 @@ export async function createAzureFunction(node?: ITreeNodeInfo): Promise { { title: constants.selectAzureFunctionProjFolder, ignoreFocusOut: true }); if (!browseProjectLocation) { // User cancelled + exitReason = ExitReason.cancelled; return; } const projectFolders = (await vscode.window.showOpenDialog({ @@ -80,6 +83,7 @@ export async function createAzureFunction(node?: ITreeNodeInfo): Promise { })); if (!projectFolders) { // User cancelled + exitReason = ExitReason.cancelled; return; } projectFolder = projectFolders[0].fsPath; @@ -89,6 +93,7 @@ export async function createAzureFunction(node?: ITreeNodeInfo): Promise { break; } else { // user cancelled + exitReason = ExitReason.cancelled; return; } } @@ -109,6 +114,7 @@ export async function createAzureFunction(node?: ITreeNodeInfo): Promise { let chosenObjectType = await azureFunctionsUtils.promptForObjectType(); if (!chosenObjectType) { // User cancelled + exitReason = ExitReason.cancelled; return; } @@ -116,6 +122,8 @@ export async function createAzureFunction(node?: ITreeNodeInfo): Promise { telemetryStep = CreateAzureFunctionStep.getBindingType; selectedBindingType = await azureFunctionsUtils.promptForBindingType(chosenObjectType); if (!selectedBindingType) { + // User cancelled + exitReason = ExitReason.cancelled; return; } @@ -137,6 +145,7 @@ export async function createAzureFunction(node?: ITreeNodeInfo): Promise { } if (!connectionInfo) { // User cancelled + exitReason = ExitReason.cancelled; return; } TelemetryReporter.createActionEvent(TelemetryViews.CreateAzureFunctionWithSqlBinding, telemetryStep) @@ -174,6 +183,8 @@ export async function createAzureFunction(node?: ITreeNodeInfo): Promise { let nodeType = ObjectType.Table === node.nodeType ? ObjectType.Table : ObjectType.View; selectedBindingType = await azureFunctionsUtils.promptForBindingType(nodeType); if (!selectedBindingType) { + // User cancelled + exitReason = ExitReason.cancelled; return; } @@ -201,6 +212,8 @@ export async function createAzureFunction(node?: ITreeNodeInfo): Promise { validateInput: input => utils.validateFunctionName(input) }) as string; if (!functionName) { + // User cancelled + exitReason = ExitReason.cancelled; return; } TelemetryReporter.createActionEvent(TelemetryViews.CreateAzureFunctionWithSqlBinding, telemetryStep) @@ -219,6 +232,7 @@ export async function createAzureFunction(node?: ITreeNodeInfo): Promise { connectionStringInfo = await azureFunctionsUtils.promptAndUpdateConnectionStringSetting(vscode.Uri.parse(projectFile), connectionInfo); if (!connectionStringInfo) { // User cancelled connection string setting name prompt or connection string method prompt + exitReason = ExitReason.cancelled; return; } TelemetryReporter.createActionEvent(TelemetryViews.CreateAzureFunctionWithSqlBinding, telemetryStep)