Skip to content

Commit c3bdd6a

Browse files
authored
fix(amazonq): noisy logs for file scans aws#4852
Problem File scans logs are too noisy Solution Use NullLogger for file scans except for errors
1 parent bce8640 commit c3bdd6a

File tree

4 files changed

+56
-37
lines changed

4 files changed

+56
-37
lines changed

packages/core/src/codewhisperer/commands/startSecurityScan.ts

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
pollScanJobStatus,
1919
listScanResults,
2020
throwIfCancelled,
21+
getLoggerForScope,
2122
} from '../service/securityScanHandler'
2223
import { runtimeLanguageContext } from '../util/runtimeLanguageContext'
2324
import { AggregatedCodeScanIssue, CodeScansState, codeScanState, CodeScanTelemetryEntry } from '../models/model'
@@ -89,6 +90,7 @@ export async function startSecurityScan(
8990
context: vscode.ExtensionContext,
9091
scope: CodeWhispererConstants.CodeAnalysisScope
9192
) {
93+
const logger = getLoggerForScope(scope)
9294
/**
9395
* Step 0: Initial Code Scan telemetry
9496
*/
@@ -113,7 +115,7 @@ export async function startSecurityScan(
113115
codewhispererCodeScanScope: scope,
114116
}
115117
try {
116-
getLogger().verbose(`Starting security scan `)
118+
logger.verbose(`Starting security scan `)
117119
/**
118120
* Step 1: Generate zip
119121
*/
@@ -124,7 +126,7 @@ export async function startSecurityScan(
124126

125127
const contextTruncationStartTime = performance.now()
126128
codeScanTelemetryEntry.contextTruncationDuration = performance.now() - contextTruncationStartTime
127-
getLogger().verbose(`Complete project context processing.`)
129+
logger.verbose(`Complete project context processing.`)
128130
codeScanTelemetryEntry.codewhispererCodeScanSrcPayloadBytes = zipMetadata.srcPayloadSizeInBytes
129131
codeScanTelemetryEntry.codewhispererCodeScanBuildPayloadBytes = zipMetadata.buildPayloadSizeInBytes
130132
codeScanTelemetryEntry.codewhispererCodeScanSrcZipFileBytes = zipMetadata.zipFileSizeInBytes
@@ -139,11 +141,8 @@ export async function startSecurityScan(
139141
const scanName = randomUUID()
140142
try {
141143
artifactMap = await getPresignedUrlAndUpload(client, zipMetadata, scope, scanName)
142-
} catch (error) {
143-
getLogger().error('Failed to upload code artifacts', error)
144-
throw error
145144
} finally {
146-
await zipUtil.removeTmpFiles(zipMetadata)
145+
await zipUtil.removeTmpFiles(zipMetadata, scope)
147146
codeScanTelemetryEntry.artifactsUploadDuration = performance.now() - uploadStartTime
148147
}
149148

@@ -162,7 +161,7 @@ export async function startSecurityScan(
162161
if (scanJob.status === 'Failed') {
163162
throw new Error(scanJob.errorMessage)
164163
}
165-
getLogger().verbose(`Created security scan job.`)
164+
logger.verbose(`Created security scan job.`)
166165
codeScanTelemetryEntry.codewhispererCodeScanJobId = scanJob.jobId
167166

168167
/**
@@ -178,12 +177,13 @@ export async function startSecurityScan(
178177
* Step 5: Process and render scan results
179178
*/
180179
throwIfCancelled(scope)
181-
getLogger().verbose(`Security scan job succeeded and start processing result.`)
180+
logger.verbose(`Security scan job succeeded and start processing result.`)
182181
const securityRecommendationCollection = await listScanResults(
183182
client,
184183
scanJob.jobId,
185184
CodeWhispererConstants.codeScanFindingsSchema,
186-
projectPath
185+
projectPath,
186+
scope
187187
)
188188
const { total, withFixes } = securityRecommendationCollection.reduce(
189189
(accumulator, current) => ({
@@ -195,7 +195,7 @@ export async function startSecurityScan(
195195
codeScanTelemetryEntry.codewhispererCodeScanTotalIssues = total
196196
codeScanTelemetryEntry.codewhispererCodeScanIssuesWithFixes = withFixes
197197
throwIfCancelled(scope)
198-
getLogger().verbose(`Security scan totally found ${total} issues. ${withFixes} of them have fixes.`)
198+
logger.verbose(`Security scan totally found ${total} issues. ${withFixes} of them have fixes.`)
199199
if (codeScanStartTime > securityScanRender.lastUpdated) {
200200
showSecurityScanResults(
201201
securityPanelViewProvider,
@@ -208,10 +208,10 @@ export async function startSecurityScan(
208208
codeScanStartTime
209209
)
210210
} else {
211-
getLogger().verbose('Received issues from older scan, discarding the results')
211+
logger.verbose('Received issues from older scan, discarding the results')
212212
}
213213

214-
getLogger().verbose(`Security scan completed.`)
214+
logger.verbose(`Security scan completed.`)
215215
} catch (error) {
216216
getLogger().error('Security scan failed.', error)
217217
if (codeScanState.isCancelling()) {

packages/core/src/codewhisperer/service/securityScanHandler.ts

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,24 @@ import {
2323
import { TelemetryHelper } from '../util/telemetryHelper'
2424
import request from '../../common/request'
2525
import { ZipMetadata } from '../util/zipUtil'
26+
import { getNullLogger } from '../../shared/logger/logger'
2627

2728
export async function listScanResults(
2829
client: DefaultCodeWhispererClient,
2930
jobId: string,
3031
codeScanFindingsSchema: string,
31-
projectPath: string
32+
projectPath: string,
33+
scope: CodeWhispererConstants.CodeAnalysisScope
3234
) {
35+
const logger = getLoggerForScope(scope)
3336
const codeScanIssueMap: Map<string, RawCodeScanIssue[]> = new Map()
3437
const aggregatedCodeScanIssueList: AggregatedCodeScanIssue[] = []
3538
const requester = (request: codewhispererClient.ListCodeScanFindingsRequest) => client.listCodeScanFindings(request)
3639
const collection = pageableToCollection(requester, { jobId, codeScanFindingsSchema }, 'nextToken')
3740
const issues = await collection
3841
.flatten()
3942
.map(resp => {
40-
getLogger().verbose(`Request id: ${resp.$response.requestId}`)
43+
logger.verbose(`Request id: ${resp.$response.requestId}`)
4144
if ('codeScanFindings' in resp) {
4245
return resp.codeScanFindings
4346
}
@@ -104,7 +107,8 @@ export async function pollScanJobStatus(
104107
jobId: string,
105108
scope: CodeWhispererConstants.CodeAnalysisScope
106109
) {
107-
getLogger().verbose(`Polling scan job status...`)
110+
const logger = getLoggerForScope(scope)
111+
logger.verbose(`Polling scan job status...`)
108112
let status: string = 'Pending'
109113
let timer: number = 0
110114
while (true) {
@@ -113,11 +117,11 @@ export async function pollScanJobStatus(
113117
jobId: jobId,
114118
}
115119
const resp = await client.getCodeScan(req)
116-
getLogger().verbose(`Request id: ${resp.$response.requestId}`)
120+
logger.verbose(`Request id: ${resp.$response.requestId}`)
117121
if (resp.status !== 'Pending') {
118122
status = resp.status
119-
getLogger().verbose(`Scan job status: ${status}`)
120-
getLogger().verbose(`Complete Polling scan job status.`)
123+
logger.verbose(`Scan job status: ${status}`)
124+
logger.verbose(`Complete Polling scan job status.`)
121125
break
122126
}
123127
throwIfCancelled(scope)
@@ -128,8 +132,8 @@ export async function pollScanJobStatus(
128132
? CodeWhispererConstants.codeFileScanJobTimeoutSeconds
129133
: CodeWhispererConstants.codeScanJobTimeoutSeconds
130134
if (timer > timeoutSeconds) {
131-
getLogger().verbose(`Scan job status: ${status}`)
132-
getLogger().verbose(`Scan job timeout.`)
135+
logger.verbose(`Scan job status: ${status}`)
136+
logger.verbose(`Scan job timeout.`)
133137
throw new Error('Scan job timeout.')
134138
}
135139
}
@@ -143,7 +147,8 @@ export async function createScanJob(
143147
scope: CodeWhispererConstants.CodeAnalysisScope,
144148
scanName: string
145149
) {
146-
getLogger().verbose(`Creating scan job...`)
150+
const logger = getLoggerForScope(scope)
151+
logger.verbose(`Creating scan job...`)
147152
const req: codewhispererClient.CreateCodeScanRequest = {
148153
artifacts: artifactMap,
149154
programmingLanguage: {
@@ -156,7 +161,7 @@ export async function createScanJob(
156161
getLogger().error(`Failed creating scan job. Request id: ${err.requestId}`)
157162
throw err
158163
})
159-
getLogger().verbose(`Request id: ${resp.$response.requestId}`)
164+
logger.verbose(`Request id: ${resp.$response.requestId}`)
160165
TelemetryHelper.instance.sendCodeScanEvent(languageId, resp.$response.requestId)
161166
return resp
162167
}
@@ -167,6 +172,7 @@ export async function getPresignedUrlAndUpload(
167172
scope: CodeWhispererConstants.CodeAnalysisScope,
168173
scanName: string
169174
) {
175+
const logger = getLoggerForScope(scope)
170176
if (zipMetadata.zipFilePath === '') {
171177
throw new Error("Zip failure: can't find valid source zip.")
172178
}
@@ -180,16 +186,16 @@ export async function getPresignedUrlAndUpload(
180186
},
181187
},
182188
}
183-
getLogger().verbose(`Prepare for uploading src context...`)
189+
logger.verbose(`Prepare for uploading src context...`)
184190
const srcResp = await client.createUploadUrl(srcReq).catch(err => {
185191
getLogger().error(`Failed getting presigned url for uploading src context. Request id: ${err.requestId}`)
186192
throw err
187193
})
188-
getLogger().verbose(`Request id: ${srcResp.$response.requestId}`)
189-
getLogger().verbose(`Complete Getting presigned Url for uploading src context.`)
190-
getLogger().verbose(`Uploading src context...`)
191-
await uploadArtifactToS3(zipMetadata.zipFilePath, srcResp)
192-
getLogger().verbose(`Complete uploading src context.`)
194+
logger.verbose(`Request id: ${srcResp.$response.requestId}`)
195+
logger.verbose(`Complete Getting presigned Url for uploading src context.`)
196+
logger.verbose(`Uploading src context...`)
197+
await uploadArtifactToS3(zipMetadata.zipFilePath, srcResp, scope)
198+
logger.verbose(`Complete uploading src context.`)
193199
const artifactMap: ArtifactMap = {
194200
SourceCode: srcResp.uploadId,
195201
}
@@ -226,7 +232,12 @@ export function throwIfCancelled(scope: CodeWhispererConstants.CodeAnalysisScope
226232
}
227233
}
228234

229-
export async function uploadArtifactToS3(fileName: string, resp: CreateUploadUrlResponse) {
235+
export async function uploadArtifactToS3(
236+
fileName: string,
237+
resp: CreateUploadUrlResponse,
238+
scope: CodeWhispererConstants.CodeAnalysisScope
239+
) {
240+
const logger = getLoggerForScope(scope)
230241
const encryptionContext = `{"uploadId":"${resp.uploadId}"}`
231242
const headersObj: Record<string, string> = {
232243
'Content-MD5': getMd5(fileName),
@@ -244,7 +255,7 @@ export async function uploadArtifactToS3(fileName: string, resp: CreateUploadUrl
244255
body: readFileSync(fileName),
245256
headers: resp?.requestHeaders ?? headersObj,
246257
}).response
247-
getLogger().debug(`StatusCode: ${response.status}, Text: ${response.statusText}`)
258+
logger.debug(`StatusCode: ${response.status}, Text: ${response.statusText}`)
248259
} catch (error) {
249260
getLogger().error(
250261
`Amazon Q is unable to upload workspace artifacts to Amazon S3 for security scans. For more information, see the Amazon Q documentation or contact your network or organization administrator.`
@@ -254,3 +265,7 @@ export async function uploadArtifactToS3(fileName: string, resp: CreateUploadUrl
254265
)
255266
}
256267
}
268+
269+
export function getLoggerForScope(scope: CodeWhispererConstants.CodeAnalysisScope) {
270+
return scope === CodeWhispererConstants.CodeAnalysisScope.FILE ? getNullLogger() : getLogger()
271+
}

packages/core/src/codewhisperer/util/zipUtil.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import * as CodeWhispererConstants from '../models/constants'
1111
import { ToolkitError } from '../../shared/errors'
1212
import { fsCommon } from '../../srcShared/fs'
1313
import { collectFiles } from '../../amazonqFeatureDev/util/files'
14+
import { getLoggerForScope } from '../service/securityScanHandler'
1415

1516
export interface ZipMetadata {
1617
rootDir: string
@@ -182,7 +183,7 @@ export class ZipUtil {
182183
throw new ToolkitError(`Unknown code analysis scope: ${scope}`)
183184
}
184185

185-
getLogger().debug(`Picked source files: [${[...this._pickedSourceFiles].join(', ')}]`)
186+
getLoggerForScope(scope).debug(`Picked source files: [${[...this._pickedSourceFiles].join(', ')}]`)
186187
const zipFileSize = (await fsCommon.stat(zipFilePath)).size
187188
return {
188189
rootDir: zipDirPath,
@@ -199,10 +200,11 @@ export class ZipUtil {
199200
}
200201
}
201202

202-
public async removeTmpFiles(zipMetadata: ZipMetadata) {
203-
getLogger().verbose(`Cleaning up temporary files...`)
203+
public async removeTmpFiles(zipMetadata: ZipMetadata, scope: CodeWhispererConstants.CodeAnalysisScope) {
204+
const logger = getLoggerForScope(scope)
205+
logger.verbose(`Cleaning up temporary files...`)
204206
await fsCommon.delete(zipMetadata.zipFilePath)
205207
await fsCommon.delete(zipMetadata.rootDir)
206-
getLogger().verbose(`Complete cleaning up temporary files.`)
208+
logger.verbose(`Complete cleaning up temporary files.`)
207209
}
208210
}

packages/core/src/testE2E/codewhisperer/securityScan.test.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ describe('CodeWhisperer security scan', async function () {
100100
try {
101101
artifactMap = await getPresignedUrlAndUpload(client, zipMetadata, scope, codeScanName)
102102
} finally {
103-
await zipUtil.removeTmpFiles(zipMetadata)
103+
await zipUtil.removeTmpFiles(zipMetadata, scope)
104104
}
105105
return {
106106
artifactMap: artifactMap,
@@ -135,7 +135,8 @@ describe('CodeWhisperer security scan', async function () {
135135
client,
136136
scanJob.jobId,
137137
CodeWhispererConstants.codeScanFindingsSchema,
138-
projectPath
138+
projectPath,
139+
scope
139140
)
140141

141142
assert.deepStrictEqual(jobStatus, 'Completed')
@@ -169,7 +170,8 @@ describe('CodeWhisperer security scan', async function () {
169170
client,
170171
scanJob.jobId,
171172
CodeWhispererConstants.codeScanFindingsSchema,
172-
projectPath
173+
projectPath,
174+
scope
173175
)
174176

175177
assert.deepStrictEqual(jobStatus, 'Completed')

0 commit comments

Comments
 (0)