package.dist.src.config.middleware.experimental-garbage-collection-middleware.js Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of sdk Show documentation
Show all versions of sdk Show documentation
Client SDK for Momento services
The newest version!
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ExperimentalGarbageCollectionPerformanceMetricsMiddleware = void 0;
const perf_hooks_1 = require("perf_hooks");
class ExperimentalGarbageCollectionPerformanceMetricsMiddlewareRequestHandler {
onRequestBody(request) {
return Promise.resolve(request);
}
onRequestMetadata(metadata) {
return Promise.resolve(metadata);
}
onResponseMetadata(metadata) {
return Promise.resolve(metadata);
}
onResponseBody(response) {
return Promise.resolve(response);
}
onResponseStatus(status) {
return Promise.resolve(status);
}
}
/**
* This middleware enables garbage collection metrics. It subscribers to a GC performance observer provided by
* node's built-in performance hooks, and logs key GC events. A sample log looks like:
*
* {
* "entryType": "gc",
* "startTime": 8221.879917,
* "duration": 2.8905000016093254, <-- most important field to analyze for stop the world events, measured in milliseconds.
* "detail": {
* "kind": 4, <-- constant for NODE_PERFORMANCE_GC_MAJOR. `MAJOR` events might point to GC events causing long delays.
* "flags": 32
* },
* "timestamp": 1710300309368
* }
*/
class ExperimentalGarbageCollectionPerformanceMetricsMiddleware {
constructor(loggerFactory) {
this.logger = loggerFactory.getLogger(this);
this.gcObserver = new perf_hooks_1.PerformanceObserver(items => {
items
.getEntries()
.filter(
// NODE_PERFORMANCE_GC_MAJOR indicates a major GC event such as STW (stop-the-world) pauses
// and other long delays. This filter is to control the volume of GC logs if we were to enable
// this on a customer's client.
// NODE_PERFORMANCE_GC_INCREMENTAL prints incremental GC stream of logs when the process is approaching
// max memory.
item => {
if (item.entryType !== 'gc') {
return false;
}
const gcPerfDetail = item.detail;
return (gcPerfDetail.kind === perf_hooks_1.constants.NODE_PERFORMANCE_GC_MAJOR ||
gcPerfDetail.kind === perf_hooks_1.constants.NODE_PERFORMANCE_GC_INCREMENTAL);
})
.forEach(item => {
const gcPerfDetail = item.detail;
const gcEventObject = {
entryType: item.entryType,
startTime: item.startTime,
duration: item.duration,
kind: gcPerfDetail.kind,
flags: gcPerfDetail.flags,
timestamp: Date.now(),
};
this.logger.info(JSON.stringify(gcEventObject));
});
});
this.gcObserver.observe({ entryTypes: ['gc'] });
}
onNewRequest() {
return new ExperimentalGarbageCollectionPerformanceMetricsMiddlewareRequestHandler();
}
close() {
this.gcObserver.disconnect();
}
}
exports.ExperimentalGarbageCollectionPerformanceMetricsMiddleware = ExperimentalGarbageCollectionPerformanceMetricsMiddleware;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwZXJpbWVudGFsLWdhcmJhZ2UtY29sbGVjdGlvbi1taWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbmZpZy9taWRkbGV3YXJlL2V4cGVyaW1lbnRhbC1nYXJiYWdlLWNvbGxlY3Rpb24tbWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSwyQ0FBMEQ7QUFJMUQsTUFBTSx1RUFBdUU7SUFHM0UsYUFBYSxDQUFDLE9BQTBCO1FBQ3RDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsaUJBQWlCLENBQUMsUUFBNEI7UUFDNUMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxrQkFBa0IsQ0FDaEIsUUFBNEI7UUFFNUIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxjQUFjLENBQ1osUUFBa0M7UUFFbEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxNQUF3QjtRQUN2QyxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFhLHlEQUF5RDtJQU1wRSxZQUFZLGFBQW1DO1FBQzdDLElBQUksQ0FBQyxNQUFNLEdBQUcsYUFBYSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU1QyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksZ0NBQW1CLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDaEQsS0FBSztpQkFDRixVQUFVLEVBQUU7aUJBQ1osTUFBTTtZQUNMLDJGQUEyRjtZQUMzRiw4RkFBOEY7WUFDOUYsK0JBQStCO1lBQy9CLHVHQUF1RztZQUN2RyxjQUFjO1lBQ2QsSUFBSSxDQUFDLEVBQUU7Z0JBQ0wsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksRUFBRTtvQkFDM0IsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQWlDLENBQUM7Z0JBQzVELE9BQU8sQ0FDTCxZQUFZLENBQUMsSUFBSSxLQUFLLHNCQUFTLENBQUMseUJBQXlCO29CQUN6RCxZQUFZLENBQUMsSUFBSSxLQUFLLHNCQUFTLENBQUMsK0JBQStCLENBQ2hFLENBQUM7WUFDSixDQUFDLENBQ0Y7aUJBQ0EsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNkLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFpQyxDQUFDO2dCQUM1RCxNQUFNLGFBQWEsR0FBRztvQkFDcEIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUN6QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7b0JBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO29CQUN2QixLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUs7b0JBQ3pCLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO2lCQUN0QixDQUFDO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNsRCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELFlBQVk7UUFDVixPQUFPLElBQUksdUVBQXVFLEVBQUUsQ0FBQztJQUN2RixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDL0IsQ0FBQztDQUNGO0FBcERELDhIQW9EQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIE1pZGRsZXdhcmUsXG4gIE1pZGRsZXdhcmVNZXNzYWdlLFxuICBNaWRkbGV3YXJlTWV0YWRhdGEsXG4gIE1pZGRsZXdhcmVSZXF1ZXN0SGFuZGxlcixcbiAgTWlkZGxld2FyZVN0YXR1cyxcbn0gZnJvbSAnLi9taWRkbGV3YXJlJztcbmltcG9ydCB7Y29uc3RhbnRzLCBQZXJmb3JtYW5jZU9ic2VydmVyfSBmcm9tICdwZXJmX2hvb2tzJztcbmltcG9ydCB7TW9tZW50b0xvZ2dlciwgTW9tZW50b0xvZ2dlckZhY3Rvcnl9IGZyb20gJ0Bnb21vbWVudG8vc2RrLWNvcmUnO1xuaW1wb3J0IHtOb2RlR0NQZXJmb3JtYW5jZURldGFpbH0gZnJvbSAnbm9kZTpwZXJmX2hvb2tzJztcblxuY2xhc3MgRXhwZXJpbWVudGFsR2FyYmFnZUNvbGxlY3Rpb25QZXJmb3JtYW5jZU1ldHJpY3NNaWRkbGV3YXJlUmVxdWVzdEhhbmRsZXJcbiAgaW1wbGVtZW50cyBNaWRkbGV3YXJlUmVxdWVzdEhhbmRsZXJcbntcbiAgb25SZXF1ZXN0Qm9keShyZXF1ZXN0OiBNaWRkbGV3YXJlTWVzc2FnZSk6IFByb21pc2U8TWlkZGxld2FyZU1lc3NhZ2U+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlcXVlc3QpO1xuICB9XG5cbiAgb25SZXF1ZXN0TWV0YWRhdGEobWV0YWRhdGE6IE1pZGRsZXdhcmVNZXRhZGF0YSk6IFByb21pc2U8TWlkZGxld2FyZU1ldGFkYXRhPiB7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtZXRhZGF0YSk7XG4gIH1cblxuICBvblJlc3BvbnNlTWV0YWRhdGEoXG4gICAgbWV0YWRhdGE6IE1pZGRsZXdhcmVNZXRhZGF0YVxuICApOiBQcm9taXNlPE1pZGRsZXdhcmVNZXRhZGF0YT4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobWV0YWRhdGEpO1xuICB9XG5cbiAgb25SZXNwb25zZUJvZHkoXG4gICAgcmVzcG9uc2U6IE1pZGRsZXdhcmVNZXNzYWdlIHwgbnVsbFxuICApOiBQcm9taXNlPE1pZGRsZXdhcmVNZXNzYWdlIHwgbnVsbD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmVzcG9uc2UpO1xuICB9XG5cbiAgb25SZXNwb25zZVN0YXR1cyhzdGF0dXM6IE1pZGRsZXdhcmVTdGF0dXMpOiBQcm9taXNlPE1pZGRsZXdhcmVTdGF0dXM+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0YXR1cyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGlzIG1pZGRsZXdhcmUgZW5hYmxlcyBnYXJiYWdlIGNvbGxlY3Rpb24gbWV0cmljcy4gSXQgc3Vic2NyaWJlcnMgdG8gYSBHQyBwZXJmb3JtYW5jZSBvYnNlcnZlciBwcm92aWRlZCBieVxuICogbm9kZSdzIGJ1aWx0LWluIHBlcmZvcm1hbmNlIGhvb2tzLCBhbmQgbG9ncyBrZXkgR0MgZXZlbnRzLiBBIHNhbXBsZSBsb2cgbG9va3MgbGlrZTpcbiAqXG4gKiB7XG4gKiAgICAgXCJlbnRyeVR5cGVcIjogXCJnY1wiLFxuICogICAgIFwic3RhcnRUaW1lXCI6IDgyMjEuODc5OTE3LFxuICogICAgIFwiZHVyYXRpb25cIjogMi44OTA1MDAwMDE2MDkzMjU0LCAgPC0tIG1vc3QgaW1wb3J0YW50IGZpZWxkIHRvIGFuYWx5emUgZm9yIHN0b3AgdGhlIHdvcmxkIGV2ZW50cywgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzLlxuICogICAgIFwiZGV0YWlsXCI6IHtcbiAqICAgICAgICAgXCJraW5kXCI6IDQsICA8LS0gY29uc3RhbnQgZm9yIE5PREVfUEVSRk9STUFOQ0VfR0NfTUFKT1IuIGBNQUpPUmAgZXZlbnRzIG1pZ2h0IHBvaW50IHRvIEdDIGV2ZW50cyBjYXVzaW5nIGxvbmcgZGVsYXlzLlxuICogICAgICAgICBcImZsYWdzXCI6IDMyXG4gKiAgICAgfSxcbiAqICAgICBcInRpbWVzdGFtcFwiOiAxNzEwMzAwMzA5MzY4XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBFeHBlcmltZW50YWxHYXJiYWdlQ29sbGVjdGlvblBlcmZvcm1hbmNlTWV0cmljc01pZGRsZXdhcmVcbiAgaW1wbGVtZW50cyBNaWRkbGV3YXJlXG57XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nZ2VyOiBNb21lbnRvTG9nZ2VyO1xuICBwcml2YXRlIHJlYWRvbmx5IGdjT2JzZXJ2ZXI6IFBlcmZvcm1hbmNlT2JzZXJ2ZXI7XG5cbiAgY29uc3RydWN0b3IobG9nZ2VyRmFjdG9yeTogTW9tZW50b0xvZ2dlckZhY3RvcnkpIHtcbiAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKHRoaXMpO1xuXG4gICAgdGhpcy5nY09ic2VydmVyID0gbmV3IFBlcmZvcm1hbmNlT2JzZXJ2ZXIoaXRlbXMgPT4ge1xuICAgICAgaXRlbXNcbiAgICAgICAgLmdldEVudHJpZXMoKVxuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIC8vIE5PREVfUEVSRk9STUFOQ0VfR0NfTUFKT1IgaW5kaWNhdGVzIGEgbWFqb3IgR0MgZXZlbnQgc3VjaCBhcyBTVFcgKHN0b3AtdGhlLXdvcmxkKSBwYXVzZXNcbiAgICAgICAgICAvLyBhbmQgb3RoZXIgbG9uZyBkZWxheXMuIFRoaXMgZmlsdGVyIGlzIHRvIGNvbnRyb2wgdGhlIHZvbHVtZSBvZiBHQyBsb2dzIGlmIHdlIHdlcmUgdG8gZW5hYmxlXG4gICAgICAgICAgLy8gdGhpcyBvbiBhIGN1c3RvbWVyJ3MgY2xpZW50LlxuICAgICAgICAgIC8vIE5PREVfUEVSRk9STUFOQ0VfR0NfSU5DUkVNRU5UQUwgcHJpbnRzIGluY3JlbWVudGFsIEdDIHN0cmVhbSBvZiBsb2dzIHdoZW4gdGhlIHByb2Nlc3MgaXMgYXBwcm9hY2hpbmdcbiAgICAgICAgICAvLyBtYXggbWVtb3J5LlxuICAgICAgICAgIGl0ZW0gPT4ge1xuICAgICAgICAgICAgaWYgKGl0ZW0uZW50cnlUeXBlICE9PSAnZ2MnKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGdjUGVyZkRldGFpbCA9IGl0ZW0uZGV0YWlsIGFzIE5vZGVHQ1BlcmZvcm1hbmNlRGV0YWlsO1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgZ2NQZXJmRGV0YWlsLmtpbmQgPT09IGNvbnN0YW50cy5OT0RFX1BFUkZPUk1BTkNFX0dDX01BSk9SIHx8XG4gICAgICAgICAgICAgIGdjUGVyZkRldGFpbC5raW5kID09PSBjb25zdGFudHMuTk9ERV9QRVJGT1JNQU5DRV9HQ19JTkNSRU1FTlRBTFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICAgLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgY29uc3QgZ2NQZXJmRGV0YWlsID0gaXRlbS5kZXRhaWwgYXMgTm9kZUdDUGVyZm9ybWFuY2VEZXRhaWw7XG4gICAgICAgICAgY29uc3QgZ2NFdmVudE9iamVjdCA9IHtcbiAgICAgICAgICAgIGVudHJ5VHlwZTogaXRlbS5lbnRyeVR5cGUsXG4gICAgICAgICAgICBzdGFydFRpbWU6IGl0ZW0uc3RhcnRUaW1lLFxuICAgICAgICAgICAgZHVyYXRpb246IGl0ZW0uZHVyYXRpb24sXG4gICAgICAgICAgICBraW5kOiBnY1BlcmZEZXRhaWwua2luZCxcbiAgICAgICAgICAgIGZsYWdzOiBnY1BlcmZEZXRhaWwuZmxhZ3MsXG4gICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgfTtcbiAgICAgICAgICB0aGlzLmxvZ2dlci5pbmZvKEpTT04uc3RyaW5naWZ5KGdjRXZlbnRPYmplY3QpKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5nY09ic2VydmVyLm9ic2VydmUoe2VudHJ5VHlwZXM6IFsnZ2MnXX0pO1xuICB9XG5cbiAgb25OZXdSZXF1ZXN0KCk6IE1pZGRsZXdhcmVSZXF1ZXN0SGFuZGxlciB7XG4gICAgcmV0dXJuIG5ldyBFeHBlcmltZW50YWxHYXJiYWdlQ29sbGVjdGlvblBlcmZvcm1hbmNlTWV0cmljc01pZGRsZXdhcmVSZXF1ZXN0SGFuZGxlcigpO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5nY09ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgfVxufVxuIl19
© 2015 - 2025 Weber Informatics LLC | Privacy Policy