Add more telemetry props to sql migration extension (#17026)

This commit is contained in:
Rachel Kim
2021-09-13 10:11:42 -07:00
committed by GitHub
parent a12cdedb8e
commit ceaa3efebd
6 changed files with 85 additions and 28 deletions

View File

@@ -0,0 +1,27 @@
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { MigrationContext } from '../models/migrationLocalStorage';
import * as loc from './strings';
export enum SQLTargetAssetType {
SQLMI = 'microsoft.sql/managedinstances',
SQLVM = 'Microsoft.SqlVirtualMachine/sqlVirtualMachines',
}
export function getMigrationTargetType(migration: MigrationContext): string {
switch (migration.targetManagedInstance.type) {
case SQLTargetAssetType.SQLMI:
return loc.SQL_MANAGED_INSTANCE;
case SQLTargetAssetType.SQLVM:
return loc.SQL_VIRTUAL_MACHINE;
default:
return '';
}
}
export function getMigrationMode(migration: MigrationContext): string {
return migration.migrationContext.properties.autoCutoverConfiguration?.autoCutover?.valueOf() ? loc.OFFLINE : loc.OFFLINE;
}

View File

@@ -3,10 +3,11 @@
* Licensed under the Source EULA. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { getMigrationStatus, DatabaseMigration, startMigrationCutover, stopMigration, getMigrationAsyncOperationDetails, AzureAsyncOperationResource, BackupFileInfo } from '../../api/azure';
import { getMigrationStatus, DatabaseMigration, startMigrationCutover, stopMigration, getMigrationAsyncOperationDetails, AzureAsyncOperationResource, BackupFileInfo, getResourceGroupFromId } from '../../api/azure';
import { MigrationContext } from '../../models/migrationLocalStorage';
import { sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews } from '../../telemtery';
import * as constants from '../../constants/strings';
import { getMigrationTargetType, getMigrationMode } from '../../constants/helper';
export class MigrationCutoverDialogModel {
@@ -57,8 +58,8 @@ export class MigrationCutoverDialogModel {
TelemetryViews.MigrationCutoverDialog,
TelemetryAction.CutoverMigration,
{
'sessionId': this._migration.sessionId!,
'migrationEndTime': new Date().toString()
...this.getTelemetryProps(this._migration),
'migrationEndTime': new Date().toString(),
},
{}
);
@@ -84,7 +85,8 @@ export class MigrationCutoverDialogModel {
TelemetryViews.MigrationCutoverDialog,
TelemetryAction.CancelMigration,
{
'sessionId': this._migration.sessionId!,
...this.getTelemetryProps(this._migration),
'migrationMode': getMigrationMode(this._migration),
'cutoverStartTime': cutoverStartTime
},
{}
@@ -131,4 +133,17 @@ export class MigrationCutoverDialogModel {
});
return files;
}
private getTelemetryProps(migration: MigrationContext) {
return {
'sessionId': migration.sessionId!,
'subscriptionId': migration.subscription.id,
'resourceGroup': getResourceGroupFromId(migration.targetManagedInstance.id),
'sqlServerName': migration.sourceConnectionProfile.serverName,
'sourceDatabaseName': migration.migrationContext.properties.sourceDatabaseName,
'targetType': getMigrationTargetType(migration),
'targetDatabaseName': migration.migrationContext.name,
'targetServerName': migration.targetManagedInstance.name,
};
}
}

View File

@@ -14,6 +14,7 @@ import { clearDialogMessage, convertTimeDifferenceToDuration, filterMigrations,
import { SqlMigrationServiceDetailsDialog } from '../sqlMigrationService/sqlMigrationServiceDetailsDialog';
import { ConfirmCutoverDialog } from '../migrationCutover/confirmCutoverDialog';
import { MigrationCutoverDialogModel } from '../migrationCutover/migrationCutoverDialogModel';
import { getMigrationTargetType, getMigrationMode } from '../../constants/helper';
const refreshFrequency: SupportedAutoRefreshIntervals = 180000;
@@ -326,8 +327,8 @@ export class MigrationStatusDialog {
return [
{ value: this._getDatabaserHyperLink(migration) },
{ value: this._getMigrationStatus(migration) },
{ value: this._getMigrationMode(migration) },
{ value: this._getMigrationTargetType(migration) },
{ value: getMigrationMode(migration) },
{ value: getMigrationTargetType(migration) },
{ value: migration.targetManagedInstance.name },
{ value: migration.controller.name },
{
@@ -404,21 +405,11 @@ export class MigrationStatusDialog {
return '---';
}
private _getMigrationTargetType(migration: MigrationContext): string {
return migration.targetManagedInstance.type === 'microsoft.sql/managedinstances'
? loc.SQL_MANAGED_INSTANCE
: loc.SQL_VIRTUAL_MACHINE;
}
private _getMigrationMode(migration: MigrationContext): string {
return migration.migrationContext.properties.autoCutoverConfiguration?.autoCutover?.valueOf() ? loc.OFFLINE : loc.ONLINE;
}
private _getMenuCommands(migration: MigrationContext): string[] {
const menuCommands: string[] = [];
const migrationStatus = migration?.migrationContext?.properties?.migrationStatus;
if (this._getMigrationMode(migration) === loc.ONLINE &&
if (getMigrationMode(migration) === loc.ONLINE &&
this.canCutoverMigration(migrationStatus)) {
menuCommands.push(MenuCommands.Cutover);
}

View File

@@ -258,6 +258,8 @@ export class MigrationStateModel implements Model, vscode.Disposable {
{
'sessionId': this._sessionId,
'tenantId': this._azureAccount.properties.tenants[0].id,
'subscriptionId': this._targetSubscription?.id,
'resourceGroup': this._resourceGroup?.name,
'hashedServerName': hashString(this._assessmentApiResponse.assessmentResult.name),
'startTime': startTime.toString(),
'endTime': endTime.toString(),
@@ -291,6 +293,8 @@ export class MigrationStateModel implements Model, vscode.Disposable {
TelemetryAction.DatabaseAssessment,
{
'sessionId': this._sessionId,
'subscriptionId': this._targetSubscription?.id,
'resourceGroup': this._resourceGroup?.name,
'hashedDatabaseName': hashString(d.name),
'compatibilityLevel': d.compatibilityLevel
},
@@ -327,6 +331,8 @@ export class MigrationStateModel implements Model, vscode.Disposable {
TelemetryAction.DatabaseAssessmentWarning,
{
'sessionId': this._sessionId,
'subscriptionId': this._targetSubscription?.id,
'resourceGroup': this._resourceGroup?.name,
'warnings': JSON.stringify(databaseWarnings)
},
{}
@@ -345,6 +351,8 @@ export class MigrationStateModel implements Model, vscode.Disposable {
TelemetryAction.DatabaseAssessmentError,
{
'sessionId': this._sessionId,
'subscriptionId': this._targetSubscription?.id,
'resourceGroup': this._resourceGroup?.name,
'errors': JSON.stringify(databaseErrors)
},
{}
@@ -924,15 +932,18 @@ export class MigrationStateModel implements Model, vscode.Disposable {
TelemetryViews.MigrationWizardSummaryPage,
TelemetryAction.StartMigration,
{
'sessionId': this._sessionId,
'tenantId': this._azureAccount.properties.tenants[0].id,
'subscriptionId': this._targetSubscription?.id,
'resourceGroup': this._resourceGroup?.name,
'location': this._targetServerInstance.location,
'targetType': this._targetType,
'hashedServerName': hashString(this._assessmentApiResponse.assessmentResult.name),
'hashedDatabaseName': hashString(this._migrationDbs[i]),
'migrationMode': isOfflineMigration ? 'offline' : 'online',
'sessionId': this._sessionId,
'migrationStartTime': new Date().toString(),
'targetDatabaseName': this._targetDatabaseNames[i],
'serverName': this._targetServerInstance.name,
'tenantId': this._azureAccount.properties.tenants[0].id,
'location': this._targetServerInstance.location,
'sqlMigrationServiceId': Buffer.from(this._sqlMigrationService?.id!).toString('base64'),
'irRegistered': (this._nodeNames.length > 0).toString()
},

View File

@@ -34,7 +34,11 @@ export enum TelemetryAction {
CutoverMigration = 'CutoverMigration',
CancelMigration = 'CancelMigration',
MigrationStatus = 'MigrationStatus',
PageButtonClick = 'PageButtonClick'
PageButtonClick = 'PageButtonClick',
Prev = 'prev',
Next = 'next',
Done = 'done',
Cancel = 'cancel',
}
export function sendSqlMigrationActionEvent(telemetryView: TelemetryViews, telemetryAction: TelemetryAction, additionalProps: TelemetryEventProperties, additionalMeasurements: TelemetryEventMeasures): void {

View File

@@ -95,8 +95,8 @@ export class WizardController {
TelemetryViews.SqlMigrationWizard,
TelemetryAction.PageButtonClick,
{
'sessionId': this._model._sessionId,
'buttonPressed': 'cancel',
...this.getTelemetryProps(),
'buttonPressed': TelemetryAction.Cancel,
'pageTitle': this._wizardObject.pages[this._wizardObject.currentPage].title
}, {});
});
@@ -106,25 +106,34 @@ export class WizardController {
TelemetryViews.SqlMigrationWizard,
TelemetryAction.PageButtonClick,
{
'sessionId': this._model._sessionId,
'buttonPressed': 'done',
...this.getTelemetryProps(),
'buttonPressed': TelemetryAction.Done,
'pageTitle': this._wizardObject.pages[this._wizardObject.currentPage].title
}, {});
});
}
private async sendPageButtonClickEvent(pageChangeInfo: azdata.window.WizardPageChangeInfo) {
const buttonPressed = pageChangeInfo.newPage > pageChangeInfo.lastPage ? 'next' : 'prev';
const pageTitle = this._wizardObject.pages[pageChangeInfo.lastPage].title;
const buttonPressed = pageChangeInfo.newPage > pageChangeInfo.lastPage ? TelemetryAction.Next : TelemetryAction.Prev;
const pageTitle = this._wizardObject.pages[pageChangeInfo.lastPage]?.title;
sendSqlMigrationActionEvent(
TelemetryViews.SqlMigrationWizard,
TelemetryAction.PageButtonClick,
{
'sessionId': this._model._sessionId,
...this.getTelemetryProps(),
'buttonPressed': buttonPressed,
'pageTitle': pageTitle
}, {});
}
private getTelemetryProps() {
return {
'sessionId': this._model._sessionId,
'subscriptionId': this._model._targetSubscription?.id,
'resourceGroup': this._model._resourceGroup?.name,
'targetType': this._model._targetType,
};
}
}
export function createInformationRow(view: azdata.ModelView, label: string, value: string): azdata.FlexContainer {