@@ -22,14 +22,9 @@ import { RawCodeScanIssue } from '../models/model'
22
22
import * as crypto from 'crypto'
23
23
import path = require( 'path' )
24
24
import { pageableToCollection } from '../../shared/utilities/collectionUtils'
25
- import {
26
- ArtifactMap ,
27
- CreateUploadUrlRequest ,
28
- CreateUploadUrlResponse ,
29
- UploadIntent ,
30
- } from '../client/codewhispereruserclient'
25
+ import { ArtifactMap , CreateUploadUrlRequest , CreateUploadUrlResponse } from '../client/codewhispereruserclient'
31
26
import { TelemetryHelper } from '../util/telemetryHelper'
32
- import request from '../../shared/request'
27
+ import request , { RequestError } from '../../shared/request'
33
28
import { ZipMetadata } from '../util/zipUtil'
34
29
import { getNullLogger } from '../../shared/logger/logger'
35
30
import {
@@ -49,6 +44,8 @@ import { ChatSessionManager } from '../../amazonqTest/chat/storages/chatSession'
49
44
import { getStringHash } from '../../shared/utilities/textUtilities'
50
45
import { getClientId } from '../../shared/telemetry/util'
51
46
import globals from '../../shared/extensionGlobals'
47
+ import { AmazonqCreateUpload , Span , telemetry } from '../../shared/telemetry/telemetry'
48
+ import { AuthUtil } from '../util/authUtil'
52
49
53
50
export async function listScanResults (
54
51
client : DefaultCodeWhispererClient ,
@@ -276,45 +273,55 @@ export async function getPresignedUrlAndUpload(
276
273
scope : CodeWhispererConstants . CodeAnalysisScope ,
277
274
scanName : string
278
275
) {
279
- const logger = getLoggerForScope ( scope )
280
- if ( zipMetadata . zipFilePath === '' ) {
281
- getLogger ( ) . error ( 'Failed to create valid source zip' )
282
- throw new InvalidSourceZipError ( )
283
- }
284
- const srcReq : CreateUploadUrlRequest = {
285
- contentMd5 : getMd5 ( zipMetadata . zipFilePath ) ,
286
- artifactType : 'SourceCode' ,
287
- uploadIntent : getUploadIntent ( scope ) ,
288
- uploadContext : {
289
- codeAnalysisUploadContext : {
290
- codeScanName : scanName ,
276
+ const artifactMap = await telemetry . amazonq_createUpload . run ( async ( span ) => {
277
+ const logger = getLoggerForScope ( scope )
278
+ if ( zipMetadata . zipFilePath === '' ) {
279
+ getLogger ( ) . error ( 'Failed to create valid source zip' )
280
+ throw new InvalidSourceZipError ( )
281
+ }
282
+ const uploadIntent = getUploadIntent ( scope )
283
+ span . record ( {
284
+ amazonqUploadIntent : uploadIntent ,
285
+ amazonqRepositorySize : zipMetadata . srcPayloadSizeInBytes ,
286
+ credentialStartUrl : AuthUtil . instance . startUrl ,
287
+ } )
288
+ const srcReq : CreateUploadUrlRequest = {
289
+ contentMd5 : getMd5 ( zipMetadata . zipFilePath ) ,
290
+ artifactType : 'SourceCode' ,
291
+ uploadIntent : uploadIntent ,
292
+ uploadContext : {
293
+ codeAnalysisUploadContext : {
294
+ codeScanName : scanName ,
295
+ } ,
291
296
} ,
292
- } ,
293
- }
294
- logger . verbose ( `Prepare for uploading src context...` )
295
- const srcResp = await client . createUploadUrl ( srcReq ) . catch ( ( err ) => {
296
- getLogger ( ) . error ( `Failed getting presigned url for uploading src context. Request id: ${ err . requestId } ` )
297
- throw new CreateUploadUrlError ( err )
297
+ }
298
+ logger . verbose ( `Prepare for uploading src context...` )
299
+ const srcResp = await client . createUploadUrl ( srcReq ) . catch ( ( err ) => {
300
+ getLogger ( ) . error ( `Failed getting presigned url for uploading src context. Request id: ${ err . requestId } ` )
301
+ span . record ( { requestId : err . requestId } )
302
+ throw new CreateUploadUrlError ( err . message )
303
+ } )
304
+ logger . verbose ( `CreateUploadUrlRequest request id: ${ srcResp . $response . requestId } ` )
305
+ logger . verbose ( `Complete Getting presigned Url for uploading src context.` )
306
+ logger . verbose ( `Uploading src context...` )
307
+ await uploadArtifactToS3 ( zipMetadata . zipFilePath , srcResp , FeatureUseCase . CODE_SCAN , scope , span )
308
+ logger . verbose ( `Complete uploading src context.` )
309
+ const artifactMap : ArtifactMap = {
310
+ SourceCode : srcResp . uploadId ,
311
+ }
312
+ return artifactMap
298
313
} )
299
- logger . verbose ( `CreateUploadUrlRequest request id: ${ srcResp . $response . requestId } ` )
300
- logger . verbose ( `Complete Getting presigned Url for uploading src context.` )
301
- logger . verbose ( `Uploading src context...` )
302
- await uploadArtifactToS3 ( zipMetadata . zipFilePath , srcResp , FeatureUseCase . CODE_SCAN , scope )
303
- logger . verbose ( `Complete uploading src context.` )
304
- const artifactMap : ArtifactMap = {
305
- SourceCode : srcResp . uploadId ,
306
- }
307
314
return artifactMap
308
315
}
309
316
310
- function getUploadIntent ( scope : CodeWhispererConstants . CodeAnalysisScope ) : UploadIntent {
317
+ function getUploadIntent ( scope : CodeWhispererConstants . CodeAnalysisScope ) {
311
318
if (
312
- scope === CodeWhispererConstants . CodeAnalysisScope . FILE_AUTO ||
319
+ scope === CodeWhispererConstants . CodeAnalysisScope . PROJECT ||
313
320
scope === CodeWhispererConstants . CodeAnalysisScope . FILE_ON_DEMAND
314
321
) {
315
- return CodeWhispererConstants . fileScanUploadIntent
316
- } else {
317
322
return CodeWhispererConstants . projectScanUploadIntent
323
+ } else {
324
+ return CodeWhispererConstants . fileScanUploadIntent
318
325
}
319
326
}
320
327
@@ -356,7 +363,8 @@ export async function uploadArtifactToS3(
356
363
fileName : string ,
357
364
resp : CreateUploadUrlResponse ,
358
365
featureUseCase : FeatureUseCase ,
359
- scope ?: CodeWhispererConstants . CodeAnalysisScope
366
+ scope ?: CodeWhispererConstants . CodeAnalysisScope ,
367
+ span ?: Span < AmazonqCreateUpload >
360
368
) {
361
369
const logger = getLoggerForScope ( scope )
362
370
const encryptionContext = `{"uploadId":"${ resp . uploadId } "}`
@@ -378,6 +386,14 @@ export async function uploadArtifactToS3(
378
386
} ) . response
379
387
logger . debug ( `StatusCode: ${ response . status } , Text: ${ response . statusText } ` )
380
388
} catch ( error ) {
389
+ if ( span && error instanceof RequestError ) {
390
+ const requestId = error . response . headers . get ( 'x-amz-request-id' ) ?? undefined
391
+ span . record ( {
392
+ requestId : requestId ,
393
+ requestServiceType : 's3' ,
394
+ httpStatusCode : error . code . toString ( ) ,
395
+ } )
396
+ }
381
397
let errorMessage = ''
382
398
const isCodeScan = featureUseCase === FeatureUseCase . CODE_SCAN
383
399
const featureType = isCodeScan ? 'security scans' : 'unit test generation'
0 commit comments