From 44c29b32f01289ec90985573bd4d6ea9e217bb23 Mon Sep 17 00:00:00 2001 From: David Hasani Date: Fri, 20 Dec 2024 23:43:46 -0800 Subject: [PATCH 1/4] fix(amazonq): don't emit entire spawnResult in telemetry --- .../chat/controller/controller.ts | 48 ++++++++++++------- .../commands/startTransformByQ.ts | 13 ++--- 2 files changed, 34 insertions(+), 27 deletions(-) diff --git a/packages/core/src/amazonqGumby/chat/controller/controller.ts b/packages/core/src/amazonqGumby/chat/controller/controller.ts index e79ce883e0a..8eea618401a 100644 --- a/packages/core/src/amazonqGumby/chat/controller/controller.ts +++ b/packages/core/src/amazonqGumby/chat/controller/controller.ts @@ -269,29 +269,41 @@ export class GumbyController { } private async handleLanguageUpgrade(message: any) { - try { - await this.beginTransformation(message) - const validProjects = await this.validateLanguageUpgradeProjects(message) - if (validProjects.length > 0) { - this.sessionStorage.getSession().updateCandidateProjects(validProjects) - await this.messenger.sendLanguageUpgradeProjectPrompt(validProjects, message.tabID) + await telemetry.codeTransform_submitSelection.run(async () => { + telemetry.record({ + codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), + userChoice: 'language upgrade', + }) + try { + await this.beginTransformation(message) + const validProjects = await this.validateLanguageUpgradeProjects(message) + if (validProjects.length > 0) { + this.sessionStorage.getSession().updateCandidateProjects(validProjects) + await this.messenger.sendLanguageUpgradeProjectPrompt(validProjects, message.tabID) + } + } catch (err: any) { + getLogger().error(`Error handling language upgrade: ${err}`) } - } catch (err: any) { - getLogger().error(`Error handling language upgrade: ${err}`) - } + }) } private async handleSQLConversion(message: any) { - try { - await this.beginTransformation(message) - const validProjects = await this.validateSQLConversionProjects(message) - if (validProjects.length > 0) { - this.sessionStorage.getSession().updateCandidateProjects(validProjects) - await this.messenger.sendSelectSQLMetadataFileMessage(message.tabID) + await telemetry.codeTransform_submitSelection.run(async () => { + telemetry.record({ + codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), + userChoice: 'sql conversion', + }) + try { + await this.beginTransformation(message) + const validProjects = await this.validateSQLConversionProjects(message) + if (validProjects.length > 0) { + this.sessionStorage.getSession().updateCandidateProjects(validProjects) + await this.messenger.sendSelectSQLMetadataFileMessage(message.tabID) + } + } catch (err: any) { + getLogger().error(`Error handling SQL conversion: ${err}`) } - } catch (err: any) { - getLogger().error(`Error handling SQL conversion: ${err}`) - } + }) } private async validateLanguageUpgradeProjects(message: any) { diff --git a/packages/core/src/codewhisperer/commands/startTransformByQ.ts b/packages/core/src/codewhisperer/commands/startTransformByQ.ts index 47217fa928d..033853c4a50 100644 --- a/packages/core/src/codewhisperer/commands/startTransformByQ.ts +++ b/packages/core/src/codewhisperer/commands/startTransformByQ.ts @@ -650,19 +650,14 @@ export async function getValidSQLConversionCandidateProjects() { }) const openProjects = await getOpenProjects() const javaProjects = await getJavaProjects(openProjects) - let resultLog = '' for (const project of javaProjects) { // as long as at least one of these strings is found, project contains embedded SQL statements const searchStrings = ['oracle.jdbc.OracleDriver', 'jdbc:oracle:thin:@', 'jdbc:oracle:oci:@', 'jdbc:odbc:'] for (const str of searchStrings) { const spawnResult = await findStringInDirectory(str, project.path) - // just for telemetry purposes - if (spawnResult.error || spawnResult.stderr) { - resultLog += `search failed: ${JSON.stringify(spawnResult)}` - } else { - resultLog += `search succeeded: ${spawnResult.exitCode}` - } - getLogger().info(`CodeTransformation: searching for ${str} in ${project.path}, result = ${resultLog}`) + getLogger().info( + `CodeTransformation: searching for ${str} in ${project.path}, status code = ${spawnResult.exitCode}` + ) if (spawnResult.exitCode === 0) { embeddedSQLProjects.push(project) break @@ -673,7 +668,7 @@ export async function getValidSQLConversionCandidateProjects() { `CodeTransformation: found ${embeddedSQLProjects.length} projects with embedded SQL statements` ) telemetry.record({ - codeTransformMetadata: resultLog, + codeTransformMetadata: `Found ${embeddedSQLProjects.length} projects with embedded SQL`, }) }) return embeddedSQLProjects From ea296f01897a0334f8ae6ff2578e22f80313a7ea Mon Sep 17 00:00:00 2001 From: David Hasani Date: Fri, 20 Dec 2024 23:47:48 -0800 Subject: [PATCH 2/4] redundant metric --- .../core/src/amazonqGumby/chat/controller/controller.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/packages/core/src/amazonqGumby/chat/controller/controller.ts b/packages/core/src/amazonqGumby/chat/controller/controller.ts index 8eea618401a..d7283ef423a 100644 --- a/packages/core/src/amazonqGumby/chat/controller/controller.ts +++ b/packages/core/src/amazonqGumby/chat/controller/controller.ts @@ -680,14 +680,6 @@ export class GumbyController { case ConversationState.WAITING_FOR_TRANSFORMATION_OBJECTIVE: { const objective = data.message.trim().toLowerCase() - // since we're prompting the user, their project(s) must be eligible for both types of transformations, so track how often this happens here - if (objective === 'language upgrade' || objective === 'sql conversion') { - telemetry.codeTransform_submitSelection.emit({ - codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), - userChoice: objective, - result: 'Succeeded', - }) - } if (objective === 'language upgrade') { await this.handleLanguageUpgrade(data) } else if (objective === 'sql conversion') { From 538545cb891cd751a820e411b4a68bca98c6ed2f Mon Sep 17 00:00:00 2001 From: David Hasani Date: Sat, 21 Dec 2024 00:09:18 -0800 Subject: [PATCH 3/4] add metric --- .../src/amazonqGumby/chat/controller/controller.ts | 8 ++++++++ .../src/codewhisperer/commands/startTransformByQ.ts | 13 +++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/core/src/amazonqGumby/chat/controller/controller.ts b/packages/core/src/amazonqGumby/chat/controller/controller.ts index d7283ef423a..8eea618401a 100644 --- a/packages/core/src/amazonqGumby/chat/controller/controller.ts +++ b/packages/core/src/amazonqGumby/chat/controller/controller.ts @@ -680,6 +680,14 @@ export class GumbyController { case ConversationState.WAITING_FOR_TRANSFORMATION_OBJECTIVE: { const objective = data.message.trim().toLowerCase() + // since we're prompting the user, their project(s) must be eligible for both types of transformations, so track how often this happens here + if (objective === 'language upgrade' || objective === 'sql conversion') { + telemetry.codeTransform_submitSelection.emit({ + codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), + userChoice: objective, + result: 'Succeeded', + }) + } if (objective === 'language upgrade') { await this.handleLanguageUpgrade(data) } else if (objective === 'sql conversion') { diff --git a/packages/core/src/codewhisperer/commands/startTransformByQ.ts b/packages/core/src/codewhisperer/commands/startTransformByQ.ts index 033853c4a50..47217fa928d 100644 --- a/packages/core/src/codewhisperer/commands/startTransformByQ.ts +++ b/packages/core/src/codewhisperer/commands/startTransformByQ.ts @@ -650,14 +650,19 @@ export async function getValidSQLConversionCandidateProjects() { }) const openProjects = await getOpenProjects() const javaProjects = await getJavaProjects(openProjects) + let resultLog = '' for (const project of javaProjects) { // as long as at least one of these strings is found, project contains embedded SQL statements const searchStrings = ['oracle.jdbc.OracleDriver', 'jdbc:oracle:thin:@', 'jdbc:oracle:oci:@', 'jdbc:odbc:'] for (const str of searchStrings) { const spawnResult = await findStringInDirectory(str, project.path) - getLogger().info( - `CodeTransformation: searching for ${str} in ${project.path}, status code = ${spawnResult.exitCode}` - ) + // just for telemetry purposes + if (spawnResult.error || spawnResult.stderr) { + resultLog += `search failed: ${JSON.stringify(spawnResult)}` + } else { + resultLog += `search succeeded: ${spawnResult.exitCode}` + } + getLogger().info(`CodeTransformation: searching for ${str} in ${project.path}, result = ${resultLog}`) if (spawnResult.exitCode === 0) { embeddedSQLProjects.push(project) break @@ -668,7 +673,7 @@ export async function getValidSQLConversionCandidateProjects() { `CodeTransformation: found ${embeddedSQLProjects.length} projects with embedded SQL statements` ) telemetry.record({ - codeTransformMetadata: `Found ${embeddedSQLProjects.length} projects with embedded SQL`, + codeTransformMetadata: resultLog, }) }) return embeddedSQLProjects From afb52a505f450b03768c49fb98f1da8c72631e93 Mon Sep 17 00:00:00 2001 From: David Hasani Date: Mon, 23 Dec 2024 15:30:42 -0800 Subject: [PATCH 4/4] address comments --- .../chat/controller/controller.ts | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/core/src/amazonqGumby/chat/controller/controller.ts b/packages/core/src/amazonqGumby/chat/controller/controller.ts index 8eea618401a..56b551f18af 100644 --- a/packages/core/src/amazonqGumby/chat/controller/controller.ts +++ b/packages/core/src/amazonqGumby/chat/controller/controller.ts @@ -269,41 +269,41 @@ export class GumbyController { } private async handleLanguageUpgrade(message: any) { - await telemetry.codeTransform_submitSelection.run(async () => { - telemetry.record({ - codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), - userChoice: 'language upgrade', - }) - try { + await telemetry.codeTransform_submitSelection + .run(async () => { + telemetry.record({ + codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), + userChoice: 'language upgrade', + }) await this.beginTransformation(message) const validProjects = await this.validateLanguageUpgradeProjects(message) if (validProjects.length > 0) { this.sessionStorage.getSession().updateCandidateProjects(validProjects) await this.messenger.sendLanguageUpgradeProjectPrompt(validProjects, message.tabID) } - } catch (err: any) { + }) + .catch((err) => { getLogger().error(`Error handling language upgrade: ${err}`) - } - }) + }) } private async handleSQLConversion(message: any) { - await telemetry.codeTransform_submitSelection.run(async () => { - telemetry.record({ - codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), - userChoice: 'sql conversion', - }) - try { + await telemetry.codeTransform_submitSelection + .run(async () => { + telemetry.record({ + codeTransformSessionId: CodeTransformTelemetryState.instance.getSessionId(), + userChoice: 'sql conversion', + }) await this.beginTransformation(message) const validProjects = await this.validateSQLConversionProjects(message) if (validProjects.length > 0) { this.sessionStorage.getSession().updateCandidateProjects(validProjects) await this.messenger.sendSelectSQLMetadataFileMessage(message.tabID) } - } catch (err: any) { + }) + .catch((err) => { getLogger().error(`Error handling SQL conversion: ${err}`) - } - }) + }) } private async validateLanguageUpgradeProjects(message: any) {