mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-17 02:51:36 -05:00
[SQL-Migration] Improve log migrations telemetry (#22927)
- Bucketized errors to track top errors - Created separate login migration specific error to improve monitoring --------- Co-authored-by: Akshay Mata <akma@microsoft.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/{#version#}/microsoft.sqltools.migration-{#fileName#}",
|
"downloadUrl": "https://github.com/Microsoft/sqltoolsservice/releases/download/{#version#}/microsoft.sqltools.migration-{#fileName#}",
|
||||||
"useDefaultLinuxRuntime": true,
|
"useDefaultLinuxRuntime": true,
|
||||||
"version": "4.7.0.3",
|
"version": "4.7.0.13",
|
||||||
"downloadFileNames": {
|
"downloadFileNames": {
|
||||||
"Windows_86": "win-x86-net7.0.zip",
|
"Windows_86": "win-x86-net7.0.zip",
|
||||||
"Windows": "win-x64-net7.0.zip",
|
"Windows": "win-x64-net7.0.zip",
|
||||||
|
|||||||
@@ -26,6 +26,12 @@ export enum LoginMigrationStep {
|
|||||||
MigrationCompleted = 3,
|
MigrationCompleted = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const CollectingSourceLoginsFailed = 'Collecting source logins failed';
|
||||||
|
export const CollectingTargetLoginsFailed = 'Collecting target logins failed';
|
||||||
|
export const ConnectingToTargetFailed = 'Connecting to target failed';
|
||||||
|
export const InternalServerError = 'Login Migrations Internal Server Error';
|
||||||
|
|
||||||
|
|
||||||
export function GetLoginMigrationStepString(step: LoginMigrationStep): string {
|
export function GetLoginMigrationStepString(step: LoginMigrationStep): string {
|
||||||
switch (step) {
|
switch (step) {
|
||||||
case LoginMigrationStep.NotStarted:
|
case LoginMigrationStep.NotStarted:
|
||||||
@@ -159,8 +165,21 @@ export class LoginMigrationModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private setErrorCountMapPerStep(step: LoginMigrationStep, result: contracts.StartLoginMigrationResult) {
|
private setErrorCountMapPerStep(step: LoginMigrationStep, result: contracts.StartLoginMigrationResult) {
|
||||||
const errorCount = result.exceptionMap ? Object.keys(result.exceptionMap).length : 0;
|
const errorBuckets: Map<string, number> = new Map<string, number>();
|
||||||
this.errorCountMap.set(LoginMigrationStep[step], errorCount);
|
|
||||||
|
if (!result.exceptionMap) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const exceptions of Object.values(result.exceptionMap)) {
|
||||||
|
for (const exception of exceptions) {
|
||||||
|
// Get the value for the key, or the default value of t0 if he key is not in the map
|
||||||
|
const errorCount = errorBuckets.get(exception.ErrorCodeString) ?? 0;
|
||||||
|
errorBuckets.set(exception.ErrorCodeString, errorCount + 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.errorCountMap.set(LoginMigrationStep[step], errorBuckets);
|
||||||
}
|
}
|
||||||
|
|
||||||
private setDurationPerStep(step: LoginMigrationStep, result: contracts.StartLoginMigrationResult) {
|
private setDurationPerStep(step: LoginMigrationStep, result: contracts.StartLoginMigrationResult) {
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ export enum TelemetryAction {
|
|||||||
OpenLoginMigrationWizard = 'OpenLoginMigrationWizard',
|
OpenLoginMigrationWizard = 'OpenLoginMigrationWizard',
|
||||||
LoginMigrationStarted = 'LoginMigrationStarted',
|
LoginMigrationStarted = 'LoginMigrationStarted',
|
||||||
LoginMigrationCompleted = 'LoginMigrationCompleted',
|
LoginMigrationCompleted = 'LoginMigrationCompleted',
|
||||||
|
LoginMigrationError = 'LoginMigrationError',
|
||||||
TdeMigrationSuccess = 'TdeMigrationSuccess',
|
TdeMigrationSuccess = 'TdeMigrationSuccess',
|
||||||
TdeMigrationFailures = 'TdeMigrationFailures',
|
TdeMigrationFailures = 'TdeMigrationFailures',
|
||||||
TdeMigrationClientException = 'TdeMigrationClientException',
|
TdeMigrationClientException = 'TdeMigrationClientException',
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import { IconPathHelper } from '../constants/iconPathHelper';
|
|||||||
import { LoginMigrationStatusCodes } from '../constants/helper';
|
import { LoginMigrationStatusCodes } from '../constants/helper';
|
||||||
import { MultiStepStatusDialog } from '../dialog/generic/multiStepStatusDialog';
|
import { MultiStepStatusDialog } from '../dialog/generic/multiStepStatusDialog';
|
||||||
import { getTelemetryProps, logError, sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews } from '../telemetry';
|
import { getTelemetryProps, logError, sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews } from '../telemetry';
|
||||||
|
import { InternalServerError } from '../models/loginMigrationModel';
|
||||||
|
|
||||||
export class LoginMigrationStatusPage extends MigrationWizardPage {
|
export class LoginMigrationStatusPage extends MigrationWizardPage {
|
||||||
private _view!: azdata.ModelView;
|
private _view!: azdata.ModelView;
|
||||||
@@ -93,7 +94,17 @@ export class LoginMigrationStatusPage extends MigrationWizardPage {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this._progressLoader.loading = false;
|
this._progressLoader.loading = false;
|
||||||
logError(TelemetryViews.LoginMigrationWizard, 'LoginMigrationFailed', 'Login Migrations Internal Server Error');
|
logError(TelemetryViews.LoginMigrationWizard, 'LoginMigrationFailed', InternalServerError);
|
||||||
|
|
||||||
|
sendSqlMigrationActionEvent(
|
||||||
|
TelemetryViews.LoginMigrationStatusPage,
|
||||||
|
TelemetryAction.LoginMigrationError,
|
||||||
|
{
|
||||||
|
...getTelemetryProps(this.migrationStateModel),
|
||||||
|
'errorMessage': InternalServerError,
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
this._logMigrationResult();
|
this._logMigrationResult();
|
||||||
@@ -450,9 +461,10 @@ export class LoginMigrationStatusPage extends MigrationWizardPage {
|
|||||||
'numberLoginsFailingPerStep': JSON.stringify(Array.from(this.migrationStateModel._loginMigrationModel.errorCountMap)),
|
'numberLoginsFailingPerStep': JSON.stringify(Array.from(this.migrationStateModel._loginMigrationModel.errorCountMap)),
|
||||||
'durationPerStepTimestamp': JSON.stringify(Array.from(this.migrationStateModel._loginMigrationModel.durationPerStep)),
|
'durationPerStepTimestamp': JSON.stringify(Array.from(this.migrationStateModel._loginMigrationModel.durationPerStep)),
|
||||||
'hasSystemError': JSON.stringify(this.migrationStateModel._loginMigrationModel.hasSystemError),
|
'hasSystemError': JSON.stringify(this.migrationStateModel._loginMigrationModel.hasSystemError),
|
||||||
// AKMA TODO: add error code string count map
|
|
||||||
},
|
},
|
||||||
{}
|
{
|
||||||
|
'numberLogins': this.migrationStateModel._loginMigrationModel.loginsForMigration.length,
|
||||||
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import { AzureSqlDatabaseServer, getVMInstanceView, SqlVMServer } from '../api/a
|
|||||||
import { collectSourceLogins, collectTargetLogins, getSourceConnectionId, getSourceConnectionProfile, isSourceConnectionSysAdmin, LoginTableInfo } from '../api/sqlUtils';
|
import { collectSourceLogins, collectTargetLogins, getSourceConnectionId, getSourceConnectionProfile, isSourceConnectionSysAdmin, LoginTableInfo } from '../api/sqlUtils';
|
||||||
import { NetworkInterfaceModel } from '../api/dataModels/azure/networkInterfaceModel';
|
import { NetworkInterfaceModel } from '../api/dataModels/azure/networkInterfaceModel';
|
||||||
import { getTelemetryProps, logError, sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews } from '../telemetry';
|
import { getTelemetryProps, logError, sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews } from '../telemetry';
|
||||||
|
import { ConnectingToTargetFailed, } from '../models/loginMigrationModel';
|
||||||
|
|
||||||
export class LoginMigrationTargetSelectionPage extends MigrationWizardPage {
|
export class LoginMigrationTargetSelectionPage extends MigrationWizardPage {
|
||||||
private _view!: azdata.ModelView;
|
private _view!: azdata.ModelView;
|
||||||
@@ -636,7 +637,16 @@ export class LoginMigrationTargetSelectionPage extends MigrationWizardPage {
|
|||||||
loginsOnTarget,
|
loginsOnTarget,
|
||||||
constants.AZURE_SQL_TARGET_CONNECTION_ERROR_TITLE);
|
constants.AZURE_SQL_TARGET_CONNECTION_ERROR_TITLE);
|
||||||
|
|
||||||
logError(TelemetryViews.LoginMigrationTargetSelectionPage, 'ConnectingToTargetFailed', error);
|
logError(TelemetryViews.LoginMigrationTargetSelectionPage, ConnectingToTargetFailed, error);
|
||||||
|
sendSqlMigrationActionEvent(
|
||||||
|
TelemetryViews.LoginMigrationTargetSelectionPage,
|
||||||
|
TelemetryAction.LoginMigrationError,
|
||||||
|
{
|
||||||
|
...getTelemetryProps(this.migrationStateModel),
|
||||||
|
'errorMessage': ConnectingToTargetFailed,
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
);
|
||||||
connectionSuccessful = false;
|
connectionSuccessful = false;
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
|
|||||||
@@ -13,7 +13,8 @@ import * as styles from '../constants/styles';
|
|||||||
import { collectSourceLogins, collectTargetLogins, getSourceConnectionId, LoginTableInfo } from '../api/sqlUtils';
|
import { collectSourceLogins, collectTargetLogins, getSourceConnectionId, LoginTableInfo } from '../api/sqlUtils';
|
||||||
import { IconPathHelper } from '../constants/iconPathHelper';
|
import { IconPathHelper } from '../constants/iconPathHelper';
|
||||||
import * as utils from '../api/utils';
|
import * as utils from '../api/utils';
|
||||||
import { logError, TelemetryViews } from '../telemetry';
|
import { getTelemetryProps, logError, sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews } from '../telemetry';
|
||||||
|
import { CollectingSourceLoginsFailed, CollectingTargetLoginsFailed } from '../models/loginMigrationModel';
|
||||||
|
|
||||||
|
|
||||||
export class LoginSelectorPage extends MigrationWizardPage {
|
export class LoginSelectorPage extends MigrationWizardPage {
|
||||||
@@ -367,7 +368,17 @@ export class LoginSelectorPage extends MigrationWizardPage {
|
|||||||
description: constants.LOGIN_MIGRATIONS_GET_LOGINS_ERROR(error.message),
|
description: constants.LOGIN_MIGRATIONS_GET_LOGINS_ERROR(error.message),
|
||||||
};
|
};
|
||||||
|
|
||||||
logError(TelemetryViews.LoginMigrationWizard, 'CollectingSourceLoginsFailed', error);
|
logError(TelemetryViews.LoginMigrationWizard, CollectingSourceLoginsFailed, error);
|
||||||
|
|
||||||
|
sendSqlMigrationActionEvent(
|
||||||
|
TelemetryViews.LoginMigrationSelectorPage,
|
||||||
|
TelemetryAction.LoginMigrationError,
|
||||||
|
{
|
||||||
|
...getTelemetryProps(this.migrationStateModel),
|
||||||
|
'errorMessage': CollectingSourceLoginsFailed,
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -400,7 +411,17 @@ export class LoginSelectorPage extends MigrationWizardPage {
|
|||||||
description: constants.LOGIN_MIGRATIONS_GET_LOGINS_ERROR(error.message),
|
description: constants.LOGIN_MIGRATIONS_GET_LOGINS_ERROR(error.message),
|
||||||
};
|
};
|
||||||
|
|
||||||
logError(TelemetryViews.LoginMigrationWizard, 'CollectingTargetLoginsFailed', error);
|
logError(TelemetryViews.LoginMigrationWizard, CollectingTargetLoginsFailed, error);
|
||||||
|
|
||||||
|
sendSqlMigrationActionEvent(
|
||||||
|
TelemetryViews.LoginMigrationSelectorPage,
|
||||||
|
TelemetryAction.LoginMigrationError,
|
||||||
|
{
|
||||||
|
...getTelemetryProps(this.migrationStateModel),
|
||||||
|
'errorMessage': CollectingTargetLoginsFailed,
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user