Address review comments from @henrymercer

This commit is contained in:
Edoardo Pirovano 2022-08-16 13:30:49 +01:00
parent 4139682b64
commit b29194f0ac
No known key found for this signature in database
GPG key ID: 047556B5D93FFE28
12 changed files with 95 additions and 58 deletions

34
lib/analyze-action.js generated
View file

@ -35,7 +35,7 @@ const upload_lib = __importStar(require("./upload-lib"));
const util = __importStar(require("./util")); const util = __importStar(require("./util"));
// eslint-disable-next-line import/no-commonjs // eslint-disable-next-line import/no-commonjs
const pkg = require("../package.json"); const pkg = require("../package.json");
async function sendStatusReport(startedAt, config, stats, error, trapCacheUploadTime, didUploadTrapCaches) { async function sendStatusReport(startedAt, config, stats, error, trapCacheUploadTime, didUploadTrapCaches, logger) {
const status = actionsUtil.getActionsStatus(error, stats === null || stats === void 0 ? void 0 : stats.analyze_failure_language); const status = actionsUtil.getActionsStatus(error, stats === null || stats === void 0 ? void 0 : stats.analyze_failure_language);
const statusReportBase = await actionsUtil.createStatusReportBase("finish", status, startedAt, error === null || error === void 0 ? void 0 : error.message, error === null || error === void 0 ? void 0 : error.stack); const statusReportBase = await actionsUtil.createStatusReportBase("finish", status, startedAt, error === null || error === void 0 ? void 0 : error.message, error === null || error === void 0 ? void 0 : error.stack);
const statusReport = { const statusReport = {
@ -46,12 +46,18 @@ async function sendStatusReport(startedAt, config, stats, error, trapCacheUpload
} }
: {}), : {}),
...(stats || {}), ...(stats || {}),
trap_cache_upload_duration_ms: trapCacheUploadTime || 0,
trap_cache_upload_size_bytes: config && didUploadTrapCaches
? await (0, trap_caching_1.getTotalCacheSize)(config.trapCaches)
: 0,
}; };
await actionsUtil.sendStatusReport(statusReport); if (config && didUploadTrapCaches) {
const trapCacheUploadStatusReport = {
...statusReport,
trap_cache_upload_duration_ms: trapCacheUploadTime || 0,
trap_cache_upload_size_bytes: await (0, trap_caching_1.getTotalCacheSize)(config.trapCaches, logger),
};
await actionsUtil.sendStatusReport(trapCacheUploadStatusReport);
}
else {
await actionsUtil.sendStatusReport(statusReport);
}
} }
exports.sendStatusReport = sendStatusReport; exports.sendStatusReport = sendStatusReport;
async function run() { async function run() {
@ -63,11 +69,11 @@ async function run() {
let didUploadTrapCaches = false; let didUploadTrapCaches = false;
util.initializeEnvironment(util.Mode.actions, pkg.version); util.initializeEnvironment(util.Mode.actions, pkg.version);
await util.checkActionVersion(pkg.version); await util.checkActionVersion(pkg.version);
const logger = (0, logging_1.getActionsLogger)();
try { try {
if (!(await actionsUtil.sendStatusReport(await actionsUtil.createStatusReportBase("finish", "starting", startedAt)))) { if (!(await actionsUtil.sendStatusReport(await actionsUtil.createStatusReportBase("finish", "starting", startedAt)))) {
return; return;
} }
const logger = (0, logging_1.getActionsLogger)();
config = await (0, config_utils_1.getConfig)(actionsUtil.getTemporaryDirectory(), logger); config = await (0, config_utils_1.getConfig)(actionsUtil.getTemporaryDirectory(), logger);
if (config === undefined) { if (config === undefined) {
throw new Error("Config file could not be found at expected location. Has the 'init' action been called?"); throw new Error("Config file could not be found at expected location. Has the 'init' action been called?");
@ -106,9 +112,9 @@ async function run() {
// Possibly upload the database bundles for remote queries // Possibly upload the database bundles for remote queries
await (0, database_upload_1.uploadDatabases)(repositoryNwo, config, apiDetails, logger); await (0, database_upload_1.uploadDatabases)(repositoryNwo, config, apiDetails, logger);
// Possibly upload the TRAP caches for later re-use // Possibly upload the TRAP caches for later re-use
const trapCacheUploadStartTime = Date.now(); const trapCacheUploadStartTime = performance.now();
const codeql = await (0, codeql_1.getCodeQL)(config.codeQLCmd); const codeql = await (0, codeql_1.getCodeQL)(config.codeQLCmd);
trapCacheUploadTime = Date.now() - trapCacheUploadStartTime; trapCacheUploadTime = performance.now() - trapCacheUploadStartTime;
didUploadTrapCaches = await (0, trap_caching_1.uploadTrapCaches)(codeql, config, logger); didUploadTrapCaches = await (0, trap_caching_1.uploadTrapCaches)(codeql, config, logger);
// We don't upload results in test mode, so don't wait for processing // We don't upload results in test mode, so don't wait for processing
if (util.isInTestMode()) { if (util.isInTestMode()) {
@ -125,10 +131,10 @@ async function run() {
console.log(error); console.log(error);
if (error instanceof analyze_1.CodeQLAnalysisError) { if (error instanceof analyze_1.CodeQLAnalysisError) {
const stats = { ...error.queriesStatusReport }; const stats = { ...error.queriesStatusReport };
await sendStatusReport(startedAt, config, stats, error, trapCacheUploadTime, didUploadTrapCaches); await sendStatusReport(startedAt, config, stats, error, trapCacheUploadTime, didUploadTrapCaches, logger);
} }
else { else {
await sendStatusReport(startedAt, config, undefined, error, trapCacheUploadTime, didUploadTrapCaches); await sendStatusReport(startedAt, config, undefined, error, trapCacheUploadTime, didUploadTrapCaches, logger);
} }
return; return;
} }
@ -136,13 +142,13 @@ async function run() {
await sendStatusReport(startedAt, config, { await sendStatusReport(startedAt, config, {
...runStats, ...runStats,
...uploadResult.statusReport, ...uploadResult.statusReport,
}, undefined, trapCacheUploadTime, didUploadTrapCaches); }, undefined, trapCacheUploadTime, didUploadTrapCaches, logger);
} }
else if (runStats) { else if (runStats) {
await sendStatusReport(startedAt, config, { ...runStats }, undefined, trapCacheUploadTime, didUploadTrapCaches); await sendStatusReport(startedAt, config, { ...runStats }, undefined, trapCacheUploadTime, didUploadTrapCaches, logger);
} }
else { else {
await sendStatusReport(startedAt, config, undefined, undefined, trapCacheUploadTime, didUploadTrapCaches); await sendStatusReport(startedAt, config, undefined, undefined, trapCacheUploadTime, didUploadTrapCaches, logger);
} }
} }
exports.runPromise = run(); exports.runPromise = run();

File diff suppressed because one or more lines are too long

4
lib/config-utils.js generated
View file

@ -517,9 +517,9 @@ async function downloadCacheWithTime(trapCachingEnabled, codeQL, languages, logg
let trapCaches = {}; let trapCaches = {};
let trapCacheDownloadTime = 0; let trapCacheDownloadTime = 0;
if (trapCachingEnabled) { if (trapCachingEnabled) {
const start = Date.now(); const start = performance.now();
trapCaches = await (0, trap_caching_1.downloadTrapCaches)(codeQL, languages, logger); trapCaches = await (0, trap_caching_1.downloadTrapCaches)(codeQL, languages, logger);
trapCacheDownloadTime = Date.now() - start; trapCacheDownloadTime = performance.now() - start;
} }
return { trapCaches, trapCacheDownloadTime }; return { trapCaches, trapCacheDownloadTime };
} }

File diff suppressed because one or more lines are too long

6
lib/init-action.js generated
View file

@ -33,7 +33,7 @@ const trap_caching_1 = require("./trap-caching");
const util_1 = require("./util"); const util_1 = require("./util");
// eslint-disable-next-line import/no-commonjs // eslint-disable-next-line import/no-commonjs
const pkg = require("../package.json"); const pkg = require("../package.json");
async function sendSuccessStatusReport(startedAt, config, toolsVersion) { async function sendSuccessStatusReport(startedAt, config, toolsVersion, logger) {
var _a; var _a;
const statusReportBase = await (0, actions_util_1.createStatusReportBase)("init", "success", startedAt); const statusReportBase = await (0, actions_util_1.createStatusReportBase)("init", "success", startedAt);
const languages = config.languages.join(","); const languages = config.languages.join(",");
@ -66,7 +66,7 @@ async function sendSuccessStatusReport(startedAt, config, toolsVersion) {
tools_resolved_version: toolsVersion, tools_resolved_version: toolsVersion,
workflow_languages: workflowLanguages || "", workflow_languages: workflowLanguages || "",
trap_cache_languages: Object.keys(config.trapCaches).join(","), trap_cache_languages: Object.keys(config.trapCaches).join(","),
trap_cache_download_size_bytes: await (0, trap_caching_1.getTotalCacheSize)(config.trapCaches), trap_cache_download_size_bytes: await (0, trap_caching_1.getTotalCacheSize)(config.trapCaches, logger),
trap_cache_download_duration_ms: config.trapCacheDownloadTime, trap_cache_download_duration_ms: config.trapCacheDownloadTime,
}; };
await (0, actions_util_1.sendStatusReport)(statusReport); await (0, actions_util_1.sendStatusReport)(statusReport);
@ -156,7 +156,7 @@ async function run() {
await (0, actions_util_1.sendStatusReport)(await (0, actions_util_1.createStatusReportBase)("init", (0, actions_util_1.getActionsStatus)(error), startedAt, String(error), error instanceof Error ? error.stack : undefined)); await (0, actions_util_1.sendStatusReport)(await (0, actions_util_1.createStatusReportBase)("init", (0, actions_util_1.getActionsStatus)(error), startedAt, String(error), error instanceof Error ? error.stack : undefined));
return; return;
} }
await sendSuccessStatusReport(startedAt, config, toolsVersion); await sendSuccessStatusReport(startedAt, config, toolsVersion, logger);
} }
async function getTrapCachingEnabled(featureFlags) { async function getTrapCachingEnabled(featureFlags) {
const trapCaching = (0, actions_util_1.getOptionalInput)("trap-caching"); const trapCaching = (0, actions_util_1.getOptionalInput)("trap-caching");

File diff suppressed because one or more lines are too long

11
lib/trap-caching.js generated
View file

@ -159,14 +159,17 @@ async function getLanguagesSupportingCaching(codeql, languages, logger) {
return result; return result;
} }
exports.getLanguagesSupportingCaching = getLanguagesSupportingCaching; exports.getLanguagesSupportingCaching = getLanguagesSupportingCaching;
async function getTotalCacheSize(trapCaches) { async function getTotalCacheSize(trapCaches, logger) {
const sizes = await Promise.all(Object.values(trapCaches).map(async (cacheDir) => { const sizes = await Promise.all(Object.values(trapCaches).map(async (cacheDir) => {
return new Promise((resolve) => { return new Promise((resolve) => {
(0, get_folder_size_1.default)(cacheDir, (err, size) => { (0, get_folder_size_1.default)(cacheDir, (err, size) => {
// Ignore file system errors when getting the size. It's only used for telemetry anyway. if (err) {
if (err) logger.warning(`Error getting size of ${cacheDir}: ${err}`);
resolve(0); resolve(0);
resolve(size); }
else {
resolve(size);
}
}); });
}); });
})); }));

File diff suppressed because one or more lines are too long

View file

@ -13,7 +13,7 @@ import { getCodeQL } from "./codeql";
import { Config, getConfig } from "./config-utils"; import { Config, getConfig } from "./config-utils";
import { uploadDatabases } from "./database-upload"; import { uploadDatabases } from "./database-upload";
import { GitHubFeatureFlags } from "./feature-flags"; import { GitHubFeatureFlags } from "./feature-flags";
import { getActionsLogger } from "./logging"; import { getActionsLogger, Logger } from "./logging";
import { parseRepositoryNwo } from "./repository"; import { parseRepositoryNwo } from "./repository";
import { getTotalCacheSize, uploadTrapCaches } from "./trap-caching"; import { getTotalCacheSize, uploadTrapCaches } from "./trap-caching";
import * as upload_lib from "./upload-lib"; import * as upload_lib from "./upload-lib";
@ -29,8 +29,12 @@ interface AnalysisStatusReport
interface FinishStatusReport interface FinishStatusReport
extends actionsUtil.StatusReportBase, extends actionsUtil.StatusReportBase,
AnalysisStatusReport { AnalysisStatusReport {}
interface FinishWithTrapUploadStatusReport extends FinishStatusReport {
/** Size of TRAP caches that we uploaded, in bytes. */
trap_cache_upload_size_bytes: number; trap_cache_upload_size_bytes: number;
/** Time taken to upload TRAP caches, in milliseconds. */
trap_cache_upload_duration_ms: number; trap_cache_upload_duration_ms: number;
} }
@ -38,9 +42,10 @@ export async function sendStatusReport(
startedAt: Date, startedAt: Date,
config: Config | undefined, config: Config | undefined,
stats: AnalysisStatusReport | undefined, stats: AnalysisStatusReport | undefined,
error?: Error, error: Error | undefined,
trapCacheUploadTime?: number, trapCacheUploadTime: number | undefined,
didUploadTrapCaches?: boolean didUploadTrapCaches: boolean,
logger: Logger
) { ) {
const status = actionsUtil.getActionsStatus( const status = actionsUtil.getActionsStatus(
error, error,
@ -62,13 +67,20 @@ export async function sendStatusReport(
} }
: {}), : {}),
...(stats || {}), ...(stats || {}),
trap_cache_upload_duration_ms: trapCacheUploadTime || 0,
trap_cache_upload_size_bytes:
config && didUploadTrapCaches
? await getTotalCacheSize(config.trapCaches)
: 0,
}; };
await actionsUtil.sendStatusReport(statusReport); if (config && didUploadTrapCaches) {
const trapCacheUploadStatusReport: FinishWithTrapUploadStatusReport = {
...statusReport,
trap_cache_upload_duration_ms: trapCacheUploadTime || 0,
trap_cache_upload_size_bytes: await getTotalCacheSize(
config.trapCaches,
logger
),
};
await actionsUtil.sendStatusReport(trapCacheUploadStatusReport);
} else {
await actionsUtil.sendStatusReport(statusReport);
}
} }
async function run() { async function run() {
@ -81,6 +93,7 @@ async function run() {
util.initializeEnvironment(util.Mode.actions, pkg.version); util.initializeEnvironment(util.Mode.actions, pkg.version);
await util.checkActionVersion(pkg.version); await util.checkActionVersion(pkg.version);
const logger = getActionsLogger();
try { try {
if ( if (
!(await actionsUtil.sendStatusReport( !(await actionsUtil.sendStatusReport(
@ -93,7 +106,6 @@ async function run() {
) { ) {
return; return;
} }
const logger = getActionsLogger();
config = await getConfig(actionsUtil.getTemporaryDirectory(), logger); config = await getConfig(actionsUtil.getTemporaryDirectory(), logger);
if (config === undefined) { if (config === undefined) {
throw new Error( throw new Error(
@ -175,9 +187,9 @@ async function run() {
await uploadDatabases(repositoryNwo, config, apiDetails, logger); await uploadDatabases(repositoryNwo, config, apiDetails, logger);
// Possibly upload the TRAP caches for later re-use // Possibly upload the TRAP caches for later re-use
const trapCacheUploadStartTime = Date.now(); const trapCacheUploadStartTime = performance.now();
const codeql = await getCodeQL(config.codeQLCmd); const codeql = await getCodeQL(config.codeQLCmd);
trapCacheUploadTime = Date.now() - trapCacheUploadStartTime; trapCacheUploadTime = performance.now() - trapCacheUploadStartTime;
didUploadTrapCaches = await uploadTrapCaches(codeql, config, logger); didUploadTrapCaches = await uploadTrapCaches(codeql, config, logger);
// We don't upload results in test mode, so don't wait for processing // We don't upload results in test mode, so don't wait for processing
@ -208,7 +220,8 @@ async function run() {
stats, stats,
error, error,
trapCacheUploadTime, trapCacheUploadTime,
didUploadTrapCaches didUploadTrapCaches,
logger
); );
} else { } else {
await sendStatusReport( await sendStatusReport(
@ -217,7 +230,8 @@ async function run() {
undefined, undefined,
error, error,
trapCacheUploadTime, trapCacheUploadTime,
didUploadTrapCaches didUploadTrapCaches,
logger
); );
} }
@ -234,7 +248,8 @@ async function run() {
}, },
undefined, undefined,
trapCacheUploadTime, trapCacheUploadTime,
didUploadTrapCaches didUploadTrapCaches,
logger
); );
} else if (runStats) { } else if (runStats) {
await sendStatusReport( await sendStatusReport(
@ -243,7 +258,8 @@ async function run() {
{ ...runStats }, { ...runStats },
undefined, undefined,
trapCacheUploadTime, trapCacheUploadTime,
didUploadTrapCaches didUploadTrapCaches,
logger
); );
} else { } else {
await sendStatusReport( await sendStatusReport(
@ -252,7 +268,8 @@ async function run() {
undefined, undefined,
undefined, undefined,
trapCacheUploadTime, trapCacheUploadTime,
didUploadTrapCaches didUploadTrapCaches,
logger
); );
} }
} }

View file

@ -1052,13 +1052,16 @@ async function downloadCacheWithTime(
codeQL: CodeQL, codeQL: CodeQL,
languages: Language[], languages: Language[],
logger: Logger logger: Logger
) { ): Promise<{
trapCaches: Partial<Record<Language, string>>;
trapCacheDownloadTime: number;
}> {
let trapCaches = {}; let trapCaches = {};
let trapCacheDownloadTime = 0; let trapCacheDownloadTime = 0;
if (trapCachingEnabled) { if (trapCachingEnabled) {
const start = Date.now(); const start = performance.now();
trapCaches = await downloadTrapCaches(codeQL, languages, logger); trapCaches = await downloadTrapCaches(codeQL, languages, logger);
trapCacheDownloadTime = Date.now() - start; trapCacheDownloadTime = performance.now() - start;
} }
return { trapCaches, trapCacheDownloadTime }; return { trapCaches, trapCacheDownloadTime };
} }

View file

@ -24,7 +24,7 @@ import {
runInit, runInit,
} from "./init"; } from "./init";
import { Language } from "./languages"; import { Language } from "./languages";
import { getActionsLogger } from "./logging"; import { getActionsLogger, Logger } from "./logging";
import { parseRepositoryNwo } from "./repository"; import { parseRepositoryNwo } from "./repository";
import { getTotalCacheSize } from "./trap-caching"; import { getTotalCacheSize } from "./trap-caching";
import { import {
@ -68,7 +68,7 @@ interface InitSuccessStatusReport extends StatusReportBase {
workflow_languages: string; workflow_languages: string;
/** Comma-separated list of languages for which we are using TRAP caching. */ /** Comma-separated list of languages for which we are using TRAP caching. */
trap_cache_languages: string; trap_cache_languages: string;
/** Size of TRAP caches that we downloaded, in megabytes. */ /** Size of TRAP caches that we downloaded, in bytes. */
trap_cache_download_size_bytes: number; trap_cache_download_size_bytes: number;
/** Time taken to download TRAP caches, in milliseconds. */ /** Time taken to download TRAP caches, in milliseconds. */
trap_cache_download_duration_ms: number; trap_cache_download_duration_ms: number;
@ -77,7 +77,8 @@ interface InitSuccessStatusReport extends StatusReportBase {
async function sendSuccessStatusReport( async function sendSuccessStatusReport(
startedAt: Date, startedAt: Date,
config: configUtils.Config, config: configUtils.Config,
toolsVersion: string toolsVersion: string,
logger: Logger
) { ) {
const statusReportBase = await createStatusReportBase( const statusReportBase = await createStatusReportBase(
"init", "init",
@ -123,7 +124,10 @@ async function sendSuccessStatusReport(
tools_resolved_version: toolsVersion, tools_resolved_version: toolsVersion,
workflow_languages: workflowLanguages || "", workflow_languages: workflowLanguages || "",
trap_cache_languages: Object.keys(config.trapCaches).join(","), trap_cache_languages: Object.keys(config.trapCaches).join(","),
trap_cache_download_size_bytes: await getTotalCacheSize(config.trapCaches), trap_cache_download_size_bytes: await getTotalCacheSize(
config.trapCaches,
logger
),
trap_cache_download_duration_ms: config.trapCacheDownloadTime, trap_cache_download_duration_ms: config.trapCacheDownloadTime,
}; };
@ -308,7 +312,7 @@ async function run() {
); );
return; return;
} }
await sendSuccessStatusReport(startedAt, config, toolsVersion); await sendSuccessStatusReport(startedAt, config, toolsVersion, logger);
} }
async function getTrapCachingEnabled( async function getTrapCachingEnabled(

View file

@ -185,15 +185,19 @@ export async function getLanguagesSupportingCaching(
} }
export async function getTotalCacheSize( export async function getTotalCacheSize(
trapCaches: Partial<Record<Language, string>> trapCaches: Partial<Record<Language, string>>,
logger: Logger
): Promise<number> { ): Promise<number> {
const sizes = await Promise.all( const sizes = await Promise.all(
Object.values(trapCaches).map(async (cacheDir) => { Object.values(trapCaches).map(async (cacheDir) => {
return new Promise<number>((resolve) => { return new Promise<number>((resolve) => {
getFolderSize(cacheDir, (err, size) => { getFolderSize(cacheDir, (err, size) => {
// Ignore file system errors when getting the size. It's only used for telemetry anyway. if (err) {
if (err) resolve(0); logger.warning(`Error getting size of ${cacheDir}: ${err}`);
resolve(size); resolve(0);
} else {
resolve(size);
}
}); });
}); });
}) })