@oaklean/profiler
Version:
A library to measure the energy consumption of your javascript/typescript code
101 lines • 7.6 kB
JavaScript
;
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=