mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-01-30 01:25:38 -05:00
Add telemetry to troubleshoot customer issues (#17748)
* Add telemetry to troubleshoot customer issues * Updating logerror method calls with custom errors * Add performance telemetry
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
import * as azdata from 'azdata';
|
||||
import * as vscode from 'vscode';
|
||||
import { MigrationContext, MigrationLocalStorage } from '../models/migrationLocalStorage';
|
||||
import { logError, TelemetryViews } from '../telemtery';
|
||||
import * as loc from '../constants/strings';
|
||||
import { IconPath, IconPathHelper } from '../constants/iconPathHelper';
|
||||
import { MigrationStatusDialog } from '../dialog/migrationStatus/migrationStatusDialog';
|
||||
@@ -298,7 +299,8 @@ export class DashboardWidget {
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logError(TelemetryViews.SqlServerDashboard, 'RefreshgMigrationFailed', error);
|
||||
|
||||
} finally {
|
||||
this.isRefreshing = false;
|
||||
this._migrationStatusCardLoadingContainer.loading = false;
|
||||
|
||||
@@ -7,6 +7,7 @@ import * as azdata from 'azdata';
|
||||
import * as vscode from 'vscode';
|
||||
import { createSqlMigrationService, getSqlMigrationService, getSqlMigrationServiceAuthKeys, getSqlMigrationServiceMonitoringData, SqlMigrationService } from '../../api/azure';
|
||||
import { MigrationStateModel, NetworkContainerType } from '../../models/stateMachine';
|
||||
import { logError, TelemetryViews } from '../../telemtery';
|
||||
import * as constants from '../../constants/strings';
|
||||
import * as os from 'os';
|
||||
import { azureResource } from 'azureResource';
|
||||
@@ -497,7 +498,7 @@ export class CreateSqlMigrationServiceDialog {
|
||||
description: e.message,
|
||||
level: azdata.window.MessageLevel.Error
|
||||
};
|
||||
console.log(e);
|
||||
logError(TelemetryViews.CreateDataMigrationServiceDialog, 'FetchSqlMigrationServiceFailed', e);
|
||||
}
|
||||
await new Promise(r => setTimeout(r, 5000));
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ import * as loc from '../../constants/strings';
|
||||
import { convertByteSizeToReadableUnit, convertIsoTimeToLocalTime, getSqlServerName, getMigrationStatusImage, SupportedAutoRefreshIntervals, clearDialogMessage, displayDialogErrorMessage } from '../../api/utils';
|
||||
import { EOL } from 'os';
|
||||
import { ConfirmCutoverDialog } from './confirmCutoverDialog';
|
||||
import { logError, TelemetryViews } from '../../telemtery';
|
||||
import { RetryMigrationDialog } from '../retryMigration/retryMigrationDialog';
|
||||
import * as styles from '../../constants/styles';
|
||||
import { canRetryMigration } from '../../constants/helper';
|
||||
@@ -233,7 +234,7 @@ export class MigrationCutoverDialog {
|
||||
await this.refreshStatus();
|
||||
});
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
logError(TelemetryViews.MigrationCutoverDialog, 'IntializingFailed', e);
|
||||
}
|
||||
});
|
||||
this._dialogObject.content = [tab];
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import { getMigrationStatus, DatabaseMigration, startMigrationCutover, stopMigration, getMigrationAsyncOperationDetails, AzureAsyncOperationResource, BackupFileInfo, getResourceGroupFromId } from '../../api/azure';
|
||||
import { BackupFileInfoStatus, MigrationContext } from '../../models/migrationLocalStorage';
|
||||
import { sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews } from '../../telemtery';
|
||||
import { logError, sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews } from '../../telemtery';
|
||||
import * as constants from '../../constants/strings';
|
||||
import { EOL } from 'os';
|
||||
import { getMigrationTargetType, getMigrationMode } from '../../constants/helper';
|
||||
@@ -71,7 +71,7 @@ export class MigrationCutoverDialogModel {
|
||||
}
|
||||
} catch (error) {
|
||||
this.CutoverError = error;
|
||||
console.log(error);
|
||||
logError(TelemetryViews.MigrationCutoverDialog, 'StartCutoverError', error);
|
||||
}
|
||||
return undefined!;
|
||||
}
|
||||
@@ -111,7 +111,7 @@ export class MigrationCutoverDialogModel {
|
||||
}
|
||||
} catch (error) {
|
||||
this.CancelMigrationError = error;
|
||||
console.log(error);
|
||||
logError(TelemetryViews.MigrationCutoverDialog, 'CancelMigrationError', error);
|
||||
}
|
||||
return undefined!;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
import * as vscode from 'vscode';
|
||||
import { azureResource } from 'azureResource';
|
||||
import { logError, sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews } from '../telemtery';
|
||||
import { DatabaseMigration, SqlMigrationService, SqlManagedInstance, getMigrationStatus, AzureAsyncOperationResource, getMigrationAsyncOperationDetails, SqlVMServer, getSubscriptions } from '../api/azure';
|
||||
import * as azdata from 'azdata';
|
||||
|
||||
@@ -19,7 +20,7 @@ export class MigrationLocalStorage {
|
||||
const undefinedSessionId = '{undefined}';
|
||||
const result: MigrationContext[] = [];
|
||||
const validMigrations: MigrationContext[] = [];
|
||||
|
||||
const startTime = new Date().toString();
|
||||
// fetch saved migrations
|
||||
const migrationMementos: MigrationContext[] = this.context.globalState.get(this.mementoToken) || [];
|
||||
for (let i = 0; i < migrationMementos.length; i++) {
|
||||
@@ -53,7 +54,7 @@ export class MigrationLocalStorage {
|
||||
case 'NullMigrationId':
|
||||
continue;
|
||||
default:
|
||||
console.log(e);
|
||||
logError(TelemetryViews.MigrationLocalStorage, 'MigrationBySourceConnectionError', e);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -62,6 +63,20 @@ export class MigrationLocalStorage {
|
||||
validMigrations.push(migration);
|
||||
}
|
||||
|
||||
await this.context.globalState.update(this.mementoToken, validMigrations);
|
||||
|
||||
sendSqlMigrationActionEvent(
|
||||
TelemetryViews.MigrationLocalStorage,
|
||||
TelemetryAction.Done,
|
||||
{
|
||||
'startTime': startTime,
|
||||
'endTime': new Date().toString()
|
||||
},
|
||||
{
|
||||
'migrationCount': migrationMementos.length
|
||||
}
|
||||
);
|
||||
|
||||
// only save updated migration context
|
||||
if (refreshStatus) {
|
||||
const migrations: MigrationContext[] = this.context.globalState.get(this.mementoToken) || [];
|
||||
@@ -79,7 +94,6 @@ export class MigrationLocalStorage {
|
||||
await this.context.globalState.update(this.mementoToken, migrations);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -121,7 +135,7 @@ export class MigrationLocalStorage {
|
||||
});
|
||||
await this.context.globalState.update(this.mementoToken, migrationMementos);
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
logError(TelemetryViews.MigrationLocalStorage, 'CantSaveMigration', e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,13 +14,18 @@ export enum TelemetryViews {
|
||||
SqlServerDashboard = 'SqlServerDashboard',
|
||||
CreateDataMigrationServiceDialog = 'CreateDataMigrationServiceDialog',
|
||||
AssessmentsDialog = 'AssessmentsDialog',
|
||||
DatabaseBackupPage = 'DatabaseBackupPage',
|
||||
IntegrationRuntimePage = 'IntegrationRuntimePage',
|
||||
MigrationCutoverDialog = 'MigrationCutoverDialog',
|
||||
MigrationStatusDialog = 'MigrationStatusDialog',
|
||||
MigrationWizardAccountSelectionPage = 'MigrationWizardAccountSelectionPage',
|
||||
MigrationWizardTargetSelectionPage = 'MigrationWizardTargetSelectionPage',
|
||||
MigrationWizardIntegrationRuntimePage = 'MigrationWizardIntegrationRuntimePage',
|
||||
MigrationWizardSummaryPage = 'MigrationWizardSummaryPage',
|
||||
MigrationWizardController = 'MigrationWizardController',
|
||||
StartMigrationService = 'StartMigrationSerivce',
|
||||
SqlMigrationWizard = 'SqlMigrationWizard'
|
||||
SqlMigrationWizard = 'SqlMigrationWizard',
|
||||
MigrationLocalStorage = 'MigrationLocalStorage'
|
||||
}
|
||||
|
||||
export enum TelemetryAction {
|
||||
@@ -41,6 +46,11 @@ export enum TelemetryAction {
|
||||
Cancel = 'cancel',
|
||||
}
|
||||
|
||||
export function logError(telemetryView: TelemetryViews, err: string, error: any): void {
|
||||
console.log(error);
|
||||
TelemetryReporter.sendErrorEvent(telemetryView, err);
|
||||
}
|
||||
|
||||
export function sendSqlMigrationActionEvent(telemetryView: TelemetryViews, telemetryAction: TelemetryAction, additionalProps: TelemetryEventProperties, additionalMeasurements: TelemetryEventMeasures): void {
|
||||
TelemetryReporter.createActionEvent(telemetryView, telemetryAction)
|
||||
.withAdditionalProperties(additionalProps)
|
||||
|
||||
@@ -13,6 +13,7 @@ import * as constants from '../constants/strings';
|
||||
import { IconPathHelper } from '../constants/iconPathHelper';
|
||||
import { WIZARD_INPUT_COMPONENT_WIDTH } from './wizardController';
|
||||
import { findDropDownItemIndex, selectDropDownIndex } from '../api/utils';
|
||||
import { logError, TelemetryViews } from '../telemtery';
|
||||
import { azureResource } from 'azureResource';
|
||||
import * as styles from '../constants/styles';
|
||||
|
||||
@@ -1233,7 +1234,7 @@ export class DatabaseBackupPage extends MigrationWizardPage {
|
||||
selectDropDownIndex(this._networkShareStorageAccountResourceGroupDropdown, 0);
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logError(TelemetryViews.DatabaseBackupPage, 'ErrorLoadingNetworkStorageResourceGroup', error);
|
||||
} finally {
|
||||
this._networkShareStorageAccountResourceGroupDropdown.loading = false;
|
||||
await this.loadNetworkShareStorageDropdown();
|
||||
@@ -1246,7 +1247,7 @@ export class DatabaseBackupPage extends MigrationWizardPage {
|
||||
this._networkShareContainerStorageAccountDropdown.values = await this.migrationStateModel.getStorageAccountValues(this.migrationStateModel._databaseBackup.subscription, this.migrationStateModel._databaseBackup.networkShares[0].resourceGroup);
|
||||
selectDropDownIndex(this._networkShareContainerStorageAccountDropdown, 0);
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logError(TelemetryViews.DatabaseBackupPage, 'ErrorLoadingNetworkShareStorageDropdown', error);
|
||||
} finally {
|
||||
this._networkShareContainerStorageAccountDropdown.loading = false;
|
||||
}
|
||||
@@ -1269,7 +1270,7 @@ export class DatabaseBackupPage extends MigrationWizardPage {
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logError(TelemetryViews.DatabaseBackupPage, 'ErrorLoadingBlobResourceGroup', error);
|
||||
} finally {
|
||||
this._blobContainerResourceGroupDropdowns.forEach(v => v.loading = false);
|
||||
}
|
||||
@@ -1289,7 +1290,7 @@ export class DatabaseBackupPage extends MigrationWizardPage {
|
||||
selectDropDownIndex(this._blobContainerStorageAccountDropdowns[index], 0);
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logError(TelemetryViews.DatabaseBackupPage, 'ErrorLoadingBlobStorageDropdown', error);
|
||||
} finally {
|
||||
this._blobContainerStorageAccountDropdowns[index].loading = false;
|
||||
}
|
||||
@@ -1310,7 +1311,7 @@ export class DatabaseBackupPage extends MigrationWizardPage {
|
||||
selectDropDownIndex(this._blobContainerDropdowns[index], 0);
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logError(TelemetryViews.DatabaseBackupPage, 'ErrorLoadingBlobContainers', error);
|
||||
} finally {
|
||||
this._blobContainerDropdowns[index].loading = false;
|
||||
}
|
||||
@@ -1331,7 +1332,7 @@ export class DatabaseBackupPage extends MigrationWizardPage {
|
||||
selectDropDownIndex(this._blobContainerLastBackupFileDropdowns[index], 0);
|
||||
}
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logError(TelemetryViews.DatabaseBackupPage, 'ErrorLoadingBlobLastBackupFiles', error);
|
||||
} finally {
|
||||
this._blobContainerLastBackupFileDropdowns[index].loading = false;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ import * as constants from '../constants/strings';
|
||||
import { WIZARD_INPUT_COMPONENT_WIDTH } from './wizardController';
|
||||
import { getFullResourceGroupFromId, getLocationDisplayName, getSqlMigrationService, getSqlMigrationServiceAuthKeys, getSqlMigrationServiceMonitoringData, SqlManagedInstance, SqlVMServer } from '../api/azure';
|
||||
import { IconPathHelper } from '../constants/iconPathHelper';
|
||||
import { logError, TelemetryViews } from '../telemtery';
|
||||
import { findDropDownItemIndex, selectDropDownIndex } from '../api/utils';
|
||||
import * as styles from '../constants/styles';
|
||||
|
||||
@@ -428,7 +429,7 @@ export class IntergrationRuntimePage extends MigrationWizardPage {
|
||||
try {
|
||||
await this.loadStatus();
|
||||
} catch (error) {
|
||||
console.log(error);
|
||||
logError(TelemetryViews.MigrationWizardIntegrationRuntimePage, 'ErrorLoadingMigrationServiceStatus', error);
|
||||
} finally {
|
||||
this._statusLoadingComponent.loading = false;
|
||||
}
|
||||
@@ -507,7 +508,7 @@ export class IntergrationRuntimePage extends MigrationWizardPage {
|
||||
await this._authKeyTable.setDataValues(data);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
logError(TelemetryViews.IntegrationRuntimePage, 'ErrorLoadingStatus', e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import { IntergrationRuntimePage } from './integrationRuntimePage';
|
||||
import { SummaryPage } from './summaryPage';
|
||||
import { MigrationModePage } from './migrationModePage';
|
||||
import { DatabaseSelectorPage } from './databaseSelectorPage';
|
||||
import { sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews } from '../telemtery';
|
||||
import { sendSqlMigrationActionEvent, TelemetryAction, TelemetryViews, logError } from '../telemtery';
|
||||
import * as styles from '../constants/styles';
|
||||
|
||||
export const WIZARD_INPUT_COMPONENT_WIDTH = '600px';
|
||||
@@ -80,7 +80,7 @@ export class WizardController {
|
||||
this._model.extensionContext.subscriptions.push(this._wizardObject.onPageChanged(async (pageChangeInfo: azdata.window.WizardPageChangeInfo) => {
|
||||
const newPage = pageChangeInfo.newPage;
|
||||
const lastPage = pageChangeInfo.lastPage;
|
||||
this.sendPageButtonClickEvent(pageChangeInfo).catch(e => console.log(e));
|
||||
this.sendPageButtonClickEvent(pageChangeInfo).catch(e => logError(TelemetryViews.MigrationWizardController, 'ErrorSendingPageButtonClick', e));
|
||||
await pages[lastPage]?.onPageLeave(pageChangeInfo);
|
||||
await pages[newPage]?.onPageEnter(pageChangeInfo);
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user