Skip to content

Commit 79ede19

Browse files
authored
telemetry: code transform data byte size, result field #4180
Problem: 1. Code Transform artifact upload and download metrics for VSCode did not have totalByteSize. 2. Need to emit dependenciesCopied metric. 3. Several Code Transform metrics did not have `result` field. Solution: 1. Include totalByteSize where applicable. 2. Emit dependenciesCopied metric. 3. Add `result` field to metrics. Validated dependenciesCopied emitted: - `telemetry: emitted metric "codeTransform_dependenciesCopied" -> {"Metadata":[{"Key":"parentMetric","Value":"vscode_executeCommand"},{"Key":"codeTransformSessionId","Value":"<redacted>"},{"Key":"result","Value":"Succeeded"},{"Key":"awsAccount","Value":"not-set"},{"Key":"awsRegion","Value":"us-west-2"}],"MetricName":"codeTransform_dependenciesCopied","Value":1,"Unit":"None","Passive":false,"EpochTimestamp":1702660044892}` Validated metrics are emitted with expected TotalByteSize: - `telemetry: emitted metric "codeTransform_jobCreateZipEndTime" -> {"Metadata":[{"Key":"parentMetric","Value":"vscode_executeCommand"},{"Key":"codeTransformSessionId","Value":"<redacted>"},{"Key":"codeTransformTotalByteSize","Value":"2522725"},{"Key":"codeTransformRunTimeLatency","Value":"11208"},{"Key":"result","Value":"Succeeded"},{"Key":"awsAccount","Value":"not-set"},{"Key":"awsRegion","Value":"us-west-2"}],"MetricName":"codeTransform_jobCreateZipEndTime","Value":1,"Unit":"None","Passive":false,"EpochTimestamp":1702660047014}` - `telemetry: emitted metric "codeTransform_logApiLatency" -> {"Metadata":[{"Key":"parentMetric","Value":"vscode_executeCommand"},{"Key":"codeTransformApiNames","Value":"UploadZip"},{"Key":"codeTransformSessionId","Value":"<redacted>"}, {"Key":"codeTransformUploadId","Value":"<redacted>"},{"Key":"codeTransformRunTimeLatency","Value":"5667"},{"Key":"codeTransformTotalByteSize","Value":"2522725"},{"Key":"result","Value":"Succeeded"},{"Key":"awsAccount","Value":"not-set"},{"Key":"awsRegion","Value":"us-west-2"}],"MetricName":"codeTransform_logApiLatency","Value":1,"Unit":"None","Passive":true,"EpochTimestamp":1702660057297}` - `telemetry: emitted metric "codeTransform_jobArtifactDownloadAndDeserializeTime" -> {"Metadata":[{"Key":"codeTransformSessionId","Value":"<redacted>"},{"Key":"codeTransformJobId","Value":"<redacted>"},{"Key":"codeTransformRunTimeLatency","Value":"70"},{"Key":"codeTransformTotalByteSize","Value":"152486"},{"Key":"result","Value":"Succeeded"},{"Key":"awsAccount","Value":"not-set"},{"Key":"awsRegion","Value":"us-west-2"}],"MetricName":"codeTransform_jobArtifactDownloadAndDeserializeTime","Value":1,"Unit":"None","Passive":false,"EpochTimestamp":1702660482671}` - `telemetry: emitted metric "codeTransform_logApiLatency" -> {"Metadata":[{"Key":"codeTransformApiNames","Value":"ExportResultArchive"},{"Key":"codeTransformSessionId","Value":"<redacted>"},{"Key":"codeTransformJobId","Value":"<redacted>"},{"Key":"codeTransformRunTimeLatency","Value":"1133"},{"Key":"codeTransformTotalByteSize","Value":"152486"},{"Key":"codeTransformRequestId","Value":"<redacted>"},{"Key":"awsAccount","Value":"not-set"},{"Key":"awsRegion","Value":"us-west-2"}],"MetricName":"codeTransform_logApiLatency","Value":1,"Unit":"None","Passive":true,"EpochTimestamp":1702660482600}`
1 parent f8606cc commit 79ede19

File tree

5 files changed

+55
-7
lines changed

5 files changed

+55
-7
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "Feature",
3+
"description": "Code Transform Telemetry includes additional metadata"
4+
}

src/amazonqGumby/telemetry/codeTransformTelemetry.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { telemetry } from '../../shared/telemetry/telemetry'
1010
import { JDKVersion } from '../../codewhisperer/models/model'
1111
import * as CodeWhispererConstants from '../../codewhisperer/models/constants'
1212
import { codeTransformTelemetryState } from './codeTransformTelemetryState'
13+
import { MetadataResult } from '../../shared/telemetry/telemetryClient'
1314

1415
export enum CancelActionPositions {
1516
ApiError = 'apiError',
@@ -32,11 +33,13 @@ export const logCodeTransformInitiatedMetric = (source: string): void => {
3233
telemetry.codeTransform_isDoubleClickedToTriggerUserModal.emit({
3334
codeTransformStartSrcComponents: StartActionPositions.DevToolsSidePanel,
3435
...commonMetrics,
36+
result: MetadataResult.Pass,
3537
})
3638
} else if (source === StartActionPositions.BottomHubPanel) {
3739
telemetry.codeTransform_isDoubleClickedToTriggerUserModal.emit({
3840
codeTransformStartSrcComponents: StartActionPositions.BottomHubPanel,
3941
...commonMetrics,
42+
result: MetadataResult.Pass,
4043
})
4144
}
4245
}

src/codewhisperer/commands/startTransformByQ.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { codeTransformTelemetryState } from '../../amazonqGumby/telemetry/codeTr
3737
import { ToolkitError } from '../../shared/errors'
3838
import { TransformByQUploadArchiveFailed } from '../../amazonqGumby/models/model'
3939
import { CancelActionPositions, toJDKMetricValue } from '../../amazonqGumby/telemetry/codeTransformTelemetry'
40+
import { MetadataResult } from '../../shared/telemetry/telemetryClient'
4041

4142
const localize = nls.loadMessageBundle()
4243
export const stopTransformByQButton = localize('aws.codewhisperer.stop.transform.by.q', 'Stop')
@@ -122,11 +123,13 @@ export async function startTransformByQ() {
122123
if (selection !== 'Transform') {
123124
telemetry.codeTransform_jobIsCanceledFromUserPopupClick.emit({
124125
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
126+
result: MetadataResult.Pass,
125127
})
126128
throw new ToolkitError('Transform cancelled', { code: 'DidNotConfirmDisclaimer', cancelled: true })
127129
} else {
128130
telemetry.codeTransform_jobIsStartedFromUserPopupClick.emit({
129131
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
132+
result: MetadataResult.Pass,
130133
})
131134
}
132135

@@ -146,6 +149,7 @@ export async function startTransformByQ() {
146149
codeTransformJavaTargetVersionsAllowed: toJDKMetricValue(
147150
transformByQState.getTargetJDKVersion()
148151
) as CodeTransformJavaTargetVersionsAllowed,
152+
result: MetadataResult.Pass,
149153
})
150154

151155
vscode.commands.executeCommand('workbench.view.extension.aws-codewhisperer-transformation-hub')
@@ -347,6 +351,7 @@ export async function confirmStopTransformByQ(
347351
telemetry.codeTransform_jobIsCancelledByUser.emit({
348352
codeTransformCancelSrcComponents: cancelSrc,
349353
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
354+
result: MetadataResult.Pass,
350355
})
351356
}
352357
}

src/codewhisperer/service/transformByQHandler.ts

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ export async function validateProjectSelection(project: vscode.QuickPickItem) {
9595
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
9696
codeTransformPreValidationError: 'NoJavaProject',
9797
result: MetadataResult.Fail,
98+
reason: 'NoJavaProjectsAvailable',
9899
})
99100
throw new TransformByQJavaProjectNotFound()
100101
}
@@ -109,6 +110,7 @@ export async function validateProjectSelection(project: vscode.QuickPickItem) {
109110
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
110111
codeTransformPreValidationError: 'NoJavaProject',
111112
result: MetadataResult.Fail,
113+
reason: 'CannotDetermineJavaVersion',
112114
})
113115
throw new ToolkitError('Unable to determine Java version', {
114116
code: 'CannotDetermineJavaVersion',
@@ -151,6 +153,7 @@ export async function validateProjectSelection(project: vscode.QuickPickItem) {
151153
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
152154
codeTransformPreValidationError: 'NoPom',
153155
result: MetadataResult.Fail,
156+
reason: 'CouldNotFindPomXml',
154157
})
155158
throw new ToolkitError('No valid Maven build file found', { code: 'CouldNotFindPomXml' })
156159
}
@@ -196,8 +199,8 @@ export async function uploadArtifactToS3(fileName: string, resp: CreateUploadUrl
196199
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
197200
codeTransformUploadId: resp.uploadId,
198201
codeTransformRunTimeLatency: calculateTotalLatency(apiStartTime),
199-
// TODO: A nice to have would be getting the zipUploadSize
200-
codeTransformTotalByteSize: 0,
202+
codeTransformTotalByteSize: (await fs.promises.stat(fileName)).size,
203+
result: MetadataResult.Pass,
201204
})
202205
getLogger().info(`CodeTransform: Status from S3 Upload = ${response.status}`)
203206
} catch (e: any) {
@@ -208,6 +211,8 @@ export async function uploadArtifactToS3(fileName: string, resp: CreateUploadUrl
208211
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
209212
codeTransformApiErrorMessage: errorMessage,
210213
codeTransformRequestId: e?.requestId,
214+
result: MetadataResult.Fail,
215+
reason: 'UploadToS3Failed',
211216
})
212217
// Pass along error to callee function
213218
throw new ToolkitError(errorMessage, { cause: e as Error })
@@ -228,6 +233,7 @@ export async function stopJob(jobId: string) {
228233
codeTransformJobId: jobId,
229234
codeTransformRunTimeLatency: calculateTotalLatency(apiStartTime),
230235
codeTransformRequestId: response.$response.requestId,
236+
result: MetadataResult.Pass,
231237
})
232238
}
233239
} catch (e: any) {
@@ -239,6 +245,8 @@ export async function stopJob(jobId: string) {
239245
codeTransformJobId: jobId,
240246
codeTransformApiErrorMessage: e?.message || errorMessage,
241247
codeTransformRequestId: e?.requestId,
248+
result: MetadataResult.Fail,
249+
reason: 'StopTransformationFailed',
242250
})
243251
throw new ToolkitError(errorMessage, { cause: e as Error })
244252
}
@@ -262,6 +270,7 @@ export async function uploadPayload(payloadFileName: string) {
262270
codeTransformRunTimeLatency: calculateTotalLatency(apiStartTime),
263271
codeTransformUploadId: response.uploadId,
264272
codeTransformRequestId: response.$response.requestId,
273+
result: MetadataResult.Pass,
265274
})
266275
await uploadArtifactToS3(payloadFileName, response)
267276
return response.uploadId
@@ -273,6 +282,8 @@ export async function uploadPayload(payloadFileName: string) {
273282
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
274283
codeTransformApiErrorMessage: errorMessage,
275284
codeTransformRequestId: e?.requestId,
285+
result: MetadataResult.Fail,
286+
reason: 'CreateUploadUrlFailed',
276287
})
277288
// Pass along error to callee function
278289
throw new ToolkitError(errorMessage, { cause: e as Error })
@@ -375,6 +386,10 @@ export async function zipCode(modulePath: string) {
375386
zip.addLocalFile(file, path.dirname(paddedPath))
376387
}
377388
zipManifest.dependenciesRoot += `${dependencyFolderName}/`
389+
telemetry.codeTransform_dependenciesCopied.emit({
390+
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
391+
result: MetadataResult.Pass,
392+
})
378393
} else {
379394
zipManifest.dependenciesRoot = undefined
380395
}
@@ -393,8 +408,7 @@ export async function zipCode(modulePath: string) {
393408
const mavenStatus = mavenFailed ? MetadataResult.Fail : MetadataResult.Pass
394409
telemetry.codeTransform_jobCreateZipEndTime.emit({
395410
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
396-
// TODO: A nice to have would be getting the zipUploadSize
397-
codeTransformTotalByteSize: 0,
411+
codeTransformTotalByteSize: (await fs.promises.stat(tempFilePath)).size,
398412
codeTransformRunTimeLatency: calculateTotalLatency(zipStartTime),
399413
result: mavenStatus,
400414
reason: mavenFailed ? 'MavenCommandFailed' : undefined,
@@ -424,6 +438,7 @@ export async function startJob(uploadId: string) {
424438
codeTransformRunTimeLatency: calculateTotalLatency(apiStartTime),
425439
codeTransformJobId: response.transformationJobId,
426440
codeTransformRequestId: response.$response.requestId,
441+
result: MetadataResult.Pass,
427442
})
428443
return response.transformationJobId
429444
} catch (e: any) {
@@ -434,6 +449,8 @@ export async function startJob(uploadId: string) {
434449
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
435450
codeTransformApiErrorMessage: errorMessage,
436451
codeTransformRequestId: e?.requestId,
452+
result: MetadataResult.Fail,
453+
reason: 'StartTransformationFailed',
437454
})
438455
// Pass along error to callee function
439456
throw new ToolkitError(errorMessage, { cause: e as Error })
@@ -457,6 +474,7 @@ export async function getTransformationPlan(jobId: string) {
457474
codeTransformJobId: jobId,
458475
codeTransformRunTimeLatency: calculateTotalLatency(apiStartTime),
459476
codeTransformRequestId: response.$response.requestId,
477+
result: MetadataResult.Pass,
460478
})
461479
const logoAbsolutePath = globals.context.asAbsolutePath(
462480
path.join('resources', 'icons', 'aws', 'amazonq', 'transform-landing-page-icon.svg')
@@ -483,6 +501,8 @@ export async function getTransformationPlan(jobId: string) {
483501
codeTransformJobId: jobId,
484502
codeTransformApiErrorMessage: errorMessage,
485503
codeTransformRequestId: e?.requestId,
504+
result: MetadataResult.Fail,
505+
reason: 'GetTransformationPlanFailed',
486506
})
487507
// Pass along error to callee function
488508
throw new ToolkitError(errorMessage, { cause: e as Error })
@@ -502,6 +522,7 @@ export async function getTransformationSteps(jobId: string) {
502522
codeTransformJobId: jobId,
503523
codeTransformRunTimeLatency: calculateTotalLatency(apiStartTime),
504524
codeTransformRequestId: response.$response.requestId,
525+
result: MetadataResult.Pass,
505526
})
506527
return response.transformationPlan.transformationSteps
507528
} catch (e: any) {
@@ -513,6 +534,8 @@ export async function getTransformationSteps(jobId: string) {
513534
codeTransformJobId: jobId,
514535
codeTransformApiErrorMessage: errorMessage,
515536
codeTransformRequestId: e?.requestId,
537+
result: MetadataResult.Fail,
538+
reason: 'GetTransformationPlanFailed',
516539
})
517540
throw e
518541
}
@@ -534,6 +557,7 @@ export async function pollTransformationJob(jobId: string, validStates: string[]
534557
codeTransformJobId: jobId,
535558
codeTransformRunTimeLatency: calculateTotalLatency(apiStartTime),
536559
codeTransformRequestId: response.$response.requestId,
560+
result: MetadataResult.Pass,
537561
})
538562
status = response.transformationJob.status!
539563
if (response.transformationJob.reason) {
@@ -546,6 +570,7 @@ export async function pollTransformationJob(jobId: string, validStates: string[]
546570
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
547571
codeTransformJobId: jobId,
548572
codeTransformStatus: status,
573+
result: MetadataResult.Pass,
549574
})
550575
}
551576
transformByQState.setPolledJobStatus(status)
@@ -570,6 +595,8 @@ export async function pollTransformationJob(jobId: string, validStates: string[]
570595
codeTransformJobId: jobId,
571596
codeTransformApiErrorMessage: errorMessage,
572597
codeTransformRequestId: e?.requestId,
598+
result: MetadataResult.Fail,
599+
reason: 'GetTransformationFailed',
573600
})
574601
// Pass along error to callee function
575602
throw new ToolkitError(errorMessage, { cause: e as Error })

src/codewhisperer/service/transformationResultsViewProvider.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { getLogger } from '../../shared/logger'
1919
import { telemetry } from '../../shared/telemetry/telemetry'
2020
import { codeTransformTelemetryState } from '../../amazonqGumby/telemetry/codeTransformTelemetryState'
2121
import { calculateTotalLatency } from '../../amazonqGumby/telemetry/codeTransformTelemetry'
22+
import { MetadataResult } from '../../shared/telemetry/telemetryClient'
2223

2324
export abstract class ProposedChangeNode {
2425
abstract readonly resourcePath: string
@@ -286,10 +287,14 @@ export class ProposedTransformationExplorer {
286287
codeTransformJobId: transformByQState.getJobId(),
287288
codeTransformApiErrorMessage: e?.message || errorMessage,
288289
codeTransformRequestId: e?.requestId,
290+
result: MetadataResult.Fail,
291+
reason: 'ExportResultArchiveFailed',
289292
})
290293
throw new ToolkitError(errorMessage)
291294
}
292295

296+
const exportResultsArchiveSize = (await fs.promises.stat(pathToArchive)).size
297+
293298
let deserializeErrorMessage
294299
const deserializeArchiveStartTime = Date.now()
295300
try {
@@ -309,15 +314,16 @@ export class ProposedTransformationExplorer {
309314
)
310315
} catch (e: any) {
311316
deserializeErrorMessage = e?.message || 'Error during deserialization of result archive'
312-
} finally {
313317
getLogger().error('CodeTransform: ParseDiff error = ', deserializeErrorMessage)
318+
} finally {
314319
telemetry.codeTransform_jobArtifactDownloadAndDeserializeTime.emit({
315320
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
316321
codeTransformJobId: transformByQState.getJobId(),
317322
codeTransformRunTimeLatency: calculateTotalLatency(deserializeArchiveStartTime),
318-
// TODO: A nice to have would be getting the zip download size
319-
codeTransformTotalByteSize: 0,
323+
codeTransformTotalByteSize: exportResultsArchiveSize,
320324
codeTransformRuntimeError: deserializeErrorMessage,
325+
result: deserializeErrorMessage ? MetadataResult.Fail : MetadataResult.Pass,
326+
reason: deserializeErrorMessage ? 'DeserializationFailed' : undefined,
321327
})
322328
}
323329

@@ -329,6 +335,7 @@ export class ProposedTransformationExplorer {
329335
telemetry.codeTransform_vcsDiffViewerVisible.emit({
330336
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
331337
codeTransformJobId: transformByQState.getJobId(),
338+
result: MetadataResult.Pass,
332339
})
333340
})
334341

@@ -346,6 +353,7 @@ export class ProposedTransformationExplorer {
346353
telemetry.codeTransform_vcsViewerSubmitted.emit({
347354
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
348355
codeTransformJobId: transformByQState.getJobId(),
356+
result: MetadataResult.Pass,
349357
})
350358
})
351359

@@ -360,6 +368,7 @@ export class ProposedTransformationExplorer {
360368
codeTransformPatchViewerCancelSrcComponents: 'cancelButton',
361369
codeTransformSessionId: codeTransformTelemetryState.getSessionId(),
362370
codeTransformJobId: transformByQState.getJobId(),
371+
result: MetadataResult.Pass,
363372
})
364373
})
365374
}

0 commit comments

Comments
 (0)