Record PerformanceEntry
objects from Node.js and the Web in the Trace Event Format, so that it can be visualized on https://ui.perfetto.dev like this!
The code for this example is available here.
The code for this example is available here.
Check out the blog !
To install via NPM, run:
npm i perftrace
Alternatively, you can use it in vanilla JS, without any bundler, by using a CDN or static hosting. For example, using ES Modules, you can import the library with:
<script type="module">
import { TraceEvents } from "https://cdn.jsdelivr.net/npm/perftrace/index.mjs";
</script>
![usage-demo](https://private-user-images.githubusercontent.com/42526976/367749037-369d85a2-b018-44f8-88b9-ad98ec4adcda.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk5Nzg5NTUsIm5iZiI6MTczOTk3ODY1NSwicGF0aCI6Ii80MjUyNjk3Ni8zNjc3NDkwMzctMzY5ZDg1YTItYjAxOC00NGY4LTg4YjktYWQ5OGVjNGFkY2RhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE5VDE1MjQxNVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTdhNzZhM2QzZGVhMjhjNGNlYmYxZmJjODZkYzEyZTAxYzZiNTU4YTQ2MzJjZTJhOWU4N2FhNzk4Nzk1NDliM2ImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.d4HK5SaDzNiaYAzDtNpABSOKY9wXtm12UZFZ8jzSboA)
const { TraceEvents, trackRequires } = require('perftrace');
const { writeFileSync } = require('fs');
const traceEvents = new TraceEvents();
// Writes the performance traces in the "events.json" file during process exit.
process.on("beforeExit", () => {
const events = traceEvents.getEvents();
traceEvents.destroy();
writeFileSync("events.json", JSON.stringify(events));
});
// Enables tracking require() calls.
trackRequires(true, { trackSource: true });
// The assert module takes milliseconds to load, so it would be distinctly
// visible in the performance trace.
const assert = require('assert');
const { performance } = require("node:perf_hooks");
// This is tracing an async setTimeout event which is interlaced with
// repeating setInterval events.
performance.mark("Timeout mark"); // marks the beginning of the timeout trace
setTimeout(() => {
performance.measure("Timeout", "Timeout mark"); // marks the ending of the timeout trace
}, 20);
let id = 0;
performance.mark(`Interval mark ${id}`); // marks the beginning of the first interval trace
setInterval(function () {
performance.measure(`Interval ${id}`, `Interval mark ${id}`); // marks the ending of the current interval trace
++id;
// The intervals should go up to 3 counts only.
if (id === 3) {
this.close();
}
performance.mark(`Interval mark ${id}`); // marks the beginning of the next interval trace
}, 5);
After running this script with node filename.js
, open the generated events.json
file on https://ui.perfetto.dev.
Check out the API documentation and the code examples for details.
This project is available under the MIT license. See LICENSE for the full license text.