UNPKG

@oaklean/profiler

Version:

A library to measure the energy consumption of your javascript/typescript code

101 lines 7.6 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TraceEventHelper = void 0; const profiler_core_1 = require("@oaklean/profiler-core"); class TraceEventHelper { /** * Starts a trace event session to capture V8 trace events. */ static startTraceEventSession() { return __awaiter(this, void 0, void 0, function* () { if (TraceEventHelper._started) { throw new Error('Trace event session already started'); } TraceEventHelper._started = true; TraceEventHelper._profilerStartTime = undefined; yield TraceEventHelper.post('NodeTracing.start', { traceConfig: { includedCategories: ['v8'] // config to capture v8's trace events } }); }); } // eslint-disable-next-line @typescript-eslint/no-explicit-any static post(message, data) { return new Promise((resolve, reject) => { profiler_core_1.InspectorSessionHelper.session.post(message, data, (err, result) => { if (err) { reject(new Error(JSON.stringify(err))); } else { resolve(result); } }); }); } /** * Handles the 'dataCollected' event from the NodeTracing domain. * @param chunk - The data chunk containing trace event information. */ static onDataCollected(chunk) { for (const event of chunk.params.value) { if (event.pid === process.pid && event.cat === 'v8') { if (event.name === 'CpuProfiler::StartProfiling') { // captured start event of cpu profiler TraceEventHelper._profilerStartTime = event.ts; // store high resolution begin time } } } } /** * Starts capturing trace events related to CPU profiling. */ static startCapturingProfilerTracingEvents() { return __awaiter(this, void 0, void 0, function* () { profiler_core_1.InspectorSessionHelper.session.on('NodeTracing.dataCollected', TraceEventHelper.onDataCollected); yield TraceEventHelper.startTraceEventSession(); // start trace event capturing }); } /** * Stops capturing trace events related to CPU profiling. */ static stopTraceEventSession() { return __awaiter(this, void 0, void 0, function* () { TraceEventHelper._started = false; yield TraceEventHelper.post('NodeTracing.stop', undefined); profiler_core_1.InspectorSessionHelper.session.removeListener('NodeTracing.dataCollected', TraceEventHelper.onDataCollected); }); } /** * Retrieves the high-resolution timestamp when CPU profiling began. * @returns The high-resolution timestamp in microseconds. * @throws Error if the start time could not be captured after multiple attempts. */ static getCPUProfilerBeginTime() { return __awaiter(this, void 0, void 0, function* () { let tries = 0; while (TraceEventHelper._profilerStartTime === undefined && tries < 10) { profiler_core_1.LoggerHelper.error(`Cannot capture profiler start time on try: ${tries + 1}, try again after 1 second`); tries += 1; yield profiler_core_1.TimeHelper.sleep(1000); } if (TraceEventHelper._profilerStartTime === undefined) { throw new Error(`Could not capture cpu profilers begin time after ${tries} tries, measurements failed`); } return TraceEventHelper._profilerStartTime; }); } } exports.TraceEventHelper = TraceEventHelper; TraceEventHelper._started = false; TraceEventHelper._profilerStartTime = undefined; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhY2VFdmVudEhlbHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oZWxwZXIvVHJhY2VFdmVudEhlbHBlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFFQSwwREFLK0I7QUFjL0IsTUFBYSxnQkFBZ0I7SUFJNUI7O09BRUc7SUFDSyxNQUFNLENBQU8sc0JBQXNCOztZQUMxQyxJQUFJLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUMvQixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUE7WUFDdkQsQ0FBQztZQUNELGdCQUFnQixDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7WUFDaEMsZ0JBQWdCLENBQUMsa0JBQWtCLEdBQUcsU0FBUyxDQUFBO1lBQy9DLE1BQU0sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUNoRCxXQUFXLEVBQUU7b0JBQ1osa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxzQ0FBc0M7aUJBQ2pFO2FBQ0QsQ0FBQyxDQUFBO1FBQ0gsQ0FBQztLQUFBO0lBRUQsOERBQThEO0lBQ3RELE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBWSxFQUFFLElBQVM7UUFDMUMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUN0QyxzQ0FBc0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ2xFLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ1QsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUN2QyxDQUFDO3FCQUFNLENBQUM7b0JBQ1AsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUNoQixDQUFDO1lBQ0YsQ0FBQyxDQUFDLENBQUE7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDSyxNQUFNLENBQUMsZUFBZSxDQUM3QixLQUF3RjtRQUV4RixLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBMkIsRUFBRSxDQUFDO1lBQzlELElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxPQUFPLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3JELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyw2QkFBNkIsRUFBRSxDQUFDO29CQUNsRCx1Q0FBdUM7b0JBQ3ZDLGdCQUFnQixDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxFQUF5QixDQUFBLENBQUMsbUNBQW1DO2dCQUMxRyxDQUFDO1lBQ0YsQ0FBQztRQUNGLENBQUM7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQU8sbUNBQW1DOztZQUMvQyxzQ0FBc0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUNoQywyQkFBMkIsRUFDM0IsZ0JBQWdCLENBQUMsZUFBZSxDQUNoQyxDQUFBO1lBQ0QsTUFBTSxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRSxDQUFBLENBQUMsOEJBQThCO1FBQy9FLENBQUM7S0FBQTtJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFPLHFCQUFxQjs7WUFDakMsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQTtZQUNqQyxNQUFNLGdCQUFnQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxTQUFTLENBQUMsQ0FBQTtZQUMxRCxzQ0FBc0IsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUM1QywyQkFBMkIsRUFDM0IsZ0JBQWdCLENBQUMsZUFBZSxDQUNoQyxDQUFBO1FBQ0YsQ0FBQztLQUFBO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBTyx1QkFBdUI7O1lBQ25DLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQTtZQUNiLE9BQU8sZ0JBQWdCLENBQUMsa0JBQWtCLEtBQUssU0FBUyxJQUFJLEtBQUssR0FBRyxFQUFFLEVBQUUsQ0FBQztnQkFDeEUsNEJBQVksQ0FBQyxLQUFLLENBQ2pCLDhDQUE4QyxLQUFLLEdBQUcsQ0FBQyw0QkFBNEIsQ0FDbkYsQ0FBQTtnQkFDRCxLQUFLLElBQUksQ0FBQyxDQUFBO2dCQUNWLE1BQU0sMEJBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDN0IsQ0FBQztZQUNELElBQUksZ0JBQWdCLENBQUMsa0JBQWtCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ3ZELE1BQU0sSUFBSSxLQUFLLENBQ2Qsb0RBQW9ELEtBQUssNkJBQTZCLENBQ3RGLENBQUE7WUFDRixDQUFDO1lBQ0QsT0FBTyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQTtRQUMzQyxDQUFDO0tBQUE7O0FBN0ZGLDRDQThGQztBQTdGZSx5QkFBUSxHQUFHLEtBQUssQ0FBQTtBQUNoQixtQ0FBa0IsR0FBb0MsU0FBUyxDQUFBIn0=