"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); 0 && (module.exports = { getAllMemoryUsageSpans: null, startPeriodicMemoryUsageTracing: null, stopPeriodicMemoryUsageTracing: null, traceMemoryUsage: null }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { getAllMemoryUsageSpans: function() { return getAllMemoryUsageSpans; }, startPeriodicMemoryUsageTracing: function() { return startPeriodicMemoryUsageTracing; }, stopPeriodicMemoryUsageTracing: function() { return stopPeriodicMemoryUsageTracing; }, traceMemoryUsage: function() { return traceMemoryUsage; } }); const _v8 = /*#__PURE__*/ _interop_require_default(require("v8")); const _log = require("../../build/output/log"); const _trace = require("../../trace"); const _picocolors = require("../picocolors"); const _path = require("path"); const _shared = require("../../trace/shared"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const HEAP_SNAPSHOT_THRESHOLD_PERCENT = 70; let alreadyGeneratedHeapSnapshot = false; const TRACE_MEMORY_USAGE_TIMER_MS = 20000; let traceMemoryUsageTimer; const allMemoryUsage = []; function startPeriodicMemoryUsageTracing() { traceMemoryUsageTimer = setTimeout(()=>{ traceMemoryUsage("periodic memory snapshot"); startPeriodicMemoryUsageTracing(); }, TRACE_MEMORY_USAGE_TIMER_MS); } function stopPeriodicMemoryUsageTracing() { if (traceMemoryUsageTimer) { clearTimeout(traceMemoryUsageTimer); } } function getAllMemoryUsageSpans() { return allMemoryUsage; } function traceMemoryUsage(description, parentSpan) { const memoryUsage = process.memoryUsage(); const v8HeapStatistics = _v8.default.getHeapStatistics(); const heapUsed = v8HeapStatistics.used_heap_size; const heapMax = v8HeapStatistics.heap_size_limit; const tracedMemoryUsage = { "memory.rss": memoryUsage.rss, "memory.heapUsed": heapUsed, "memory.heapTotal": memoryUsage.heapTotal, "memory.heapMax": heapMax }; allMemoryUsage.push(tracedMemoryUsage); const tracedMemoryUsageAsStrings = Object.fromEntries(Object.entries(tracedMemoryUsage).map(([key, value])=>[ key, String(value) ])); if (parentSpan) { parentSpan.traceChild("memory-usage", tracedMemoryUsageAsStrings); } else { (0, _trace.trace)("memory-usage", undefined, tracedMemoryUsageAsStrings); } if (process.env.EXPERIMENTAL_DEBUG_MEMORY_USAGE) { const percentageHeapUsed = 100 * heapUsed / heapMax; (0, _log.info)(""); (0, _log.info)("***************************************"); (0, _log.info)(`Memory usage report at "${description}":`); (0, _log.info)(` - RSS: ${(memoryUsage.rss / 1024 / 1024).toFixed(2)} MB`); (0, _log.info)(` - Heap Used: ${(heapUsed / 1024 / 1024).toFixed(2)} MB`); (0, _log.info)(` - Heap Total Allocated: ${(memoryUsage.heapTotal / 1024 / 1024).toFixed(2)} MB`); (0, _log.info)(` - Heap Max: ${(heapMax / 1024 / 1024).toFixed(2)} MB`); (0, _log.info)(` - Percentage Heap Used: ${percentageHeapUsed.toFixed(2)}%`); (0, _log.info)("***************************************"); (0, _log.info)(""); if (percentageHeapUsed > HEAP_SNAPSHOT_THRESHOLD_PERCENT) { const distDir = _shared.traceGlobals.get("distDir"); const heapFilename = (0, _path.join)(distDir, `${description.replace(" ", "-")}.heapsnapshot`); (0, _log.warn)((0, _picocolors.bold)(`Heap usage is close to the limit. ${percentageHeapUsed.toFixed(2)}% of heap has been used.`)); if (!alreadyGeneratedHeapSnapshot) { (0, _log.warn)((0, _picocolors.bold)(`Saving heap snapshot to ${heapFilename}. ${(0, _picocolors.italic)("Note: this will take some time.")}`)); _v8.default.writeHeapSnapshot(heapFilename); alreadyGeneratedHeapSnapshot = true; } else { (0, _log.warn)("Skipping heap snapshot generation since heap snapshot has already been generated."); } } } } //# sourceMappingURL=trace.js.map