Refactor error handling part 2 (#313)

This commit is contained in:
victor-meng 2020-11-03 13:40:44 -08:00 committed by GitHub
parent a009a8ba5f
commit 5f1f7a8266
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
58 changed files with 229 additions and 336 deletions

View File

@ -58,8 +58,8 @@ export function executeStoredProcedure(
(error: any) => { (error: any) => {
handleError( handleError(
error, error,
`Failed to execute stored procedure ${storedProcedure.id()} for container ${storedProcedure.collection.id()}`, "ExecuteStoredProcedure",
"ExecuteStoredProcedure" `Failed to execute stored procedure ${storedProcedure.id()} for container ${storedProcedure.collection.id()}`
); );
deferred.reject(error); deferred.reject(error);
} }
@ -88,7 +88,7 @@ export function queryDocumentsPage(
deferred.resolve(result); deferred.resolve(result);
}, },
(error: any) => { (error: any) => {
handleError(error, `Failed to query ${entityName} for container ${resourceName}`, "QueryDocumentsPage"); handleError(error, "QueryDocumentsPage", `Failed to query ${entityName} for container ${resourceName}`);
deferred.reject(error); deferred.reject(error);
} }
) )
@ -109,7 +109,7 @@ export function readDocument(collection: ViewModels.CollectionBase, documentId:
deferred.resolve(document); deferred.resolve(document);
}, },
(error: any) => { (error: any) => {
handleError(error, `Failed to read ${entityName} ${documentId.id()}`, "ReadDocument"); handleError(error, "ReadDocument", `Failed to read ${entityName} ${documentId.id()}`);
deferred.reject(error); deferred.reject(error);
} }
) )
@ -135,7 +135,7 @@ export function updateDocument(
deferred.resolve(updatedDocument); deferred.resolve(updatedDocument);
}, },
(error: any) => { (error: any) => {
handleError(error, `Failed to update ${entityName} ${documentId.id()}`, "UpdateDocument"); handleError(error, "UpdateDocument", `Failed to update ${entityName} ${documentId.id()}`);
deferred.reject(error); deferred.reject(error);
} }
) )
@ -157,7 +157,7 @@ export function createDocument(collection: ViewModels.CollectionBase, newDocumen
deferred.resolve(savedDocument); deferred.resolve(savedDocument);
}, },
(error: any) => { (error: any) => {
handleError(error, `Error while creating new ${entityName} for container ${collection.id()}`, "CreateDocument"); handleError(error, "CreateDocument", `Error while creating new ${entityName} for container ${collection.id()}`);
deferred.reject(error); deferred.reject(error);
} }
) )
@ -179,7 +179,7 @@ export function deleteDocument(collection: ViewModels.CollectionBase, documentId
deferred.resolve(response); deferred.resolve(response);
}, },
(error: any) => { (error: any) => {
handleError(error, `Error while deleting ${entityName} ${documentId.id()}`, "DeleteDocument"); handleError(error, "DeleteDocument", `Error while deleting ${entityName} ${documentId.id()}`);
deferred.reject(error); deferred.reject(error);
} }
) )
@ -205,7 +205,7 @@ export function deleteConflict(
deferred.resolve(response); deferred.resolve(response);
}, },
(error: any) => { (error: any) => {
handleError(error, `Error while deleting conflict ${conflictId.id()}`, "DeleteConflict"); handleError(error, "DeleteConflict", `Error while deleting conflict ${conflictId.id()}`);
deferred.reject(error); deferred.reject(error);
} }
) )

View File

@ -1,3 +1,4 @@
import { ARMError } from "../Utils/arm/request";
import { HttpStatusCodes } from "./Constants"; import { HttpStatusCodes } from "./Constants";
import { MessageTypes } from "../Contracts/ExplorerContracts"; import { MessageTypes } from "../Contracts/ExplorerContracts";
import { SubscriptionType } from "../Contracts/ViewModels"; import { SubscriptionType } from "../Contracts/ViewModels";
@ -5,28 +6,27 @@ import { logConsoleError } from "../Utils/NotificationConsoleUtils";
import { logError } from "./Logger"; import { logError } from "./Logger";
import { sendMessage } from "./MessageHandler"; import { sendMessage } from "./MessageHandler";
export interface CosmosError { export const handleError = (error: string | ARMError | Error, area: string, consoleErrorPrefix?: string): void => {
code: number;
message?: string;
}
export const handleError = (error: string | CosmosError, consoleErrorPrefix: string, area: string): void => {
const errorMessage = getErrorMessage(error); const errorMessage = getErrorMessage(error);
const errorCode = typeof error === "string" ? undefined : error.code; const errorCode = error instanceof ARMError ? error.code : undefined;
// logs error to data explorer console // logs error to data explorer console
logConsoleError(`${consoleErrorPrefix}:\n ${errorMessage}`); const consoleErrorMessage = consoleErrorPrefix ? `${consoleErrorPrefix}:\n ${errorMessage}` : errorMessage;
logConsoleError(consoleErrorMessage);
// logs error to both app insight and kusto // logs error to both app insight and kusto
logError(errorMessage, area, errorCode); logError(errorMessage, area, errorCode);
// checks for errors caused by firewall and sends them to portal to handle // checks for errors caused by firewall and sends them to portal to handle
sendNotificationForError(errorMessage, errorCode); sendNotificationForError(errorMessage, errorCode);
}; };
export const getErrorMessage = (error: string | CosmosError | Error): string => { export const getErrorMessage = (error: string | Error): string => {
const errorMessage = typeof error === "string" ? error : error.message; const errorMessage = typeof error === "string" ? error : error.message;
return replaceKnownError(errorMessage); return replaceKnownError(errorMessage);
}; };
const sendNotificationForError = (errorMessage: string, errorCode: number): void => { const sendNotificationForError = (errorMessage: string, errorCode: number | string): void => {
if (errorCode === HttpStatusCodes.Forbidden) { if (errorCode === HttpStatusCodes.Forbidden) {
if (errorMessage?.toLowerCase().indexOf("sharedoffer is disabled for your account") > 0) { if (errorMessage?.toLowerCase().indexOf("sharedoffer is disabled for your account") > 0) {
return; return;

View File

@ -1,4 +1,3 @@
import { CosmosError, getErrorMessage } from "./ErrorHandlingUtils";
import { sendMessage } from "./MessageHandler"; import { sendMessage } from "./MessageHandler";
import { Diagnostics, MessageTypes } from "../Contracts/ExplorerContracts"; import { Diagnostics, MessageTypes } from "../Contracts/ExplorerContracts";
import { appInsights } from "../Shared/appInsights"; import { appInsights } from "../Shared/appInsights";
@ -22,8 +21,7 @@ export function logWarning(message: string, area: string, code?: number): void {
return _logEntry(entry); return _logEntry(entry);
} }
export function logError(error: string | CosmosError | Error, area: string, code?: number): void { export function logError(errorMessage: string, area: string, code?: number | string): void {
const errorMessage: string = getErrorMessage(error);
const entry: Diagnostics.LogEntry = _generateLogEntry(Diagnostics.LogEntryLevel.Error, errorMessage, area, code); const entry: Diagnostics.LogEntry = _generateLogEntry(Diagnostics.LogEntryLevel.Error, errorMessage, area, code);
return _logEntry(entry); return _logEntry(entry);
} }
@ -55,7 +53,7 @@ function _generateLogEntry(
level: Diagnostics.LogEntryLevel, level: Diagnostics.LogEntryLevel,
message: string, message: string,
area: string, area: string,
code?: number code?: number | string
): Diagnostics.LogEntry { ): Diagnostics.LogEntry {
return { return {
timestamp: new Date().getUTCSeconds(), timestamp: new Date().getUTCSeconds(),

View File

@ -14,7 +14,6 @@ import { createDocument, deleteDocument, queryDocuments, queryDocumentsPage } fr
import { createCollection } from "./dataAccess/createCollection"; import { createCollection } from "./dataAccess/createCollection";
import { handleError } from "./ErrorHandlingUtils"; import { handleError } from "./ErrorHandlingUtils";
import * as ErrorParserUtility from "./ErrorParserUtility"; import * as ErrorParserUtility from "./ErrorParserUtility";
import * as Logger from "./Logger";
export class QueriesClient { export class QueriesClient {
private static readonly PartitionKey: DataModels.PartitionKey = { private static readonly PartitionKey: DataModels.PartitionKey = {
@ -54,7 +53,7 @@ export class QueriesClient {
return Promise.resolve(collection); return Promise.resolve(collection);
}, },
(error: any) => { (error: any) => {
handleError(error, "Failed to set up account for saving queries", "setupQueriesCollection"); handleError(error, "setupQueriesCollection", "Failed to set up account for saving queries");
return Promise.reject(error); return Promise.reject(error);
} }
) )
@ -105,11 +104,7 @@ export class QueriesClient {
} else { } else {
errorMessage = parsedError.message; errorMessage = parsedError.message;
} }
NotificationConsoleUtils.logConsoleMessage( handleError(errorMessage, "saveQuery", `Failed to save query ${query.queryName}`);
ConsoleDataType.Error,
`Failed to save query ${query.queryName}: ${errorMessage}`
);
Logger.logError(JSON.stringify(parsedError), "saveQuery");
return Promise.reject(errorMessage); return Promise.reject(errorMessage);
} }
) )
@ -159,14 +154,14 @@ export class QueriesClient {
return Promise.resolve(queries); return Promise.resolve(queries);
}, },
(error: any) => { (error: any) => {
handleError(error, "Failed to fetch saved queries", "getSavedQueries"); handleError(error, "getSavedQueries", "Failed to fetch saved queries");
return Promise.reject(error); return Promise.reject(error);
} }
); );
}, },
(error: any) => { (error: any) => {
// should never get into this state but we handle this regardless // should never get into this state but we handle this regardless
handleError(error, "Failed to fetch saved queries", "getSavedQueries"); handleError(error, "getSavedQueries", "Failed to fetch saved queries");
return Promise.reject(error); return Promise.reject(error);
} }
) )
@ -218,7 +213,7 @@ export class QueriesClient {
return Promise.resolve(); return Promise.resolve();
}, },
(error: any) => { (error: any) => {
handleError(error, `Failed to delete query ${query.queryName}`, "deleteQuery"); handleError(error, "deleteQuery", `Failed to delete query ${query.queryName}`);
return Promise.reject(error); return Promise.reject(error);
} }
) )

View File

@ -55,7 +55,7 @@ export const createCollection = async (params: DataModels.CreateCollectionParams
logConsoleInfo(`Successfully created container ${params.collectionId}`); logConsoleInfo(`Successfully created container ${params.collectionId}`);
return collection; return collection;
} catch (error) { } catch (error) {
handleError(error, `Error while creating container ${params.collectionId}`, "CreateCollection"); handleError(error, "CreateCollection", `Error while creating container ${params.collectionId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -41,7 +41,7 @@ export async function createDatabase(params: DataModels.CreateDatabaseParams): P
logConsoleInfo(`Successfully created database ${params.databaseId}`); logConsoleInfo(`Successfully created database ${params.databaseId}`);
return database; return database;
} catch (error) { } catch (error) {
handleError(error, `Error while creating database ${params.databaseId}`, "CreateDatabase"); handleError(error, "CreateDatabase", `Error while creating database ${params.databaseId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -70,7 +70,7 @@ export async function createStoredProcedure(
.scripts.storedProcedures.create(storedProcedure); .scripts.storedProcedures.create(storedProcedure);
return response?.resource; return response?.resource;
} catch (error) { } catch (error) {
handleError(error, `Error while creating stored procedure ${storedProcedure.id}`, "CreateStoredProcedure"); handleError(error, "CreateStoredProcedure", `Error while creating stored procedure ${storedProcedure.id}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -65,7 +65,7 @@ export async function createTrigger(
.scripts.triggers.create(trigger); .scripts.triggers.create(trigger);
return response.resource; return response.resource;
} catch (error) { } catch (error) {
handleError(error, `Error while creating trigger ${trigger.id}`, "CreateTrigger"); handleError(error, "CreateTrigger", `Error while creating trigger ${trigger.id}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -72,8 +72,8 @@ export async function createUserDefinedFunction(
} catch (error) { } catch (error) {
handleError( handleError(
error, error,
`Error while creating user defined function ${userDefinedFunction.id}`, "CreateUserupdateUserDefinedFunction",
"CreateUserupdateUserDefinedFunction" `Error while creating user defined function ${userDefinedFunction.id}`
); );
throw error; throw error;
} finally { } finally {

View File

@ -23,7 +23,7 @@ export async function deleteCollection(databaseId: string, collectionId: string)
} }
logConsoleInfo(`Successfully deleted container ${collectionId}`); logConsoleInfo(`Successfully deleted container ${collectionId}`);
} catch (error) { } catch (error) {
handleError(error, `Error while deleting container ${collectionId}`, "DeleteCollection"); handleError(error, "DeleteCollection", `Error while deleting container ${collectionId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -25,7 +25,7 @@ export async function deleteDatabase(databaseId: string): Promise<void> {
} }
logConsoleInfo(`Successfully deleted database ${databaseId}`); logConsoleInfo(`Successfully deleted database ${databaseId}`);
} catch (error) { } catch (error) {
handleError(error, `Error while deleting database ${databaseId}`, "DeleteDatabase"); handleError(error, "DeleteDatabase", `Error while deleting database ${databaseId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -34,7 +34,7 @@ export async function deleteStoredProcedure(
.delete(); .delete();
} }
} catch (error) { } catch (error) {
handleError(error, `Error while deleting stored procedure ${storedProcedureId}`, "DeleteStoredProcedure"); handleError(error, "DeleteStoredProcedure", `Error while deleting stored procedure ${storedProcedureId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -30,7 +30,7 @@ export async function deleteTrigger(databaseId: string, collectionId: string, tr
.delete(); .delete();
} }
} catch (error) { } catch (error) {
handleError(error, `Error while deleting trigger ${triggerId}`, "DeleteTrigger"); handleError(error, "DeleteTrigger", `Error while deleting trigger ${triggerId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -30,7 +30,7 @@ export async function deleteUserDefinedFunction(databaseId: string, collectionId
.delete(); .delete();
} }
} catch (error) { } catch (error) {
handleError(error, `Error while deleting user defined function ${id}`, "DeleteUserDefinedFunction"); handleError(error, "DeleteUserDefinedFunction", `Error while deleting user defined function ${id}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -20,7 +20,7 @@ export async function getIndexTransformationProgress(databaseId: string, collect
response.headers[Constants.HttpHeaders.collectionIndexTransformationProgress] as string response.headers[Constants.HttpHeaders.collectionIndexTransformationProgress] as string
); );
} catch (error) { } catch (error) {
handleError(error, `Error while reading container ${collectionId}`, "ReadMongoDBCollection"); handleError(error, "ReadMongoDBCollection", `Error while reading container ${collectionId}`);
throw error; throw error;
} }
clearMessage(); clearMessage();

View File

@ -13,7 +13,7 @@ export async function readCollection(databaseId: string, collectionId: string):
.read(); .read();
collection = response.resource as DataModels.Collection; collection = response.resource as DataModels.Collection;
} catch (error) { } catch (error) {
handleError(error, `Error while querying container ${collectionId}`, "ReadCollection"); handleError(error, "ReadCollection", `Error while querying container ${collectionId}`);
throw error; throw error;
} }
clearMessage(); clearMessage();

View File

@ -56,7 +56,7 @@ export const readCollectionOffer = async (
} }
); );
} catch (error) { } catch (error) {
handleError(error, `Error while querying offer for collection ${params.collectionId}`, "ReadCollectionOffer"); handleError(error, "ReadCollectionOffer", `Error while querying offer for collection ${params.collectionId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -37,7 +37,7 @@ export const readCollectionQuotaInfo = async (
return quota; return quota;
} catch (error) { } catch (error) {
handleError(error, `Error while querying quota info for container ${collection.id}`, "ReadCollectionQuotaInfo"); handleError(error, "ReadCollectionQuotaInfo", `Error while querying quota info for container ${collection.id}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -29,7 +29,7 @@ export async function readCollections(databaseId: string): Promise<DataModels.Co
.fetchAll(); .fetchAll();
return sdkResponse.resources as DataModels.Collection[]; return sdkResponse.resources as DataModels.Collection[];
} catch (error) { } catch (error) {
handleError(error, `Error while querying containers for database ${databaseId}`, "ReadCollections"); handleError(error, "ReadCollections", `Error while querying containers for database ${databaseId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -47,7 +47,7 @@ export const readDatabaseOffer = async (
} }
); );
} catch (error) { } catch (error) {
handleError(error, `Error while querying offer for database ${params.databaseId}`, "ReadDatabaseOffer"); handleError(error, "ReadDatabaseOffer", `Error while querying offer for database ${params.databaseId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -27,7 +27,7 @@ export async function readDatabases(): Promise<DataModels.Database[]> {
databases = sdkResponse.resources as DataModels.Database[]; databases = sdkResponse.resources as DataModels.Database[];
} }
} catch (error) { } catch (error) {
handleError(error, `Error while querying databases`, "ReadDatabases"); handleError(error, "ReadDatabases", `Error while querying databases`);
throw error; throw error;
} }
clearMessage(); clearMessage();

View File

@ -22,7 +22,7 @@ export async function readMongoDBCollectionThroughRP(
const response = await getMongoDBCollection(subscriptionId, resourceGroup, accountName, databaseId, collectionId); const response = await getMongoDBCollection(subscriptionId, resourceGroup, accountName, databaseId, collectionId);
collection = response.properties.resource; collection = response.properties.resource;
} catch (error) { } catch (error) {
handleError(error, `Error while reading container ${collectionId}`, "ReadMongoDBCollection"); handleError(error, "ReadMongoDBCollection", `Error while reading container ${collectionId}`);
throw error; throw error;
} }
clearMessage(); clearMessage();

View File

@ -17,7 +17,7 @@ export const readOffers = async (): Promise<Offer[]> => {
return []; return [];
} }
handleError(error, `Error while querying offers`, "ReadOffers"); handleError(error, "ReadOffers", `Error while querying offers`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -35,7 +35,7 @@ export async function readStoredProcedures(
.fetchAll(); .fetchAll();
return response?.resources; return response?.resources;
} catch (error) { } catch (error) {
handleError(error, `Failed to query stored procedures for container ${collectionId}`, "ReadStoredProcedures"); handleError(error, "ReadStoredProcedures", `Failed to query stored procedures for container ${collectionId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -35,7 +35,7 @@ export async function readTriggers(
.fetchAll(); .fetchAll();
return response?.resources; return response?.resources;
} catch (error) { } catch (error) {
handleError(error, `Failed to query triggers for container ${collectionId}`, "ReadTriggers"); handleError(error, "ReadTriggers", `Failed to query triggers for container ${collectionId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -37,8 +37,8 @@ export async function readUserDefinedFunctions(
} catch (error) { } catch (error) {
handleError( handleError(
error, error,
`Failed to query user defined functions for container ${collectionId}`, "ReadUserDefinedFunctions",
"ReadUserDefinedFunctions" `Failed to query user defined functions for container ${collectionId}`
); );
throw error; throw error;
} finally { } finally {

View File

@ -59,7 +59,7 @@ export async function updateCollection(
logConsoleInfo(`Successfully updated container ${collectionId}`); logConsoleInfo(`Successfully updated container ${collectionId}`);
return collection; return collection;
} catch (error) { } catch (error) {
handleError(error, `Failed to update container ${collectionId}`, "UpdateCollection"); handleError(error, "UpdateCollection", `Failed to update container ${collectionId}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -72,7 +72,7 @@ export const updateOffer = async (params: UpdateOfferParams): Promise<Offer> =>
logConsoleInfo(`Successfully updated offer for ${offerResourceText}`); logConsoleInfo(`Successfully updated offer for ${offerResourceText}`);
return updatedOffer; return updatedOffer;
} catch (error) { } catch (error) {
handleError(error, `Error updating offer for ${offerResourceText}`, "UpdateCollection"); handleError(error, "UpdateCollection", `Error updating offer for ${offerResourceText}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -49,8 +49,8 @@ export async function updateOfferThroughputBeyondLimit(request: UpdateOfferThrou
const error = await response.json(); const error = await response.json();
handleError( handleError(
error, error,
`Failed to request an increase in throughput for ${request.throughput}`, "updateOfferThroughputBeyondLimit",
"updateOfferThroughputBeyondLimit" `Failed to request an increase in throughput for ${request.throughput}`
); );
clearMessage(); clearMessage();
throw error; throw error;

View File

@ -64,7 +64,7 @@ export async function updateStoredProcedure(
.replace(storedProcedure); .replace(storedProcedure);
return response?.resource; return response?.resource;
} catch (error) { } catch (error) {
handleError(error, `Error while updating stored procedure ${storedProcedure.id}`, "UpdateStoredProcedure"); handleError(error, "UpdateStoredProcedure", `Error while updating stored procedure ${storedProcedure.id}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -61,7 +61,7 @@ export async function updateTrigger(
.replace(trigger); .replace(trigger);
return response?.resource; return response?.resource;
} catch (error) { } catch (error) {
handleError(error, `Error while updating trigger ${trigger.id}`, "UpdateTrigger"); handleError(error, "UpdateTrigger", `Error while updating trigger ${trigger.id}`);
throw error; throw error;
} finally { } finally {
clearMessage(); clearMessage();

View File

@ -66,8 +66,8 @@ export async function updateUserDefinedFunction(
} catch (error) { } catch (error) {
handleError( handleError(
error, error,
`Error while updating user defined function ${userDefinedFunction.id}`, "UpdateUserupdateUserDefinedFunction",
"UpdateUserupdateUserDefinedFunction" `Error while updating user defined function ${userDefinedFunction.id}`
); );
throw error; throw error;
} finally { } finally {

View File

@ -46,7 +46,7 @@ export interface LogEntry {
/** /**
* The message code. * The message code.
*/ */
code?: number; code?: number | string;
/** /**
* Any additional data to be logged. * Any additional data to be logged.
*/ */

View File

@ -1,12 +1,9 @@
import * as React from "react"; import * as React from "react";
import { ArcadiaWorkspace, SparkPool } from "../../../Contracts/DataModels"; import { ArcadiaWorkspace, SparkPool } from "../../../Contracts/DataModels";
import { DefaultButton, IButtonStyles } from "office-ui-fabric-react/lib/Button"; import { DefaultButton, IButtonStyles } from "office-ui-fabric-react/lib/Button";
import { import { IContextualMenuItem, IContextualMenuProps } from "office-ui-fabric-react/lib/ContextualMenu";
IContextualMenuItem,
IContextualMenuProps,
ContextualMenuItemType
} from "office-ui-fabric-react/lib/ContextualMenu";
import * as Logger from "../../../Common/Logger"; import * as Logger from "../../../Common/Logger";
import { getErrorMessage } from "../../../Common/ErrorHandlingUtils";
export interface ArcadiaMenuPickerProps { export interface ArcadiaMenuPickerProps {
selectText?: string; selectText?: string;
@ -47,7 +44,7 @@ export class ArcadiaMenuPicker extends React.Component<ArcadiaMenuPickerProps, A
selectedSparkPool: item.text selectedSparkPool: item.text
}); });
} catch (error) { } catch (error) {
Logger.logError(error, "ArcadiaMenuPicker/_onSparkPoolClicked"); Logger.logError(getErrorMessage(error), "ArcadiaMenuPicker/_onSparkPoolClicked");
throw error; throw error;
} }
}; };

View File

@ -4,12 +4,10 @@
import * as React from "react"; import * as React from "react";
import * as DataModels from "../../../Contracts/DataModels"; import * as DataModels from "../../../Contracts/DataModels";
import * as Logger from "../../../Common/Logger";
import * as NotificationConsoleUtils from "../../../Utils/NotificationConsoleUtils";
import { ConsoleDataType } from "../../Menus/NotificationConsole/NotificationConsoleComponent";
import { StringUtils } from "../../../Utils/StringUtils"; import { StringUtils } from "../../../Utils/StringUtils";
import { userContext } from "../../../UserContext"; import { userContext } from "../../../UserContext";
import { TerminalQueryParams } from "../../../Common/Constants"; import { TerminalQueryParams } from "../../../Common/Constants";
import { handleError } from "../../../Common/ErrorHandlingUtils";
export interface NotebookTerminalComponentProps { export interface NotebookTerminalComponentProps {
notebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo; notebookServerInfo: DataModels.NotebookWorkspaceConnectionInfo;
@ -71,9 +69,10 @@ export class NotebookTerminalComponent extends React.Component<NotebookTerminalC
params: Map<string, string> params: Map<string, string>
): string { ): string {
if (!serverInfo.notebookServerEndpoint) { if (!serverInfo.notebookServerEndpoint) {
const error = "Notebook server endpoint not defined. Terminal will fail to connect to jupyter server."; handleError(
Logger.logError(error, "NotebookTerminalComponent/createNotebookAppSrc"); "Notebook server endpoint not defined. Terminal will fail to connect to jupyter server.",
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, error); "NotebookTerminalComponent/createNotebookAppSrc"
);
return ""; return "";
} }

View File

@ -1,9 +1,8 @@
import * as React from "react"; import * as React from "react";
import { JunoClient } from "../../../Juno/JunoClient"; import { JunoClient } from "../../../Juno/JunoClient";
import { HttpStatusCodes, CodeOfConductEndpoints } from "../../../Common/Constants"; import { HttpStatusCodes, CodeOfConductEndpoints } from "../../../Common/Constants";
import * as Logger from "../../../Common/Logger";
import { logConsoleError } from "../../../Utils/NotificationConsoleUtils";
import { Stack, Text, Checkbox, PrimaryButton, Link } from "office-ui-fabric-react"; import { Stack, Text, Checkbox, PrimaryButton, Link } from "office-ui-fabric-react";
import { handleError } from "../../../Common/ErrorHandlingUtils";
export interface CodeOfConductComponentProps { export interface CodeOfConductComponentProps {
junoClient: JunoClient; junoClient: JunoClient;
@ -45,9 +44,7 @@ export class CodeOfConductComponent extends React.Component<CodeOfConductCompone
this.props.onAcceptCodeOfConduct(response.data); this.props.onAcceptCodeOfConduct(response.data);
} catch (error) { } catch (error) {
const message = `Failed to accept code of conduct: ${error}`; handleError(error, "CodeOfConductComponent/acceptCodeOfConduct", "Failed to accept code of conduct");
Logger.logError(message, "CodeOfConductComponent/acceptCodeOfConduct");
logConsoleError(message);
} }
} }

View File

@ -16,11 +16,8 @@ import {
Text Text
} from "office-ui-fabric-react"; } from "office-ui-fabric-react";
import * as React from "react"; import * as React from "react";
import * as Logger from "../../../Common/Logger";
import { IGalleryItem, JunoClient, IJunoResponse, IPublicGalleryData } from "../../../Juno/JunoClient"; import { IGalleryItem, JunoClient, IJunoResponse, IPublicGalleryData } from "../../../Juno/JunoClient";
import * as GalleryUtils from "../../../Utils/GalleryUtils"; import * as GalleryUtils from "../../../Utils/GalleryUtils";
import * as NotificationConsoleUtils from "../../../Utils/NotificationConsoleUtils";
import { ConsoleDataType } from "../../Menus/NotificationConsole/NotificationConsoleComponent";
import { DialogComponent, DialogProps } from "../DialogReactComponent/DialogComponent"; import { DialogComponent, DialogProps } from "../DialogReactComponent/DialogComponent";
import { GalleryCardComponent, GalleryCardComponentProps } from "./Cards/GalleryCardComponent"; import { GalleryCardComponent, GalleryCardComponentProps } from "./Cards/GalleryCardComponent";
import "./GalleryViewerComponent.less"; import "./GalleryViewerComponent.less";
@ -28,6 +25,7 @@ import { HttpStatusCodes } from "../../../Common/Constants";
import Explorer from "../../Explorer"; import Explorer from "../../Explorer";
import { CodeOfConductComponent } from "./CodeOfConductComponent"; import { CodeOfConductComponent } from "./CodeOfConductComponent";
import { InfoComponent } from "./InfoComponent/InfoComponent"; import { InfoComponent } from "./InfoComponent/InfoComponent";
import { handleError } from "../../../Common/ErrorHandlingUtils";
export interface GalleryViewerComponentProps { export interface GalleryViewerComponentProps {
container?: Explorer; container?: Explorer;
@ -354,9 +352,7 @@ export class GalleryViewerComponent extends React.Component<GalleryViewerCompone
this.sampleNotebooks = response.data; this.sampleNotebooks = response.data;
} catch (error) { } catch (error) {
const message = `Failed to load sample notebooks: ${error}`; handleError(error, "GalleryViewerComponent/loadSampleNotebooks", "Failed to load sample notebooks");
Logger.logError(message, "GalleryViewerComponent/loadSampleNotebooks");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
} }
@ -382,9 +378,7 @@ export class GalleryViewerComponent extends React.Component<GalleryViewerCompone
throw new Error(`Received HTTP ${response.status} when loading public notebooks`); throw new Error(`Received HTTP ${response.status} when loading public notebooks`);
} }
} catch (error) { } catch (error) {
const message = `Failed to load public notebooks: ${error}`; handleError(error, "GalleryViewerComponent/loadPublicNotebooks", "Failed to load public notebooks");
Logger.logError(message, "GalleryViewerComponent/loadPublicNotebooks");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
} }
@ -404,9 +398,7 @@ export class GalleryViewerComponent extends React.Component<GalleryViewerCompone
this.favoriteNotebooks = response.data; this.favoriteNotebooks = response.data;
} catch (error) { } catch (error) {
const message = `Failed to load favorite notebooks: ${error}`; handleError(error, "GalleryViewerComponent/loadFavoriteNotebooks", "Failed to load favorite notebooks");
Logger.logError(message, "GalleryViewerComponent/loadFavoriteNotebooks");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
} }
@ -432,9 +424,7 @@ export class GalleryViewerComponent extends React.Component<GalleryViewerCompone
this.publishedNotebooks = response.data; this.publishedNotebooks = response.data;
} catch (error) { } catch (error) {
const message = `Failed to load published notebooks: ${error}`; handleError(error, "GalleryViewerComponent/loadPublishedNotebooks", "Failed to load published notebooks");
Logger.logError(message, "GalleryViewerComponent/loadPublishedNotebooks");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
} }

View File

@ -21,6 +21,7 @@ import Explorer from "../../Explorer";
import { NotebookV4 } from "@nteract/commutable/lib/v4"; import { NotebookV4 } from "@nteract/commutable/lib/v4";
import { SessionStorageUtility } from "../../../Shared/StorageUtility"; import { SessionStorageUtility } from "../../../Shared/StorageUtility";
import { DialogHost } from "../../../Utils/GalleryUtils"; import { DialogHost } from "../../../Utils/GalleryUtils";
import { getErrorMessage, handleError } from "../../../Common/ErrorHandlingUtils";
export interface NotebookViewerComponentProps { export interface NotebookViewerComponentProps {
container?: Explorer; container?: Explorer;
@ -100,9 +101,7 @@ export class NotebookViewerComponent extends React.Component<NotebookViewerCompo
} }
} catch (error) { } catch (error) {
this.setState({ showProgressBar: false }); this.setState({ showProgressBar: false });
const message = `Failed to load notebook content: ${error}`; handleError(error, "NotebookViewerComponent/loadNotebookContent", "Failed to load notebook content");
Logger.logError(message, "NotebookViewerComponent/loadNotebookContent");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
} }

View File

@ -46,7 +46,7 @@ export class IndexingPolicyRefreshComponent extends React.Component<
try { try {
await this.props.refreshIndexTransformationProgress(); await this.props.refreshIndexTransformationProgress();
} catch (error) { } catch (error) {
handleError(error, "Refreshing index transformation progress failed.", "RefreshIndexTransformationProgress"); handleError(error, "RefreshIndexTransformationProgress", "Refreshing index transformation progress failed");
} finally { } finally {
this.setState({ isRefreshing: false }); this.setState({ isRefreshing: false });
} }

View File

@ -1533,7 +1533,7 @@ export default class Explorer {
resolve(token); resolve(token);
}, },
(error: any) => { (error: any) => {
Logger.logError(error, "Explorer/getArcadiaToken"); Logger.logError(getErrorMessage(error), "Explorer/getArcadiaToken");
resolve(undefined); resolve(undefined);
} }
); );
@ -1551,7 +1551,7 @@ export default class Explorer {
workspaceItems[i] = { ...workspace, sparkPools: sparkpools }; workspaceItems[i] = { ...workspace, sparkPools: sparkpools };
}, },
error => { error => {
Logger.logError(error, "Explorer/this._arcadiaManager.listSparkPoolsAsync"); Logger.logError(getErrorMessage(error), "Explorer/this._arcadiaManager.listSparkPoolsAsync");
} }
); );
sparkPromises.push(promise); sparkPromises.push(promise);
@ -1559,7 +1559,7 @@ export default class Explorer {
return Promise.all(sparkPromises).then(() => workspaceItems); return Promise.all(sparkPromises).then(() => workspaceItems);
} catch (error) { } catch (error) {
handleError(error, "Get Arcadia workspaces failed", "Explorer/this._arcadiaManager.listWorkspacesAsync"); handleError(error, "Explorer/this._arcadiaManager.listWorkspacesAsync", "Get Arcadia workspaces failed");
return Promise.resolve([]); return Promise.resolve([]);
} }
} }
@ -1596,8 +1596,8 @@ export default class Explorer {
this._isInitializingNotebooks = false; this._isInitializingNotebooks = false;
handleError( handleError(
error, error,
`Failed to get notebook workspace connection info: ${getErrorMessage(error)}`, "initNotebooks/getNotebookConnectionInfoAsync",
"initNotebooks/getNotebookConnectionInfoAsync" `Failed to get notebook workspace connection info: ${getErrorMessage(error)}`
); );
throw error; throw error;
} finally { } finally {
@ -1620,9 +1620,10 @@ export default class Explorer {
public resetNotebookWorkspace() { public resetNotebookWorkspace() {
if (!this.isNotebookEnabled() || !this.notebookManager?.notebookClient) { if (!this.isNotebookEnabled() || !this.notebookManager?.notebookClient) {
const error = "Attempt to reset notebook workspace, but notebook is not enabled"; handleError(
Logger.logError(error, "Explorer/resetNotebookWorkspace"); "Attempt to reset notebook workspace, but notebook is not enabled",
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, error); "Explorer/resetNotebookWorkspace"
);
return; return;
} }
const resetConfirmationDialogProps: DialogProps = { const resetConfirmationDialogProps: DialogProps = {
@ -1647,7 +1648,7 @@ export default class Explorer {
const workspaces = await this.notebookWorkspaceManager.getNotebookWorkspacesAsync(databaseAccount?.id); const workspaces = await this.notebookWorkspaceManager.getNotebookWorkspacesAsync(databaseAccount?.id);
return workspaces && workspaces.length > 0 && workspaces.some(workspace => workspace.name === "default"); return workspaces && workspaces.length > 0 && workspaces.some(workspace => workspace.name === "default");
} catch (error) { } catch (error) {
Logger.logError(error, "Explorer/_containsDefaultNotebookWorkspace"); Logger.logError(getErrorMessage(error), "Explorer/_containsDefaultNotebookWorkspace");
return false; return false;
} }
} }
@ -1673,7 +1674,7 @@ export default class Explorer {
await this.notebookWorkspaceManager.startNotebookWorkspaceAsync(this.databaseAccount().id, "default"); await this.notebookWorkspaceManager.startNotebookWorkspaceAsync(this.databaseAccount().id, "default");
} }
} catch (error) { } catch (error) {
handleError(error, "Failed to initialize notebook workspace", "Explorer/ensureNotebookWorkspaceRunning"); handleError(error, "Explorer/ensureNotebookWorkspaceRunning", "Failed to initialize notebook workspace");
} finally { } finally {
clearMessage && clearMessage(); clearMessage && clearMessage();
} }
@ -2221,8 +2222,7 @@ export default class Explorer {
public uploadFile(name: string, content: string, parent: NotebookContentItem): Promise<NotebookContentItem> { public uploadFile(name: string, content: string, parent: NotebookContentItem): Promise<NotebookContentItem> {
if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) { if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) {
const error = "Attempt to upload notebook, but notebook is not enabled"; const error = "Attempt to upload notebook, but notebook is not enabled";
Logger.logError(error, "Explorer/uploadFile"); handleError(error, "Explorer/uploadFile");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, error);
throw new Error(error); throw new Error(error);
} }
@ -2403,8 +2403,7 @@ export default class Explorer {
public renameNotebook(notebookFile: NotebookContentItem): Q.Promise<NotebookContentItem> { public renameNotebook(notebookFile: NotebookContentItem): Q.Promise<NotebookContentItem> {
if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) { if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) {
const error = "Attempt to rename notebook, but notebook is not enabled"; const error = "Attempt to rename notebook, but notebook is not enabled";
Logger.logError(error, "Explorer/renameNotebook"); handleError(error, "Explorer/renameNotebook");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, error);
throw new Error(error); throw new Error(error);
} }
@ -2452,8 +2451,7 @@ export default class Explorer {
public onCreateDirectory(parent: NotebookContentItem): Q.Promise<NotebookContentItem> { public onCreateDirectory(parent: NotebookContentItem): Q.Promise<NotebookContentItem> {
if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) { if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) {
const error = "Attempt to create notebook directory, but notebook is not enabled"; const error = "Attempt to create notebook directory, but notebook is not enabled";
Logger.logError(error, "Explorer/onCreateDirectory"); handleError(error, "Explorer/onCreateDirectory");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, error);
throw new Error(error); throw new Error(error);
} }
@ -2474,8 +2472,7 @@ export default class Explorer {
public readFile(notebookFile: NotebookContentItem): Promise<string> { public readFile(notebookFile: NotebookContentItem): Promise<string> {
if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) { if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) {
const error = "Attempt to read file, but notebook is not enabled"; const error = "Attempt to read file, but notebook is not enabled";
Logger.logError(error, "Explorer/downloadFile"); handleError(error, "Explorer/downloadFile");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, error);
throw new Error(error); throw new Error(error);
} }
@ -2485,8 +2482,7 @@ export default class Explorer {
public downloadFile(notebookFile: NotebookContentItem): Promise<void> { public downloadFile(notebookFile: NotebookContentItem): Promise<void> {
if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) { if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) {
const error = "Attempt to download file, but notebook is not enabled"; const error = "Attempt to download file, but notebook is not enabled";
Logger.logError(error, "Explorer/downloadFile"); handleError(error, "Explorer/downloadFile");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, error);
throw new Error(error); throw new Error(error);
} }
@ -2567,7 +2563,7 @@ export default class Explorer {
); );
this.isNotebooksEnabledForAccount(isAccountInAllowedLocation); this.isNotebooksEnabledForAccount(isAccountInAllowedLocation);
} catch (error) { } catch (error) {
Logger.logError(error, "Explorer/isNotebooksEnabledForAccount"); Logger.logError(getErrorMessage(error), "Explorer/isNotebooksEnabledForAccount");
this.isNotebooksEnabledForAccount(false); this.isNotebooksEnabledForAccount(false);
} }
} }
@ -2596,7 +2592,7 @@ export default class Explorer {
false; false;
this.isSparkEnabledForAccount(isEnabled); this.isSparkEnabledForAccount(isEnabled);
} catch (error) { } catch (error) {
Logger.logError(error, "Explorer/isSparkEnabledForAccount"); Logger.logError(getErrorMessage(error), "Explorer/isSparkEnabledForAccount");
this.isSparkEnabledForAccount(false); this.isSparkEnabledForAccount(false);
} }
}; };
@ -2621,7 +2617,7 @@ export default class Explorer {
(featureStatus && featureStatus.properties && featureStatus.properties.state === "Registered") || false; (featureStatus && featureStatus.properties && featureStatus.properties.state === "Registered") || false;
return isEnabled; return isEnabled;
} catch (error) { } catch (error) {
Logger.logError(error, "Explorer/isSparkEnabledForAccount"); Logger.logError(getErrorMessage(error), "Explorer/isSparkEnabledForAccount");
return false; return false;
} }
}; };
@ -2640,8 +2636,7 @@ export default class Explorer {
public deleteNotebookFile(item: NotebookContentItem): Promise<void> { public deleteNotebookFile(item: NotebookContentItem): Promise<void> {
if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) { if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) {
const error = "Attempt to delete notebook file, but notebook is not enabled"; const error = "Attempt to delete notebook file, but notebook is not enabled";
Logger.logError(error, "Explorer/deleteNotebookFile"); handleError(error, "Explorer/deleteNotebookFile");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, error);
throw new Error(error); throw new Error(error);
} }
@ -2690,8 +2685,7 @@ export default class Explorer {
public onNewNotebookClicked(parent?: NotebookContentItem): void { public onNewNotebookClicked(parent?: NotebookContentItem): void {
if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) { if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) {
const error = "Attempt to create new notebook, but notebook is not enabled"; const error = "Attempt to create new notebook, but notebook is not enabled";
Logger.logError(error, "Explorer/onNewNotebookClicked"); handleError(error, "Explorer/onNewNotebookClicked");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, error);
throw new Error(error); throw new Error(error);
} }
@ -2776,8 +2770,7 @@ export default class Explorer {
public refreshContentItem(item: NotebookContentItem): Promise<void> { public refreshContentItem(item: NotebookContentItem): Promise<void> {
if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) { if (!this.isNotebookEnabled() || !this.notebookManager?.notebookContentClient) {
const error = "Attempt to refresh notebook list, but notebook is not enabled"; const error = "Attempt to refresh notebook list, but notebook is not enabled";
Logger.logError(error, "Explorer/refreshContentItem"); handleError(error, "Explorer/refreshContentItem");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, error);
return Promise.reject(new Error(error)); return Promise.reject(new Error(error));
} }
@ -2963,7 +2956,7 @@ export default class Explorer {
} }
return tokenRefreshInterval; return tokenRefreshInterval;
} catch (error) { } catch (error) {
Logger.logError(error, "Explorer/getTokenRefreshInterval"); Logger.logError(getErrorMessage(error), "Explorer/getTokenRefreshInterval");
return tokenRefreshInterval; return tokenRefreshInterval;
} }
} }

View File

@ -94,7 +94,7 @@ describe("Gremlin Client", () => {
it("should log and display error out on unknown requestId", () => { it("should log and display error out on unknown requestId", () => {
const gremlinClient = new GremlinClient(); const gremlinClient = new GremlinClient();
const logConsoleSpy = sinon.spy(NotificationConsoleUtils, "logConsoleMessage"); const logConsoleSpy = sinon.spy(NotificationConsoleUtils, "logConsoleError");
const logErrorSpy = sinon.spy(Logger, "logError"); const logErrorSpy = sinon.spy(Logger, "logError");
gremlinClient.initialize(emptyParams); gremlinClient.initialize(emptyParams);
@ -122,7 +122,7 @@ describe("Gremlin Client", () => {
}); });
it("should not aggregate RU if not a number and reset totalRequestCharge to undefined", done => { it("should not aggregate RU if not a number and reset totalRequestCharge to undefined", done => {
const logConsoleSpy = sinon.spy(NotificationConsoleUtils, "logConsoleMessage"); const logConsoleSpy = sinon.spy(NotificationConsoleUtils, "logConsoleError");
const logErrorSpy = sinon.spy(Logger, "logError"); const logErrorSpy = sinon.spy(Logger, "logError");
const gremlinClient = new GremlinClient(); const gremlinClient = new GremlinClient();
@ -165,7 +165,7 @@ describe("Gremlin Client", () => {
}); });
it("should not aggregate RU if undefined and reset totalRequestCharge to undefined", done => { it("should not aggregate RU if undefined and reset totalRequestCharge to undefined", done => {
const logConsoleSpy = sinon.spy(NotificationConsoleUtils, "logConsoleMessage"); const logConsoleSpy = sinon.spy(NotificationConsoleUtils, "logConsoleError");
const logErrorSpy = sinon.spy(Logger, "logError"); const logErrorSpy = sinon.spy(Logger, "logError");
const gremlinClient = new GremlinClient(); const gremlinClient = new GremlinClient();

View File

@ -7,8 +7,7 @@ import { GremlinSimpleClient, Result } from "./GremlinSimpleClient";
import * as NotificationConsoleUtils from "../../../Utils/NotificationConsoleUtils"; import * as NotificationConsoleUtils from "../../../Utils/NotificationConsoleUtils";
import { ConsoleDataType } from "../../Menus/NotificationConsole/NotificationConsoleComponent"; import { ConsoleDataType } from "../../Menus/NotificationConsole/NotificationConsoleComponent";
import { HashMap } from "../../../Common/HashMap"; import { HashMap } from "../../../Common/HashMap";
import * as Logger from "../../../Common/Logger"; import { getErrorMessage, handleError } from "../../../Common/ErrorHandlingUtils";
import { getErrorMessage } from "../../../Common/ErrorHandlingUtils";
export interface GremlinClientParameters { export interface GremlinClientParameters {
endpoint: string; endpoint: string;
@ -63,10 +62,10 @@ export class GremlinClient {
const requestId = result.requestId; const requestId = result.requestId;
if (!requestId || !this.pendingResults.has(requestId)) { if (!requestId || !this.pendingResults.has(requestId)) {
const msg = `Error: ${errorMessage}, unknown requestId:${requestId} ${GremlinClient.getRequestChargeString( const errorMsg = `Error: ${errorMessage}, unknown requestId:${requestId} ${GremlinClient.getRequestChargeString(
result.requestCharge result.requestCharge
)}`; )}`;
GremlinClient.reportError(msg); handleError(errorMsg, GremlinClient.LOG_AREA);
// Fail all pending requests if no request id (fatal) // Fail all pending requests if no request id (fatal)
if (!requestId) { if (!requestId) {
@ -130,15 +129,16 @@ export class GremlinClient {
deferred.reject(error); deferred.reject(error);
this.pendingResults.delete(requestId); this.pendingResults.delete(requestId);
GremlinClient.reportError( const errorMsg = `Aborting pending request ${requestId}. Error:${error} ${GremlinClient.getRequestChargeString(
`Aborting pending request ${requestId}. Error:${error} ${GremlinClient.getRequestChargeString(requestCharge)}` requestCharge
); )}`;
handleError(errorMsg, GremlinClient.LOG_AREA);
} }
private flushResult(requestId: string) { private flushResult(requestId: string) {
if (!this.pendingResults.has(requestId)) { if (!this.pendingResults.has(requestId)) {
const msg = `Unknown requestId:${requestId}`; const errorMsg = `Unknown requestId:${requestId}`;
GremlinClient.reportError(msg); handleError(errorMsg, GremlinClient.LOG_AREA);
return; return;
} }
@ -156,8 +156,8 @@ export class GremlinClient {
*/ */
private storePendingResult(result: Result): boolean { private storePendingResult(result: Result): boolean {
if (!this.pendingResults.has(result.requestId)) { if (!this.pendingResults.has(result.requestId)) {
const msg = `Dropping result for unknown requestId:${result.requestId}`; const errorMsg = `Dropping result for unknown requestId:${result.requestId}`;
GremlinClient.reportError(msg); handleError(errorMsg, GremlinClient.LOG_AREA);
return false; return false;
} }
const pendingResults = this.pendingResults.get(result.requestId).result; const pendingResults = this.pendingResults.get(result.requestId).result;
@ -177,9 +177,8 @@ export class GremlinClient {
if (result.requestCharge === undefined || typeof result.requestCharge !== "number") { if (result.requestCharge === undefined || typeof result.requestCharge !== "number") {
// Clear totalRequestCharge, even if it was a valid number as the total might be incomplete therefore incorrect // Clear totalRequestCharge, even if it was a valid number as the total might be incomplete therefore incorrect
pendingResults.totalRequestCharge = undefined; pendingResults.totalRequestCharge = undefined;
GremlinClient.reportError( const errorMsg = `Unable to perform RU aggregation calculation with non numbers. Result request charge: ${result.requestCharge}. RequestId: ${result.requestId}`;
`Unable to perform RU aggregation calculation with non numbers. Result request charge: ${result.requestCharge}. RequestId: ${result.requestId}` handleError(errorMsg, GremlinClient.LOG_AREA);
);
} else { } else {
if (pendingResults.totalRequestCharge === undefined) { if (pendingResults.totalRequestCharge === undefined) {
pendingResults.totalRequestCharge = 0; pendingResults.totalRequestCharge = 0;
@ -188,9 +187,4 @@ export class GremlinClient {
} }
return pendingResults.isIncomplete; return pendingResults.isIncomplete;
} }
private static reportError(msg: string): void {
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, msg);
Logger.logError(msg, GremlinClient.LOG_AREA);
}
} }

View File

@ -6,6 +6,7 @@ import * as Constants from "../../Common/Constants";
import { ConsoleDataType } from "../Menus/NotificationConsole/NotificationConsoleComponent"; import { ConsoleDataType } from "../Menus/NotificationConsole/NotificationConsoleComponent";
import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils"; import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils";
import * as Logger from "../../Common/Logger"; import * as Logger from "../../Common/Logger";
import { getErrorMessage } from "../../Common/ErrorHandlingUtils";
export class NotebookContainerClient { export class NotebookContainerClient {
private reconnectingNotificationId: string; private reconnectingNotificationId: string;
@ -74,7 +75,7 @@ export class NotebookContainerClient {
} }
return undefined; return undefined;
} catch (error) { } catch (error) {
Logger.logError(error, "NotebookContainerClient/getMemoryUsage"); Logger.logError(getErrorMessage(error), "NotebookContainerClient/getMemoryUsage");
if (!this.reconnectingNotificationId) { if (!this.reconnectingNotificationId) {
this.reconnectingNotificationId = NotificationConsoleUtils.logConsoleMessage( this.reconnectingNotificationId = NotificationConsoleUtils.logConsoleMessage(
ConsoleDataType.InProgress, ConsoleDataType.InProgress,
@ -110,7 +111,7 @@ export class NotebookContainerClient {
headers: { Authorization: authToken } headers: { Authorization: authToken }
}); });
} catch (error) { } catch (error) {
Logger.logError(error, "NotebookContainerClient/resetWorkspace"); Logger.logError(getErrorMessage(error), "NotebookContainerClient/resetWorkspace");
await this.recreateNotebookWorkspaceAsync(); await this.recreateNotebookWorkspaceAsync();
} }
} }
@ -140,7 +141,7 @@ export class NotebookContainerClient {
await notebookWorkspaceManager.deleteNotebookWorkspaceAsync(explorer.databaseAccount().id, "default"); await notebookWorkspaceManager.deleteNotebookWorkspaceAsync(explorer.databaseAccount().id, "default");
await notebookWorkspaceManager.createNotebookWorkspaceAsync(explorer.databaseAccount().id, "default"); await notebookWorkspaceManager.createNotebookWorkspaceAsync(explorer.databaseAccount().id, "default");
} catch (error) { } catch (error) {
Logger.logError(error, "NotebookContainerClient/recreateNotebookWorkspaceAsync"); Logger.logError(getErrorMessage(error), "NotebookContainerClient/recreateNotebookWorkspaceAsync");
return Promise.reject(error); return Promise.reject(error);
} }
} }

View File

@ -26,6 +26,7 @@ import { ImmutableNotebook } from "@nteract/commutable";
import Explorer from "../Explorer"; import Explorer from "../Explorer";
import { ContextualPaneBase } from "../Panes/ContextualPaneBase"; import { ContextualPaneBase } from "../Panes/ContextualPaneBase";
import { CopyNotebookPaneAdapter } from "../Panes/CopyNotebookPane"; import { CopyNotebookPaneAdapter } from "../Panes/CopyNotebookPane";
import { getErrorMessage } from "../../Common/ErrorHandlingUtils";
export interface NotebookManagerOptions { export interface NotebookManagerOptions {
container: Explorer; container: Explorer;
@ -147,7 +148,7 @@ export default class NotebookManager {
// Octokit's error handler uses any // Octokit's error handler uses any
// eslint-disable-next-line @typescript-eslint/no-explicit-any // eslint-disable-next-line @typescript-eslint/no-explicit-any
private onGitHubClientError = (error: any): void => { private onGitHubClientError = (error: any): void => {
Logger.logError(error, "NotebookManager/onGitHubClientError"); Logger.logError(getErrorMessage(error), "NotebookManager/onGitHubClientError");
if (error.status === HttpStatusCodes.Unauthorized) { if (error.status === HttpStatusCodes.Unauthorized) {
this.gitHubOAuthService.resetToken(); this.gitHubOAuthService.resetToken();

View File

@ -1,7 +1,6 @@
import ko from "knockout"; import ko from "knockout";
import * as React from "react"; import * as React from "react";
import { ReactAdapter } from "../../Bindings/ReactBindingHandler"; import { ReactAdapter } from "../../Bindings/ReactBindingHandler";
import * as Logger from "../../Common/Logger";
import { JunoClient, IPinnedRepo } from "../../Juno/JunoClient"; import { JunoClient, IPinnedRepo } from "../../Juno/JunoClient";
import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils"; import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils";
import Explorer from "../Explorer"; import Explorer from "../Explorer";
@ -13,6 +12,7 @@ import { HttpStatusCodes } from "../../Common/Constants";
import * as GitHubUtils from "../../Utils/GitHubUtils"; import * as GitHubUtils from "../../Utils/GitHubUtils";
import { NotebookContentItemType, NotebookContentItem } from "../Notebook/NotebookContentItem"; import { NotebookContentItemType, NotebookContentItem } from "../Notebook/NotebookContentItem";
import { ResourceTreeAdapter } from "../Tree/ResourceTreeAdapter"; import { ResourceTreeAdapter } from "../Tree/ResourceTreeAdapter";
import { handleError, getErrorMessage } from "../../Common/ErrorHandlingUtils";
interface Location { interface Location {
type: "MyNotebooks" | "GitHub"; type: "MyNotebooks" | "GitHub";
@ -90,9 +90,7 @@ export class CopyNotebookPaneAdapter implements ReactAdapter {
if (this.gitHubOAuthService.isLoggedIn()) { if (this.gitHubOAuthService.isLoggedIn()) {
const response = await this.junoClient.getPinnedRepos(this.gitHubOAuthService.getTokenObservable()()?.scope); const response = await this.junoClient.getPinnedRepos(this.gitHubOAuthService.getTokenObservable()()?.scope);
if (response.status !== HttpStatusCodes.OK && response.status !== HttpStatusCodes.NoContent) { if (response.status !== HttpStatusCodes.OK && response.status !== HttpStatusCodes.NoContent) {
const message = `Received HTTP ${response.status} when fetching pinned repos`; handleError(`Received HTTP ${response.status} when fetching pinned repos`, "CopyNotebookPaneAdapter/submit");
Logger.logError(message, "CopyNotebookPaneAdapter/submit");
NotificationConsoleUtils.logConsoleError(message);
} }
if (response.data?.length > 0) { if (response.data?.length > 0) {
@ -134,12 +132,10 @@ export class CopyNotebookPaneAdapter implements ReactAdapter {
NotificationConsoleUtils.logConsoleInfo(`Successfully copied ${this.name} to ${destination}`); NotificationConsoleUtils.logConsoleInfo(`Successfully copied ${this.name} to ${destination}`);
} catch (error) { } catch (error) {
const errorMessage = getErrorMessage(error);
this.formError = `Failed to copy ${this.name} to ${destination}`; this.formError = `Failed to copy ${this.name} to ${destination}`;
this.formErrorDetail = `${error}`; this.formErrorDetail = `${errorMessage}`;
handleError(errorMessage, "CopyNotebookPaneAdapter/submit", this.formError);
const message = `${this.formError}: ${this.formErrorDetail}`;
Logger.logError(message, "CopyNotebookPaneAdapter/submit");
NotificationConsoleUtils.logConsoleError(message);
return; return;
} finally { } finally {
clearMessage && clearMessage(); clearMessage && clearMessage();

View File

@ -1,6 +1,5 @@
import _ from "underscore"; import _ from "underscore";
import { Areas, HttpStatusCodes } from "../../Common/Constants"; import { Areas, HttpStatusCodes } from "../../Common/Constants";
import * as Logger from "../../Common/Logger";
import * as ViewModels from "../../Contracts/ViewModels"; import * as ViewModels from "../../Contracts/ViewModels";
import { GitHubClient, IGitHubPageInfo, IGitHubRepo } from "../../GitHub/GitHubClient"; import { GitHubClient, IGitHubPageInfo, IGitHubRepo } from "../../GitHub/GitHubClient";
import { IPinnedRepo, JunoClient } from "../../Juno/JunoClient"; import { IPinnedRepo, JunoClient } from "../../Juno/JunoClient";
@ -8,13 +7,12 @@ import { Action, ActionModifiers } from "../../Shared/Telemetry/TelemetryConstan
import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor"; import * as TelemetryProcessor from "../../Shared/Telemetry/TelemetryProcessor";
import * as GitHubUtils from "../../Utils/GitHubUtils"; import * as GitHubUtils from "../../Utils/GitHubUtils";
import { JunoUtils } from "../../Utils/JunoUtils"; import { JunoUtils } from "../../Utils/JunoUtils";
import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils";
import { AuthorizeAccessComponent } from "../Controls/GitHub/AuthorizeAccessComponent"; import { AuthorizeAccessComponent } from "../Controls/GitHub/AuthorizeAccessComponent";
import { GitHubReposComponent, GitHubReposComponentProps, RepoListItem } from "../Controls/GitHub/GitHubReposComponent"; import { GitHubReposComponent, GitHubReposComponentProps, RepoListItem } from "../Controls/GitHub/GitHubReposComponent";
import { GitHubReposComponentAdapter } from "../Controls/GitHub/GitHubReposComponentAdapter"; import { GitHubReposComponentAdapter } from "../Controls/GitHub/GitHubReposComponentAdapter";
import { BranchesProps, PinnedReposProps, UnpinnedReposProps } from "../Controls/GitHub/ReposListComponent"; import { BranchesProps, PinnedReposProps, UnpinnedReposProps } from "../Controls/GitHub/ReposListComponent";
import { ConsoleDataType } from "../Menus/NotificationConsole/NotificationConsoleComponent";
import { ContextualPaneBase } from "./ContextualPaneBase"; import { ContextualPaneBase } from "./ContextualPaneBase";
import { handleError } from "../../Common/ErrorHandlingUtils";
interface GitHubReposPaneOptions extends ViewModels.PaneOptions { interface GitHubReposPaneOptions extends ViewModels.PaneOptions {
gitHubClient: GitHubClient; gitHubClient: GitHubClient;
@ -105,9 +103,7 @@ export class GitHubReposPane extends ContextualPaneBase {
throw new Error(`Received HTTP ${response.status} when saving pinned repos`); throw new Error(`Received HTTP ${response.status} when saving pinned repos`);
} }
} catch (error) { } catch (error) {
const message = `Failed to save pinned repos: ${error}`; handleError(error, "GitHubReposPane/submit", "Failed to save pinned repos");
Logger.logError(message, "GitHubReposPane/submit");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
} }
} }
@ -206,9 +202,7 @@ export class GitHubReposPane extends ContextualPaneBase {
branchesProps.lastPageInfo = response.pageInfo; branchesProps.lastPageInfo = response.pageInfo;
} }
} catch (error) { } catch (error) {
const message = `Failed to fetch branches: ${error}`; handleError(error, "GitHubReposPane/loadMoreBranches", "Failed to fetch branches");
Logger.logError(message, "GitHubReposPane/loadMoreBranches");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
branchesProps.isLoading = false; branchesProps.isLoading = false;
@ -236,9 +230,7 @@ export class GitHubReposPane extends ContextualPaneBase {
this.unpinnedReposProps.repos = this.calculateUnpinnedRepos(); this.unpinnedReposProps.repos = this.calculateUnpinnedRepos();
} }
} catch (error) { } catch (error) {
const message = `Failed to fetch unpinned repos: ${error}`; handleError(error, "GitHubReposPane/loadMoreUnpinnedRepos", "Failed to fetch unpinned repos");
Logger.logError(message, "GitHubReposPane/loadMoreUnpinnedRepos");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
this.unpinnedReposProps.isLoading = false; this.unpinnedReposProps.isLoading = false;
@ -255,9 +247,7 @@ export class GitHubReposPane extends ContextualPaneBase {
return response.data; return response.data;
} catch (error) { } catch (error) {
const message = `Failed to fetch repo: ${error}`; handleError(error, "GitHubReposPane/getRepo", "Failed to fetch repo");
Logger.logError(message, "GitHubReposPane/getRepo");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
return Promise.resolve(undefined); return Promise.resolve(undefined);
} }
} }
@ -320,9 +310,7 @@ export class GitHubReposPane extends ContextualPaneBase {
this.triggerRender(); this.triggerRender();
} }
} catch (error) { } catch (error) {
const message = `Failed to fetch pinned repos: ${error}`; handleError(error, "GitHubReposPane/refreshPinnedReposListItems", "Failed to fetch pinned repos");
Logger.logError(message, "GitHubReposPane/refreshPinnedReposListItems");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
} }

View File

@ -1,17 +1,16 @@
import ko from "knockout"; import ko from "knockout";
import * as React from "react"; import * as React from "react";
import { ReactAdapter } from "../../Bindings/ReactBindingHandler"; import { ReactAdapter } from "../../Bindings/ReactBindingHandler";
import * as Logger from "../../Common/Logger";
import Explorer from "../Explorer"; import Explorer from "../Explorer";
import { JunoClient } from "../../Juno/JunoClient"; import { JunoClient } from "../../Juno/JunoClient";
import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils"; import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils";
import { ConsoleDataType } from "../Menus/NotificationConsole/NotificationConsoleComponent";
import { GenericRightPaneComponent, GenericRightPaneProps } from "./GenericRightPaneComponent"; import { GenericRightPaneComponent, GenericRightPaneProps } from "./GenericRightPaneComponent";
import { PublishNotebookPaneComponent, PublishNotebookPaneProps } from "./PublishNotebookPaneComponent"; import { PublishNotebookPaneComponent, PublishNotebookPaneProps } from "./PublishNotebookPaneComponent";
import { ImmutableNotebook } from "@nteract/commutable/src"; import { ImmutableNotebook } from "@nteract/commutable/src";
import { toJS } from "@nteract/commutable"; import { toJS } from "@nteract/commutable";
import { CodeOfConductComponent } from "../Controls/NotebookGallery/CodeOfConductComponent"; import { CodeOfConductComponent } from "../Controls/NotebookGallery/CodeOfConductComponent";
import { HttpStatusCodes } from "../../Common/Constants"; import { HttpStatusCodes } from "../../Common/Constants";
import { handleError, getErrorMessage } from "../../Common/ErrorHandlingUtils";
export class PublishNotebookPaneAdapter implements ReactAdapter { export class PublishNotebookPaneAdapter implements ReactAdapter {
parameters: ko.Observable<number>; parameters: ko.Observable<number>;
@ -111,9 +110,11 @@ export class PublishNotebookPaneAdapter implements ReactAdapter {
this.isCodeOfConductAccepted = response.data; this.isCodeOfConductAccepted = response.data;
} catch (error) { } catch (error) {
const message = `Failed to check if code of conduct was accepted: ${error}`; handleError(
Logger.logError(message, "PublishNotebookPaneAdapter/isCodeOfConductAccepted"); error,
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message); "PublishNotebookPaneAdapter/isCodeOfConductAccepted",
"Failed to check if code of conduct was accepted"
);
} }
} else { } else {
this.isCodeOfConductAccepted = true; this.isCodeOfConductAccepted = true;
@ -170,12 +171,10 @@ export class PublishNotebookPaneAdapter implements ReactAdapter {
} }
} }
} catch (error) { } catch (error) {
const errorMessage = getErrorMessage(error);
this.formError = `Failed to publish ${this.name} to gallery`; this.formError = `Failed to publish ${this.name} to gallery`;
this.formErrorDetail = `${error}`; this.formErrorDetail = `${errorMessage}`;
handleError(errorMessage, "PublishNotebookPaneAdapter/submit", this.formError);
const message = `${this.formError}: ${this.formErrorDetail}`;
Logger.logError(message, "PublishNotebookPaneAdapter/submit");
NotificationConsoleUtils.logConsoleError(message);
return; return;
} finally { } finally {
clearPublishingMessage(); clearPublishingMessage();
@ -189,10 +188,7 @@ export class PublishNotebookPaneAdapter implements ReactAdapter {
private createFormErrorForLargeImageSelection = (formError: string, formErrorDetail: string, area: string): void => { private createFormErrorForLargeImageSelection = (formError: string, formErrorDetail: string, area: string): void => {
this.formError = formError; this.formError = formError;
this.formErrorDetail = formErrorDetail; this.formErrorDetail = formErrorDetail;
handleError(formErrorDetail, area, formError);
const message = `${this.formError}: ${this.formErrorDetail}`;
Logger.logError(message, area);
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
this.triggerRender(); this.triggerRender();
}; };

View File

@ -7,16 +7,14 @@ import { ConsoleDataType } from "../../Explorer/Menus/NotificationConsole/Notifi
import * as Constants from "../../Common/Constants"; import * as Constants from "../../Common/Constants";
import * as Entities from "./Entities"; import * as Entities from "./Entities";
import * as HeadersUtility from "../../Common/HeadersUtility"; import * as HeadersUtility from "../../Common/HeadersUtility";
import * as Logger from "../../Common/Logger";
import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils"; import * as NotificationConsoleUtils from "../../Utils/NotificationConsoleUtils";
import * as TableConstants from "./Constants"; import * as TableConstants from "./Constants";
import * as TableEntityProcessor from "./TableEntityProcessor"; import * as TableEntityProcessor from "./TableEntityProcessor";
import * as ViewModels from "../../Contracts/ViewModels"; import * as ViewModels from "../../Contracts/ViewModels";
import { MessageTypes } from "../../Contracts/ExplorerContracts";
import { sendMessage } from "../../Common/MessageHandler";
import Explorer from "../Explorer"; import Explorer from "../Explorer";
import { queryDocuments, deleteDocument, updateDocument, createDocument } from "../../Common/DocumentClientUtilityBase"; import { queryDocuments, deleteDocument, updateDocument, createDocument } from "../../Common/DocumentClientUtilityBase";
import { configContext } from "../../ConfigContext"; import { configContext } from "../../ConfigContext";
import { handleError } from "../../Common/ErrorHandlingUtils";
export interface CassandraTableKeys { export interface CassandraTableKeys {
partitionKeys: CassandraTableKey[]; partitionKeys: CassandraTableKey[];
@ -188,14 +186,9 @@ export class CassandraAPIDataClient extends TableDataClient {
); );
deferred.resolve(entity); deferred.resolve(entity);
}, },
reason => { error => {
NotificationConsoleUtils.logConsoleMessage( handleError(error, "AddRowCassandra", `Error while adding new row to table ${collection.id()}`);
ConsoleDataType.Error, deferred.reject(error);
`Error while adding new row to table ${collection.id()}:\n ${JSON.stringify(reason)}`
);
Logger.logError(JSON.stringify(reason), "AddRowCassandra", reason.code);
this._checkForbiddenError(reason);
deferred.reject(reason);
} }
) )
.finally(() => { .finally(() => {
@ -267,14 +260,9 @@ export class CassandraAPIDataClient extends TableDataClient {
); );
deferred.resolve(newEntity); deferred.resolve(newEntity);
}, },
reason => { error => {
NotificationConsoleUtils.logConsoleMessage( handleError(error, "UpdateRowCassandra", `Failed to update row ${newEntity.RowKey._}`);
ConsoleDataType.Error, deferred.reject(error);
`Failed to update row ${newEntity.RowKey._}: ${JSON.stringify(reason)}`
);
Logger.logError(JSON.stringify(reason), "UpdateRowCassandra", reason.code);
this._checkForbiddenError(reason);
deferred.reject(reason);
} }
) )
.finally(() => { .finally(() => {
@ -332,16 +320,11 @@ export class CassandraAPIDataClient extends TableDataClient {
ContinuationToken: data.paginationToken ContinuationToken: data.paginationToken
}); });
}, },
reason => { (error: any) => {
if (shouldNotify) { if (shouldNotify) {
NotificationConsoleUtils.logConsoleMessage( handleError(error, "QueryDocumentsCassandra", `Failed to query rows for table ${collection.id()}`);
ConsoleDataType.Error,
`Failed to query rows for table ${collection.id()}: ${JSON.stringify(reason)}`
);
Logger.logError(JSON.stringify(reason), "QueryDocumentsCassandra", reason.status);
this._checkForbiddenError(reason);
} }
deferred.reject(reason); deferred.reject(error);
} }
) )
.done(() => { .done(() => {
@ -379,13 +362,8 @@ export class CassandraAPIDataClient extends TableDataClient {
`Successfully deleted row ${currEntityToDelete.RowKey._}` `Successfully deleted row ${currEntityToDelete.RowKey._}`
); );
}, },
reason => { error => {
NotificationConsoleUtils.logConsoleMessage( handleError(error, "DeleteRowCassandra", `Error while deleting row ${currEntityToDelete.RowKey._}`);
ConsoleDataType.Error,
`Error while deleting row ${currEntityToDelete.RowKey._}:\n ${JSON.stringify(reason)}`
);
Logger.logError(JSON.stringify(reason), "DeleteRowCassandra", reason.code);
this._checkForbiddenError(reason);
} }
) )
.finally(() => { .finally(() => {
@ -420,14 +398,13 @@ export class CassandraAPIDataClient extends TableDataClient {
); );
deferred.resolve(); deferred.resolve();
}, },
reason => { error => {
NotificationConsoleUtils.logConsoleMessage( handleError(
ConsoleDataType.Error, error,
`Error while creating a keyspace with query ${createKeyspaceQuery}:\n ${JSON.stringify(reason)}` "CreateKeyspaceCassandra",
`Error while creating a keyspace with query ${createKeyspaceQuery}`
); );
Logger.logError(JSON.stringify(reason), "CreateKeyspaceCassandra", reason.code); deferred.reject(error);
this._checkForbiddenError(reason);
deferred.reject(reason);
} }
) )
.finally(() => { .finally(() => {
@ -467,14 +444,9 @@ export class CassandraAPIDataClient extends TableDataClient {
); );
deferred.resolve(); deferred.resolve();
}, },
reason => { error => {
NotificationConsoleUtils.logConsoleMessage( handleError(error, "CreateTableCassandra", `Error while creating a table with query ${createTableQuery}`);
ConsoleDataType.Error, deferred.reject(error);
`Error while creating a table with query ${createTableQuery}:\n ${JSON.stringify(reason)}`
);
Logger.logError(JSON.stringify(reason), "CreateTableCassandra", reason.code);
this._checkForbiddenError(reason);
deferred.reject(reason);
} }
) )
.finally(() => { .finally(() => {
@ -508,14 +480,13 @@ export class CassandraAPIDataClient extends TableDataClient {
); );
deferred.resolve(); deferred.resolve();
}, },
reason => { error => {
NotificationConsoleUtils.logConsoleMessage( handleError(
ConsoleDataType.Error, error,
`Error while deleting resource with query ${deleteQuery}:\n ${JSON.stringify(reason)}` "DeleteKeyspaceOrTableCassandra",
`Error while deleting resource with query ${deleteQuery}`
); );
Logger.logError(JSON.stringify(reason), "DeleteKeyspaceOrTableCassandra", reason.code); deferred.reject(error);
this._checkForbiddenError(reason);
deferred.reject(reason);
} }
) )
.finally(() => { .finally(() => {
@ -563,14 +534,9 @@ export class CassandraAPIDataClient extends TableDataClient {
); );
deferred.resolve(data); deferred.resolve(data);
}, },
reason => { (error: any) => {
NotificationConsoleUtils.logConsoleMessage( handleError(error, "FetchKeysCassandra", `Error fetching keys for table ${collection.id()}`);
ConsoleDataType.Error, deferred.reject(error);
`Error fetching keys for table ${collection.id()}:\n ${JSON.stringify(reason)}`
);
Logger.logError(JSON.stringify(reason), "FetchKeysCassandra", reason.status);
this._checkForbiddenError(reason);
deferred.reject(reason);
} }
) )
.done(() => { .done(() => {
@ -618,14 +584,9 @@ export class CassandraAPIDataClient extends TableDataClient {
); );
deferred.resolve(data.columns); deferred.resolve(data.columns);
}, },
reason => { (error: any) => {
NotificationConsoleUtils.logConsoleMessage( handleError(error, "FetchSchemaCassandra", `Error fetching schema for table ${collection.id()}`);
ConsoleDataType.Error, deferred.reject(error);
`Error fetching schema for table ${collection.id()}:\n ${JSON.stringify(reason)}`
);
Logger.logError(JSON.stringify(reason), "FetchSchemaCassandra", reason.status);
this._checkForbiddenError(reason);
deferred.reject(reason);
} }
) )
.done(() => { .done(() => {
@ -712,13 +673,4 @@ export class CassandraAPIDataClient extends TableDataClient {
displayTokenRenewalPromptForStatus(xhrObj.status); displayTokenRenewalPromptForStatus(xhrObj.status);
}; };
private _checkForbiddenError(reason: any) {
if (reason && reason.code === Constants.HttpStatusCodes.Forbidden) {
sendMessage({
type: MessageTypes.ForbiddenError,
reason: typeof reason === "string" ? "reason" : JSON.stringify(reason)
});
}
}
} }

View File

@ -3,6 +3,7 @@ import { HttpStatusCodes } from "../Common/Constants";
import * as Logger from "../Common/Logger"; import * as Logger from "../Common/Logger";
import UrlUtility from "../Common/UrlUtility"; import UrlUtility from "../Common/UrlUtility";
import { NotebookUtil } from "../Explorer/Notebook/NotebookUtil"; import { NotebookUtil } from "../Explorer/Notebook/NotebookUtil";
import { getErrorMessage } from "../Common/ErrorHandlingUtils";
export interface IGitHubPageInfo { export interface IGitHubPageInfo {
endCursor: string; endCursor: string;
@ -244,7 +245,7 @@ export class GitHubClient {
data: GitHubClient.toGitHubRepo(response.repository) data: GitHubClient.toGitHubRepo(response.repository)
}; };
} catch (error) { } catch (error) {
GitHubClient.log(Logger.logError, `GitHubClient.getRepoAsync failed: ${error}`); Logger.logError(getErrorMessage(error), "GitHubClient.Octokit", "GitHubClient.getRepoAsync failed");
return { return {
status: GitHubClient.SelfErrorCode, status: GitHubClient.SelfErrorCode,
data: undefined data: undefined
@ -265,7 +266,7 @@ export class GitHubClient {
pageInfo: GitHubClient.toGitHubPageInfo(response.viewer.repositories.pageInfo) pageInfo: GitHubClient.toGitHubPageInfo(response.viewer.repositories.pageInfo)
}; };
} catch (error) { } catch (error) {
GitHubClient.log(Logger.logError, `GitHubClient.getReposAsync failed: ${error}`); Logger.logError(getErrorMessage(error), "GitHubClient.Octokit", "GitHubClient.getRepoAsync failed");
return { return {
status: GitHubClient.SelfErrorCode, status: GitHubClient.SelfErrorCode,
data: undefined data: undefined
@ -294,7 +295,7 @@ export class GitHubClient {
pageInfo: GitHubClient.toGitHubPageInfo(response.repository.refs.pageInfo) pageInfo: GitHubClient.toGitHubPageInfo(response.repository.refs.pageInfo)
}; };
} catch (error) { } catch (error) {
GitHubClient.log(Logger.logError, `GitHubClient.getBranchesAsync failed: ${error}`); Logger.logError(getErrorMessage(error), "GitHubClient.Octokit", "GitHubClient.getBranchesAsync failed");
return { return {
status: GitHubClient.SelfErrorCode, status: GitHubClient.SelfErrorCode,
data: undefined data: undefined
@ -359,7 +360,7 @@ export class GitHubClient {
data data
}; };
} catch (error) { } catch (error) {
GitHubClient.log(Logger.logError, `GitHubClient.getContentsAsync failed: ${error}`); Logger.logError(getErrorMessage(error), "GitHubClient.Octokit", "GitHubClient.getContentsAsync failed");
return { return {
status: GitHubClient.SelfErrorCode, status: GitHubClient.SelfErrorCode,
data: undefined data: undefined
@ -503,7 +504,7 @@ export class GitHubClient {
debug: () => {}, debug: () => {},
info: (message?: any) => GitHubClient.log(Logger.logInfo, message), info: (message?: any) => GitHubClient.log(Logger.logInfo, message),
warn: (message?: any) => GitHubClient.log(Logger.logWarning, message), warn: (message?: any) => GitHubClient.log(Logger.logWarning, message),
error: (message?: any) => GitHubClient.log(Logger.logError, message) error: (error?: any) => Logger.logError(getErrorMessage(error), "GitHubClient.Octokit")
} }
}); });

View File

@ -41,7 +41,7 @@ export class GitHubContentProvider implements IContentProvider {
return this.createSuccessAjaxResponse(HttpStatusCodes.NoContent, undefined); return this.createSuccessAjaxResponse(HttpStatusCodes.NoContent, undefined);
} catch (error) { } catch (error) {
Logger.logError(error, "GitHubContentProvider/remove", error.errno); Logger.logError(getErrorMessage(error), "GitHubContentProvider/remove", error.errno);
return this.createErrorAjaxResponse(error); return this.createErrorAjaxResponse(error);
} }
}) })
@ -65,7 +65,7 @@ export class GitHubContentProvider implements IContentProvider {
return this.createSuccessAjaxResponse(HttpStatusCodes.OK, this.createContentModel(uri, content.data, params)); return this.createSuccessAjaxResponse(HttpStatusCodes.OK, this.createContentModel(uri, content.data, params));
} catch (error) { } catch (error) {
Logger.logError(error, "GitHubContentProvider/get", error.errno); Logger.logError(getErrorMessage(error), "GitHubContentProvider/get", error.errno);
return this.createErrorAjaxResponse(error); return this.createErrorAjaxResponse(error);
} }
}) })
@ -105,7 +105,7 @@ export class GitHubContentProvider implements IContentProvider {
this.createContentModel(newUri, gitHubFile, { content: 0 }) this.createContentModel(newUri, gitHubFile, { content: 0 })
); );
} catch (error) { } catch (error) {
Logger.logError(error, "GitHubContentProvider/update", error.errno); Logger.logError(getErrorMessage(error), "GitHubContentProvider/update", error.errno);
return this.createErrorAjaxResponse(error); return this.createErrorAjaxResponse(error);
} }
}) })
@ -182,7 +182,7 @@ export class GitHubContentProvider implements IContentProvider {
this.createContentModel(newUri, newGitHubFile, { content: 0 }) this.createContentModel(newUri, newGitHubFile, { content: 0 })
); );
} catch (error) { } catch (error) {
Logger.logError(error, "GitHubContentProvider/create", error.errno); Logger.logError(getErrorMessage(error), "GitHubContentProvider/create", error.errno);
return this.createErrorAjaxResponse(error); return this.createErrorAjaxResponse(error);
} }
}) })
@ -260,7 +260,7 @@ export class GitHubContentProvider implements IContentProvider {
this.createContentModel(uri, gitHubFile, { content: 0 }) this.createContentModel(uri, gitHubFile, { content: 0 })
); );
} catch (error) { } catch (error) {
Logger.logError(error, "GitHubContentProvider/update", error.errno); Logger.logError(getErrorMessage(error), "GitHubContentProvider/update", error.errno);
return this.createErrorAjaxResponse(error); return this.createErrorAjaxResponse(error);
} }
}) })
@ -269,25 +269,25 @@ export class GitHubContentProvider implements IContentProvider {
public listCheckpoints(_: ServerConfig, path: string): Observable<AjaxResponse> { public listCheckpoints(_: ServerConfig, path: string): Observable<AjaxResponse> {
const error = new GitHubContentProviderError("Not implemented"); const error = new GitHubContentProviderError("Not implemented");
Logger.logError(error, "GitHubContentProvider/listCheckpoints", error.errno); Logger.logError(error.message, "GitHubContentProvider/listCheckpoints", error.errno);
return of(this.createErrorAjaxResponse(error)); return of(this.createErrorAjaxResponse(error));
} }
public createCheckpoint(_: ServerConfig, path: string): Observable<AjaxResponse> { public createCheckpoint(_: ServerConfig, path: string): Observable<AjaxResponse> {
const error = new GitHubContentProviderError("Not implemented"); const error = new GitHubContentProviderError("Not implemented");
Logger.logError(error, "GitHubContentProvider/createCheckpoint", error.errno); Logger.logError(error.message, "GitHubContentProvider/createCheckpoint", error.errno);
return of(this.createErrorAjaxResponse(error)); return of(this.createErrorAjaxResponse(error));
} }
public deleteCheckpoint(_: ServerConfig, path: string, checkpointID: string): Observable<AjaxResponse> { public deleteCheckpoint(_: ServerConfig, path: string, checkpointID: string): Observable<AjaxResponse> {
const error = new GitHubContentProviderError("Not implemented"); const error = new GitHubContentProviderError("Not implemented");
Logger.logError(error, "GitHubContentProvider/deleteCheckpoint", error.errno); Logger.logError(error.message, "GitHubContentProvider/deleteCheckpoint", error.errno);
return of(this.createErrorAjaxResponse(error)); return of(this.createErrorAjaxResponse(error));
} }
public restoreFromCheckpoint(_: ServerConfig, path: string, checkpointID: string): Observable<AjaxResponse> { public restoreFromCheckpoint(_: ServerConfig, path: string, checkpointID: string): Observable<AjaxResponse> {
const error = new GitHubContentProviderError("Not implemented"); const error = new GitHubContentProviderError("Not implemented");
Logger.logError(error, "GitHubContentProvider/restoreFromCheckpoint", error.errno); Logger.logError(error.message, "GitHubContentProvider/restoreFromCheckpoint", error.errno);
return of(this.createErrorAjaxResponse(error)); return of(this.createErrorAjaxResponse(error));
} }

View File

@ -1,6 +1,5 @@
import ko from "knockout"; import ko from "knockout";
import { HttpStatusCodes } from "../Common/Constants"; import { HttpStatusCodes } from "../Common/Constants";
import * as Logger from "../Common/Logger";
import { configContext } from "../ConfigContext"; import { configContext } from "../ConfigContext";
import { AuthorizeAccessComponent } from "../Explorer/Controls/GitHub/AuthorizeAccessComponent"; import { AuthorizeAccessComponent } from "../Explorer/Controls/GitHub/AuthorizeAccessComponent";
import { ConsoleDataType } from "../Explorer/Menus/NotificationConsole/NotificationConsoleComponent"; import { ConsoleDataType } from "../Explorer/Menus/NotificationConsole/NotificationConsoleComponent";
@ -8,6 +7,7 @@ import { JunoClient } from "../Juno/JunoClient";
import { isInvalidParentFrameOrigin } from "../Utils/MessageValidation"; import { isInvalidParentFrameOrigin } from "../Utils/MessageValidation";
import * as NotificationConsoleUtils from "../Utils/NotificationConsoleUtils"; import * as NotificationConsoleUtils from "../Utils/NotificationConsoleUtils";
import { GitHubConnectorMsgType, IGitHubConnectorParams } from "./GitHubConnector"; import { GitHubConnectorMsgType, IGitHubConnectorParams } from "./GitHubConnector";
import { handleError } from "../Common/ErrorHandlingUtils";
window.addEventListener("message", (event: MessageEvent) => { window.addEventListener("message", (event: MessageEvent) => {
if (isInvalidParentFrameOrigin(event)) { if (isInvalidParentFrameOrigin(event)) {
@ -99,9 +99,7 @@ export class GitHubOAuthService {
this.resetToken(); this.resetToken();
return true; return true;
} catch (error) { } catch (error) {
const message = `Failed to delete app authorization: ${error}`; handleError(error, "GitHubOAuthService/logout", "Failed to delete app authorization");
Logger.logError(message, "GitHubOAuthService/logout");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
return false; return false;
} }
} }

View File

@ -611,7 +611,7 @@ class HostedExplorer {
return loadAccountResult; return loadAccountResult;
} catch (error) { } catch (error) {
LocalStorageUtility.removeEntry(StorageKey.DatabaseAccountId); LocalStorageUtility.removeEntry(StorageKey.DatabaseAccountId);
Logger.logError(error, "HostedExplorer/_getAccessCached"); Logger.logError(getErrorMessage(error), "HostedExplorer/_getAccessCached");
throw error; throw error;
} }
} }
@ -637,7 +637,7 @@ class HostedExplorer {
const accountResponse = this._getAccessAfterTenantSelection(defaultTenant.tenantId); const accountResponse = this._getAccessAfterTenantSelection(defaultTenant.tenantId);
return accountResponse; return accountResponse;
} catch (error) { } catch (error) {
Logger.logError(error, "HostedExplorer/_getAccessNew"); Logger.logError(getErrorMessage(error), "HostedExplorer/_getAccessNew");
throw error; throw error;
} }
} }
@ -658,7 +658,7 @@ class HostedExplorer {
const keys = await this._getAccountKeysHelper(defaultAccount, true); const keys = await this._getAccountKeysHelper(defaultAccount, true);
return [defaultAccount, keys, authToken]; return [defaultAccount, keys, authToken];
} catch (error) { } catch (error) {
Logger.logError(error, "HostedExplorer/_getAccessAfterTenantSelection"); Logger.logError(getErrorMessage(error), "HostedExplorer/_getAccessAfterTenantSelection");
throw error; throw error;
} }
} }
@ -1131,7 +1131,7 @@ class HostedExplorer {
}); });
}, },
error => { error => {
Logger.logError(error, "HostedExplorer/_onNewDirectorySelected"); Logger.logError(getErrorMessage(error), "HostedExplorer/_onNewDirectorySelected");
} }
); );
TelemetryProcessor.trace(Action.TenantSwitch); TelemetryProcessor.trace(Action.TenantSwitch);

View File

@ -7,6 +7,7 @@ import {
NotebookWorkspaceFeedResponse NotebookWorkspaceFeedResponse
} from "../Contracts/DataModels"; } from "../Contracts/DataModels";
import { ResourceProviderClientFactory } from "../ResourceProvider/ResourceProviderClientFactory"; import { ResourceProviderClientFactory } from "../ResourceProvider/ResourceProviderClientFactory";
import { getErrorMessage } from "../Common/ErrorHandlingUtils";
export class NotebookWorkspaceManager { export class NotebookWorkspaceManager {
private resourceProviderClientFactory: IResourceProviderClientFactory<any>; private resourceProviderClientFactory: IResourceProviderClientFactory<any>;
@ -24,7 +25,7 @@ export class NotebookWorkspaceManager {
)) as NotebookWorkspaceFeedResponse; )) as NotebookWorkspaceFeedResponse;
return response && response.value; return response && response.value;
} catch (error) { } catch (error) {
Logger.logError(error, "NotebookWorkspaceManager/getNotebookWorkspacesAsync"); Logger.logError(getErrorMessage(error), "NotebookWorkspaceManager/getNotebookWorkspacesAsync");
throw error; throw error;
} }
} }
@ -37,7 +38,7 @@ export class NotebookWorkspaceManager {
try { try {
return (await this.rpClient(uri).getAsync(uri, ArmApiVersions.documentDB)) as NotebookWorkspace; return (await this.rpClient(uri).getAsync(uri, ArmApiVersions.documentDB)) as NotebookWorkspace;
} catch (error) { } catch (error) {
Logger.logError(error, "NotebookWorkspaceManager/getNotebookWorkspaceAsync"); Logger.logError(getErrorMessage(error), "NotebookWorkspaceManager/getNotebookWorkspaceAsync");
throw error; throw error;
} }
} }
@ -47,7 +48,7 @@ export class NotebookWorkspaceManager {
try { try {
await this.rpClient(uri).putAsync(uri, ArmApiVersions.documentDB, { name: notebookWorkspaceId }); await this.rpClient(uri).putAsync(uri, ArmApiVersions.documentDB, { name: notebookWorkspaceId });
} catch (error) { } catch (error) {
Logger.logError(error, "NotebookWorkspaceManager/createNotebookWorkspaceAsync"); Logger.logError(getErrorMessage(error), "NotebookWorkspaceManager/createNotebookWorkspaceAsync");
throw error; throw error;
} }
} }
@ -57,7 +58,7 @@ export class NotebookWorkspaceManager {
try { try {
await this.rpClient(uri).deleteAsync(uri, ArmApiVersions.documentDB); await this.rpClient(uri).deleteAsync(uri, ArmApiVersions.documentDB);
} catch (error) { } catch (error) {
Logger.logError(error, "NotebookWorkspaceManager/deleteNotebookWorkspaceAsync"); Logger.logError(getErrorMessage(error), "NotebookWorkspaceManager/deleteNotebookWorkspaceAsync");
throw error; throw error;
} }
} }
@ -74,7 +75,7 @@ export class NotebookWorkspaceManager {
undefined undefined
); );
} catch (error) { } catch (error) {
Logger.logError(error, "NotebookWorkspaceManager/getNotebookConnectionInfoAsync"); Logger.logError(getErrorMessage(error), "NotebookWorkspaceManager/getNotebookConnectionInfoAsync");
throw error; throw error;
} }
} }
@ -86,7 +87,7 @@ export class NotebookWorkspaceManager {
skipResourceValidation: true skipResourceValidation: true
}); });
} catch (error) { } catch (error) {
Logger.logError(error, "NotebookWorkspaceManager/startNotebookWorkspaceAsync"); Logger.logError(getErrorMessage(error), "NotebookWorkspaceManager/startNotebookWorkspaceAsync");
throw error; throw error;
} }
} }

View File

@ -3,6 +3,7 @@ import * as Constants from "../../Common/Constants";
import * as Logger from "../../Common/Logger"; import * as Logger from "../../Common/Logger";
import { Tenant, Subscription, DatabaseAccount, AccountKeys } from "../../Contracts/DataModels"; import { Tenant, Subscription, DatabaseAccount, AccountKeys } from "../../Contracts/DataModels";
import { configContext } from "../../ConfigContext"; import { configContext } from "../../ConfigContext";
import { getErrorMessage } from "../../Common/ErrorHandlingUtils";
// TODO: 421864 - add a fetch wrapper // TODO: 421864 - add a fetch wrapper
export abstract class ArmResourceUtils { export abstract class ArmResourceUtils {
@ -30,7 +31,7 @@ export abstract class ArmResourceUtils {
} }
return tenants; return tenants;
} catch (error) { } catch (error) {
Logger.logError(error, "ArmResourceUtils/listTenants"); Logger.logError(getErrorMessage(error), "ArmResourceUtils/listTenants");
throw error; throw error;
} }
} }
@ -58,7 +59,7 @@ export abstract class ArmResourceUtils {
} }
return subscriptions; return subscriptions;
} catch (error) { } catch (error) {
Logger.logError(error, "ArmResourceUtils/listSubscriptions"); Logger.logError(getErrorMessage(error), "ArmResourceUtils/listSubscriptions");
throw error; throw error;
} }
} }
@ -92,7 +93,7 @@ export abstract class ArmResourceUtils {
} }
return accounts; return accounts;
} catch (error) { } catch (error) {
Logger.logError(error, "ArmResourceUtils/listAccounts"); Logger.logError(getErrorMessage(error), "ArmResourceUtils/listAccounts");
throw error; throw error;
} }
} }
@ -140,7 +141,7 @@ export abstract class ArmResourceUtils {
} }
return result; return result;
} catch (error) { } catch (error) {
Logger.logError(error, "ArmResourceUtils/getAccountKeys"); Logger.logError(getErrorMessage(error), "ArmResourceUtils/getAccountKeys");
throw error; throw error;
} }
} }
@ -150,7 +151,7 @@ export abstract class ArmResourceUtils {
const token = await AuthHeadersUtil.getAccessToken(ArmResourceUtils._armAuthArea, tenantId); const token = await AuthHeadersUtil.getAccessToken(ArmResourceUtils._armAuthArea, tenantId);
return token; return token;
} catch (error) { } catch (error) {
Logger.logError(error, "ArmResourceUtils/getAuthToken"); Logger.logError(getErrorMessage(error), "ArmResourceUtils/getAuthToken");
throw error; throw error;
} }
} }

View File

@ -1,4 +1,3 @@
import * as ViewModels from "../Contracts/ViewModels";
import { import {
ArcadiaWorkspace, ArcadiaWorkspace,
ArcadiaWorkspaceFeedResponse, ArcadiaWorkspaceFeedResponse,
@ -10,6 +9,7 @@ import { IResourceProviderClient, IResourceProviderClientFactory } from "../Reso
import * as Logger from "../Common/Logger"; import * as Logger from "../Common/Logger";
import { ResourceProviderClientFactory } from "../ResourceProvider/ResourceProviderClientFactory"; import { ResourceProviderClientFactory } from "../ResourceProvider/ResourceProviderClientFactory";
import { configContext } from "../ConfigContext"; import { configContext } from "../ConfigContext";
import { getErrorMessage } from "../Common/ErrorHandlingUtils";
export class ArcadiaResourceManager { export class ArcadiaResourceManager {
private resourceProviderClientFactory: IResourceProviderClientFactory<any>; private resourceProviderClientFactory: IResourceProviderClientFactory<any>;
@ -27,7 +27,7 @@ export class ArcadiaResourceManager {
)) as ArcadiaWorkspaceFeedResponse; )) as ArcadiaWorkspaceFeedResponse;
return response && response.value; return response && response.value;
} catch (error) { } catch (error) {
Logger.logError(error, "ArcadiaResourceManager/getWorkspaceAsync"); Logger.logError(getErrorMessage(error), "ArcadiaResourceManager/getWorkspaceAsync");
throw error; throw error;
} }
} }
@ -37,7 +37,7 @@ export class ArcadiaResourceManager {
try { try {
return (await this._rpClient(uri).getAsync(uri, ArmApiVersions.arcadia)) as ArcadiaWorkspace; return (await this._rpClient(uri).getAsync(uri, ArmApiVersions.arcadia)) as ArcadiaWorkspace;
} catch (error) { } catch (error) {
Logger.logError(error, "ArcadiaResourceManager/getWorkspaceAsync"); Logger.logError(getErrorMessage(error), "ArcadiaResourceManager/getWorkspaceAsync");
throw error; throw error;
} }
} }
@ -56,7 +56,7 @@ export class ArcadiaResourceManager {
)) as ArcadiaWorkspaceFeedResponse; )) as ArcadiaWorkspaceFeedResponse;
return response && response.value; return response && response.value;
} catch (error) { } catch (error) {
Logger.logError(error, "ArcadiaManager/listWorkspacesAsync"); Logger.logError(getErrorMessage(error), "ArcadiaManager/listWorkspacesAsync");
throw error; throw error;
} }
} }
@ -68,7 +68,7 @@ export class ArcadiaResourceManager {
const response = (await this._rpClient(uri).getAsync(uri, ArmApiVersions.arcadia)) as SparkPoolFeedResponse; const response = (await this._rpClient(uri).getAsync(uri, ArmApiVersions.arcadia)) as SparkPoolFeedResponse;
return response && response.value; return response && response.value;
} catch (error) { } catch (error) {
Logger.logError(error, "ArcadiaManager/listSparkPoolsAsync"); Logger.logError(getErrorMessage(error), "ArcadiaManager/listSparkPoolsAsync");
throw error; throw error;
} }
} }

View File

@ -5,6 +5,7 @@ import { AuthType } from "../AuthType";
import * as Logger from "../Common/Logger"; import * as Logger from "../Common/Logger";
import { configContext, Platform } from "../ConfigContext"; import { configContext, Platform } from "../ConfigContext";
import { userContext } from "../UserContext"; import { userContext } from "../UserContext";
import { getErrorMessage } from "../Common/ErrorHandlingUtils";
export function getAuthorizationHeader(): ViewModels.AuthorizationTokenHeaderMetadata { export function getAuthorizationHeader(): ViewModels.AuthorizationTokenHeaderMetadata {
if (window.authType === AuthType.EncryptedToken) { if (window.authType === AuthType.EncryptedToken) {
@ -28,7 +29,7 @@ export async function getArcadiaAuthToken(
const token = await AuthHeadersUtil.getAccessToken(arcadiaEndpoint, tenantId); const token = await AuthHeadersUtil.getAccessToken(arcadiaEndpoint, tenantId);
return token; return token;
} catch (error) { } catch (error) {
Logger.logError(error, "AuthorizationUtils/getArcadiaAuthToken"); Logger.logError(getErrorMessage(error), "AuthorizationUtils/getArcadiaAuthToken");
throw error; throw error;
} }
} }

View File

@ -1,7 +1,6 @@
import { IGalleryItem, JunoClient } from "../Juno/JunoClient"; import { IGalleryItem, JunoClient } from "../Juno/JunoClient";
import * as NotificationConsoleUtils from "./NotificationConsoleUtils"; import * as NotificationConsoleUtils from "./NotificationConsoleUtils";
import { ConsoleDataType } from "../Explorer/Menus/NotificationConsole/NotificationConsoleComponent"; import { ConsoleDataType } from "../Explorer/Menus/NotificationConsole/NotificationConsoleComponent";
import * as Logger from "../Common/Logger";
import { import {
GalleryTab, GalleryTab,
SortBy, SortBy,
@ -10,6 +9,7 @@ import {
import Explorer from "../Explorer/Explorer"; import Explorer from "../Explorer/Explorer";
import { IChoiceGroupOption, IChoiceGroupProps } from "office-ui-fabric-react"; import { IChoiceGroupOption, IChoiceGroupProps } from "office-ui-fabric-react";
import { TextFieldProps } from "../Explorer/Controls/DialogReactComponent/DialogComponent"; import { TextFieldProps } from "../Explorer/Controls/DialogReactComponent/DialogComponent";
import { handleError } from "../Common/ErrorHandlingUtils";
const defaultSelectedAbuseCategory = "Other"; const defaultSelectedAbuseCategory = "Other";
const abuseCategories: IChoiceGroupOption[] = [ const abuseCategories: IChoiceGroupOption[] = [
@ -122,9 +122,11 @@ export function reportAbuse(
); );
onComplete(response.data); onComplete(response.data);
} catch (error) { } catch (error) {
const message = `Failed to submit report on ${data.name} violating code of conduct: ${error}`; handleError(
Logger.logError(message, "GalleryUtils/reportAbuse"); error,
NotificationConsoleUtils.logConsoleInfo(message); "GalleryUtils/reportAbuse",
`Failed to submit report on ${data.name} violating code of conduct`
);
} }
clearSubmitReportNotification(); clearSubmitReportNotification();
@ -185,9 +187,7 @@ export function downloadItem(
onComplete(increaseDownloadResponse.data); onComplete(increaseDownloadResponse.data);
} }
} catch (error) { } catch (error) {
const message = `Failed to download ${data.name}: ${error}`; handleError(error, "GalleryUtils/downloadItem", `Failed to download ${data.name}`);
Logger.logError(message, "GalleryUtils/downloadItem");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
NotificationConsoleUtils.clearInProgressMessageWithId(notificationId); NotificationConsoleUtils.clearInProgressMessageWithId(notificationId);
@ -212,9 +212,7 @@ export async function favoriteItem(
onComplete(response.data); onComplete(response.data);
} catch (error) { } catch (error) {
const message = `Failed to favorite ${data.name}: ${error}`; handleError(error, "GalleryUtils/favoriteItem", `Failed to favorite ${data.name}`);
Logger.logError(message, "GalleryUtils/favoriteItem");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
} }
} }
@ -234,9 +232,7 @@ export async function unfavoriteItem(
onComplete(response.data); onComplete(response.data);
} catch (error) { } catch (error) {
const message = `Failed to unfavorite ${data.name}: ${error}`; handleError(error, "GalleryUtils/unfavoriteItem", `Failed to unfavorite ${data.name}`);
Logger.logError(message, "GalleryUtils/unfavoriteItem");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
} }
} }
@ -268,9 +264,7 @@ export function deleteItem(
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Info, `Successfully removed ${name} from gallery`); NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Info, `Successfully removed ${name} from gallery`);
onComplete(response.data); onComplete(response.data);
} catch (error) { } catch (error) {
const message = `Failed to remove ${name} from gallery: ${error}`; handleError(error, "GalleryUtils/deleteItem", `Failed to remove ${name} from gallery`);
Logger.logError(message, "GalleryUtils/deleteItem");
NotificationConsoleUtils.logConsoleMessage(ConsoleDataType.Error, message);
} }
NotificationConsoleUtils.clearInProgressMessageWithId(notificationId); NotificationConsoleUtils.clearInProgressMessageWithId(notificationId);

View File

@ -1,5 +1,6 @@
import * as DataModels from "../Contracts/DataModels"; import * as DataModels from "../Contracts/DataModels";
import * as Logger from "../Common/Logger"; import * as Logger from "../Common/Logger";
import { getErrorMessage } from "../Common/ErrorHandlingUtils";
interface KernelConnectionMetadata { interface KernelConnectionMetadata {
name: string; name: string;
@ -78,13 +79,13 @@ export class NotebookConfigurationUtils {
if (!response.ok) { if (!response.ok) {
const responseMessage = await response.json(); const responseMessage = await response.json();
Logger.logError( Logger.logError(
JSON.stringify(responseMessage), getErrorMessage(responseMessage),
"NotebookConfigurationUtils/configureServiceEndpoints", "NotebookConfigurationUtils/configureServiceEndpoints",
response.status response.status
); );
} }
} catch (error) { } catch (error) {
Logger.logError(error, "NotebookConfigurationUtils/configureServiceEndpoints"); Logger.logError(getErrorMessage(error), "NotebookConfigurationUtils/configureServiceEndpoints");
} }
} }
} }