feat: Add configurable response data storage for notifications (#6684)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com> Co-authored-by: Frank Elsinga <frank@elsinga.de> Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>pull/6690/head
parent
034b8641c8
commit
751fe1bbf5
@ -0,0 +1,15 @@
|
||||
exports.up = function (knex) {
|
||||
return knex.schema.alterTable("monitor", function (table) {
|
||||
table.boolean("save_response").notNullable().defaultTo(false);
|
||||
table.boolean("save_error_response").notNullable().defaultTo(true);
|
||||
table.integer("response_max_length").notNullable().defaultTo(10240); // Default 10KB
|
||||
});
|
||||
};
|
||||
|
||||
exports.down = function (knex) {
|
||||
return knex.schema.alterTable("monitor", function (table) {
|
||||
table.dropColumn("save_response");
|
||||
table.dropColumn("save_error_response");
|
||||
table.dropColumn("response_max_length");
|
||||
});
|
||||
};
|
||||
@ -0,0 +1,11 @@
|
||||
exports.up = function (knex) {
|
||||
return knex.schema.alterTable("heartbeat", function (table) {
|
||||
table.text("response").nullable().defaultTo(null);
|
||||
});
|
||||
};
|
||||
|
||||
exports.down = function (knex) {
|
||||
return knex.schema.alterTable("heartbeat", function (table) {
|
||||
table.dropColumn("response");
|
||||
});
|
||||
};
|
||||
@ -0,0 +1,36 @@
|
||||
const { describe, test } = require("node:test");
|
||||
const assert = require("node:assert");
|
||||
const Monitor = require("../../server/model/monitor");
|
||||
const Heartbeat = require("../../server/model/heartbeat");
|
||||
const { RESPONSE_BODY_LENGTH_DEFAULT } = require("../../src/util");
|
||||
|
||||
describe("Monitor response saving", () => {
|
||||
test("getSaveResponse and getSaveErrorResponse parse booleans", () => {
|
||||
const monitor = Object.create(Monitor.prototype);
|
||||
monitor.save_response = 1;
|
||||
monitor.save_error_response = 0;
|
||||
|
||||
assert.strictEqual(monitor.getSaveResponse(), true);
|
||||
assert.strictEqual(monitor.getSaveErrorResponse(), false);
|
||||
});
|
||||
|
||||
test("saveResponseData stores and truncates response", async () => {
|
||||
const monitor = Object.create(Monitor.prototype);
|
||||
monitor.response_max_length = 5;
|
||||
|
||||
const bean = {};
|
||||
await monitor.saveResponseData(bean, "abcdef");
|
||||
|
||||
assert.strictEqual(await Heartbeat.decodeResponseValue(bean.response), "abcde... (truncated)");
|
||||
});
|
||||
|
||||
test("saveResponseData stringifies objects", async () => {
|
||||
const monitor = Object.create(Monitor.prototype);
|
||||
monitor.response_max_length = RESPONSE_BODY_LENGTH_DEFAULT;
|
||||
|
||||
const bean = {};
|
||||
await monitor.saveResponseData(bean, { ok: true });
|
||||
|
||||
assert.strictEqual(await Heartbeat.decodeResponseValue(bean.response), JSON.stringify({ ok: true }));
|
||||
});
|
||||
});
|
||||
Loading…
Reference in new issue