chore: preemptivly reduce the cost to store the responses by lowering the limit and changing the on disk compression format (#6691)

This commit is contained in:
Frank Elsinga 2026-01-13 02:23:06 +01:00 committed by GitHub
parent 751fe1bbf5
commit 59af678eb9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 11 additions and 11 deletions

View File

@ -2,7 +2,7 @@ exports.up = function (knex) {
return knex.schema.alterTable("monitor", function (table) { return knex.schema.alterTable("monitor", function (table) {
table.boolean("save_response").notNullable().defaultTo(false); table.boolean("save_response").notNullable().defaultTo(false);
table.boolean("save_error_response").notNullable().defaultTo(true); table.boolean("save_error_response").notNullable().defaultTo(true);
table.integer("response_max_length").notNullable().defaultTo(10240); // Default 10KB table.integer("response_max_length").notNullable().defaultTo(1024); // Default 1KB
}); });
}; };

View File

@ -1,7 +1,7 @@
const { BeanModel } = require("redbean-node/dist/bean-model"); const { BeanModel } = require("redbean-node/dist/bean-model");
const zlib = require("node:zlib"); const zlib = require("node:zlib");
const { promisify } = require("node:util"); const { promisify } = require("node:util");
const gunzip = promisify(zlib.gunzip); const brotliDecompress = promisify(zlib.brotliDecompress);
/** /**
* status: * status:
@ -73,8 +73,8 @@ class Heartbeat extends BeanModel {
} }
try { try {
// Offload gzip decode from main event loop to libuv thread pool // Offload brotli decode from main event loop to libuv thread pool
return (await gunzip(Buffer.from(response, "base64"))).toString("utf8"); return (await brotliDecompress(Buffer.from(response, "base64"))).toString("utf8");
} catch (error) { } catch (error) {
return response; return response;
} }

View File

@ -60,7 +60,7 @@ const https = require("https");
const http = require("http"); const http = require("http");
const zlib = require("node:zlib"); const zlib = require("node:zlib");
const { promisify } = require("node:util"); const { promisify } = require("node:util");
const gzip = promisify(zlib.gzip); const brotliCompress = promisify(zlib.brotliCompress);
const DomainExpiry = require("./domain_expiry"); const DomainExpiry = require("./domain_expiry");
const rootCertificates = rootCertificatesFingerprints(); const rootCertificates = rootCertificatesFingerprints();
@ -1174,8 +1174,8 @@ class Monitor extends BeanModel {
responseData = responseData.substring(0, maxSize) + "... (truncated)"; responseData = responseData.substring(0, maxSize) + "... (truncated)";
} }
// Offload gzip compression from main event loop to libuv thread pool // Offload brotli compression from main event loop to libuv thread pool
bean.response = (await gzip(Buffer.from(responseData, "utf8"))).toString("base64"); bean.response = (await brotliCompress(Buffer.from(responseData, "utf8"))).toString("base64");
} }
/** /**

View File

@ -104,7 +104,7 @@
"saveErrorResponseForNotifications": "Save HTTP Error Response for Notifications", "saveErrorResponseForNotifications": "Save HTTP Error Response for Notifications",
"saveResponseDescription": "Stores the HTTP response and makes it available to notification templates as {templateVariable}", "saveResponseDescription": "Stores the HTTP response and makes it available to notification templates as {templateVariable}",
"responseMaxLength": "Response Max Length (bytes)", "responseMaxLength": "Response Max Length (bytes)",
"responseMaxLengthDescription": "Maximum size of response data to store. Set to 0 for unlimited. Larger responses will be truncated. Default: 10240 (10KB)", "responseMaxLengthDescription": "Maximum size of response data to store. Set to 0 for unlimited. Larger responses will be truncated. Default: 1024 (1KB)",
"Accepted Status Codes": "Accepted Status Codes", "Accepted Status Codes": "Accepted Status Codes",
"Push URL": "Push URL", "Push URL": "Push URL",
"needPushEvery": "You should call this URL every {0} seconds.", "needPushEvery": "You should call this URL every {0} seconds.",

View File

@ -2269,7 +2269,7 @@ const monitorDefaults = {
accepted_statuscodes: ["200-299"], accepted_statuscodes: ["200-299"],
saveResponse: false, saveResponse: false,
saveErrorResponse: true, saveErrorResponse: true,
responseMaxLength: 10240, responseMaxLength: 1024,
dns_resolve_type: "A", dns_resolve_type: "A",
dns_resolve_server: "1.1.1.1", dns_resolve_server: "1.1.1.1",
docker_container: "", docker_container: "",

View File

@ -43,7 +43,7 @@ exports.PING_COUNT_DEFAULT = 1;
exports.PING_PER_REQUEST_TIMEOUT_MIN = 1; exports.PING_PER_REQUEST_TIMEOUT_MIN = 1;
exports.PING_PER_REQUEST_TIMEOUT_MAX = 60; exports.PING_PER_REQUEST_TIMEOUT_MAX = 60;
exports.PING_PER_REQUEST_TIMEOUT_DEFAULT = 2; exports.PING_PER_REQUEST_TIMEOUT_DEFAULT = 2;
exports.RESPONSE_BODY_LENGTH_DEFAULT = 1024 * 10; exports.RESPONSE_BODY_LENGTH_DEFAULT = 1024;
exports.RESPONSE_BODY_LENGTH_MAX = 1024 * 1024; exports.RESPONSE_BODY_LENGTH_MAX = 1024 * 1024;
exports.CONSOLE_STYLE_Reset = "\x1b[0m"; exports.CONSOLE_STYLE_Reset = "\x1b[0m";
exports.CONSOLE_STYLE_Bright = "\x1b[1m"; exports.CONSOLE_STYLE_Bright = "\x1b[1m";

View File

@ -70,7 +70,7 @@ export const PING_PER_REQUEST_TIMEOUT_DEFAULT = 2;
* Response body length cutoff used by default (10kb) * Response body length cutoff used by default (10kb)
* (measured in bytes) * (measured in bytes)
*/ */
export const RESPONSE_BODY_LENGTH_DEFAULT = 1024 * 10; export const RESPONSE_BODY_LENGTH_DEFAULT = 1024;
/** /**
* Maximum allowed response body length to store (1mb) * Maximum allowed response body length to store (1mb)
* (measured in bytes) * (measured in bytes)