From 1f4a1bb4bc9be4029c267a1589e51db4227d9ff0 Mon Sep 17 00:00:00 2001 From: amitjoshi Date: Wed, 14 Aug 2024 15:42:15 +0530 Subject: [PATCH] refactor: Update fetchRelatedFiles to include telemetry for error handling --- .../powerpages/PowerPagesChatParticipant.ts | 2 +- src/common/constants.ts | 2 + src/common/utilities/Utils.ts | 57 +++++++++++-------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/src/common/chat-participants/powerpages/PowerPagesChatParticipant.ts b/src/common/chat-participants/powerpages/PowerPagesChatParticipant.ts index c74876b4..0b1c81a4 100644 --- a/src/common/chat-participants/powerpages/PowerPagesChatParticipant.ts +++ b/src/common/chat-participants/powerpages/PowerPagesChatParticipant.ts @@ -166,7 +166,7 @@ export class PowerPagesChatParticipant { switch (activeFileParams.dataverseEntity) { case 'adx_webpage': if (activeFileUri) { - const files = await fetchRelatedFiles(activeFileUri, activeFileParams.dataverseEntity, activeFileParams.fieldType); + const files = await fetchRelatedFiles(activeFileUri, activeFileParams.dataverseEntity, activeFileParams.fieldType, this.telemetry); relatedFiles.push(...files); } break; diff --git a/src/common/constants.ts b/src/common/constants.ts index 0a98ae20..137dd692 100644 --- a/src/common/constants.ts +++ b/src/common/constants.ts @@ -63,3 +63,5 @@ export interface IRelatedFiles { fileContent: string; fileName: string; } + +export const COPILOT_RELATED_FILES_FETCH_FAILED = "CopilotRelatedFilesFetchFailed"; diff --git a/src/common/utilities/Utils.ts b/src/common/utilities/Utils.ts index 14f98e5e..0751587f 100644 --- a/src/common/utilities/Utils.ts +++ b/src/common/utilities/Utils.ts @@ -4,7 +4,7 @@ */ import * as vscode from "vscode"; -import { componentTypeSchema, EXTENSION_ID, EXTENSION_NAME, IRelatedFiles, relatedFilesSchema, SETTINGS_EXPERIMENTAL_STORE_NAME } from "../constants"; +import { componentTypeSchema, COPILOT_RELATED_FILES_FETCH_FAILED, EXTENSION_ID, EXTENSION_NAME, IRelatedFiles, relatedFilesSchema, SETTINGS_EXPERIMENTAL_STORE_NAME } from "../constants"; import { CUSTOM_TELEMETRY_FOR_POWER_PAGES_SETTING_NAME } from "../OneDSLoggerTelemetry/telemetryConstants"; import { COPILOT_UNAVAILABLE, DataverseEntityNameMap, EntityFieldMap, FieldTypeMap } from "../copilot/constants"; import { IActiveFileData } from "../copilot/model"; @@ -244,40 +244,49 @@ async function getFileContent(activeFileUri: vscode.Uri, customExtension: string return { customFileContent, customFileName }; } catch (error) { - // Log the error - return { customFileContent: '', customFileName: '' }; + throw new Error(`Error reading the custom file content: ${error}`); } } // Generic function to get file content based on type and component type async function getFileContentByType(activeFileUri: vscode.Uri, componentType: string, fileType: string): Promise<{ customFileContent: string; customFileName: string; }> { - const extension = componentTypeSchema[componentType]?.[fileType]; - if (!extension) { - //log the error - return { customFileContent: '', customFileName: '' }; + try { + const extension = componentTypeSchema[componentType]?.[fileType]; + if (!extension) { + throw new Error(`File type ${fileType} not found for component type ${componentType}`); + } + return await getFileContent(activeFileUri, extension); + } catch (error) { + const message = (error as Error)?.message; + throw new Error(message); } - return getFileContent(activeFileUri, extension); } //fetchRelatedFiles function based on component type -export async function fetchRelatedFiles(activeFileUri: vscode.Uri, componentType: string, fieldType: string) { - const relatedFileTypes = relatedFilesSchema[componentType]?.[fieldType]; - if (!relatedFileTypes) { +export async function fetchRelatedFiles(activeFileUri: vscode.Uri, componentType: string, fieldType: string, telemetry: ITelemetry): Promise { + try { + const relatedFileTypes = relatedFilesSchema[componentType]?.[fieldType]; + if (!relatedFileTypes) { + return []; + } + + const files: IRelatedFiles[] = await Promise.all( + relatedFileTypes.map(async fileType => { + const fileContentResult = await getFileContentByType(activeFileUri, componentType, fileType); + return { + fileType, + fileContent: fileContentResult.customFileContent, + fileName: fileContentResult.customFileName + }; + }) + ); + + return files; + } catch (error) { + const message = (error as Error)?.message; + telemetry.sendTelemetryErrorEvent(COPILOT_RELATED_FILES_FETCH_FAILED, { error: message }); return []; } - - const files: IRelatedFiles[] = await Promise.all( - relatedFileTypes.map(async fileType => { - const fileContentResult = await getFileContentByType(activeFileUri, componentType, fileType); - return { - fileType, - fileContent: fileContentResult.customFileContent, - fileName: fileContentResult.customFileName - }; - }) - ); - - return files; } export function getFilePathFromUri(uri: vscode.Uri): string {