diff --git a/db/knex_migrations/2025-06-14-0000-heartbeat-range-config.js b/db/knex_migrations/2025-06-14-0000-heartbeat-range-config.js new file mode 100644 index 000000000..7d950f21f --- /dev/null +++ b/db/knex_migrations/2025-06-14-0000-heartbeat-range-config.js @@ -0,0 +1,12 @@ +exports.up = function (knex) { + return knex.schema + .alterTable("status_page", function (table) { + table.integer("heartbeat_bar_range_days").defaultTo(90).unsigned(); + }); +}; + +exports.down = function (knex) { + return knex.schema.alterTable("status_page", function (table) { + table.dropColumn("heartbeat_bar_range_days"); + }); +}; diff --git a/package-lock.json b/package-lock.json index ccb72dee3..2225d11e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "uptime-kuma", - "version": "2.0.0-beta.2", + "version": "2.0.0-beta.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "uptime-kuma", - "version": "2.0.0-beta.2", + "version": "2.0.0-beta.3", "license": "MIT", "dependencies": { "@grpc/grpc-js": "~1.8.22", diff --git a/server/model/status_page.js b/server/model/status_page.js index 2f3511ec5..908cd43f5 100644 --- a/server/model/status_page.js +++ b/server/model/status_page.js @@ -409,6 +409,7 @@ class StatusPage extends BeanModel { showPoweredBy: !!this.show_powered_by, googleAnalyticsId: this.google_analytics_tag_id, showCertificateExpiry: !!this.show_certificate_expiry, + heartbeatBarRangeDays: this.heartbeat_bar_range_days || 90, }; } @@ -432,6 +433,7 @@ class StatusPage extends BeanModel { showPoweredBy: !!this.show_powered_by, googleAnalyticsId: this.google_analytics_tag_id, showCertificateExpiry: !!this.show_certificate_expiry, + heartbeatBarRangeDays: this.heartbeat_bar_range_days || 90, }; } diff --git a/server/routers/status-page-router.js b/server/routers/status-page-router.js index 6e57451f1..92d3fb13b 100644 --- a/server/routers/status-page-router.js +++ b/server/routers/status-page-router.js @@ -84,14 +84,22 @@ router.get("/api/status-page/heartbeat/:slug", cache("1 minutes"), async (reques statusPageID ]); + // Get the status page to determine the heartbeat range + let statusPage = await R.findOne("status_page", " id = ? ", [ statusPageID ]); + let heartbeatRangeDays = (statusPage && statusPage.heartbeat_bar_range_days) ? statusPage.heartbeat_bar_range_days : 90; + + // Calculate the date range for heartbeats + let dateFrom = new Date(); + dateFrom.setDate(dateFrom.getDate() - heartbeatRangeDays); + for (let monitorID of monitorIDList) { let list = await R.getAll(` SELECT * FROM heartbeat - WHERE monitor_id = ? + WHERE monitor_id = ? AND time >= ? ORDER BY time DESC - LIMIT 100 `, [ monitorID, + dateFrom.toISOString(), ]); list = R.convertToBeans("heartbeat", list); diff --git a/server/socket-handlers/status-page-socket-handler.js b/server/socket-handlers/status-page-socket-handler.js index 952ec2fa7..57f2f9254 100644 --- a/server/socket-handlers/status-page-socket-handler.js +++ b/server/socket-handlers/status-page-socket-handler.js @@ -165,6 +165,7 @@ module.exports.statusPageSocketHandler = (socket) => { statusPage.custom_css = config.customCSS; statusPage.show_powered_by = config.showPoweredBy; statusPage.show_certificate_expiry = config.showCertificateExpiry; + statusPage.heartbeat_bar_range_days = config.heartbeatBarRangeDays || 90; statusPage.modified_date = R.isoDateTime(); statusPage.google_analytics_tag_id = config.googleAnalyticsId; diff --git a/src/lang/en.json b/src/lang/en.json index a979edcc2..aca79ce16 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -375,6 +375,14 @@ "Footer Text": "Footer Text", "Refresh Interval": "Refresh Interval", "Refresh Interval Description": "The status page will do a full site refresh every {0} seconds", + "Heartbeat Bar Range": "Heartbeat Bar Range", + "7 days": "7 days", + "30 days": "30 days", + "60 days": "60 days", + "90 days": "90 days", + "180 days": "180 days", + "365 days": "365 days", + "How many days of heartbeat history to show in the status page": "How many days of heartbeat history to show in the status page", "Show Powered By": "Show Powered By", "Domain Names": "Domain Names", "signedInDisp": "Signed in as {0}", diff --git a/src/pages/StatusPage.vue b/src/pages/StatusPage.vue index 116968282..2da07f356 100644 --- a/src/pages/StatusPage.vue +++ b/src/pages/StatusPage.vue @@ -42,6 +42,21 @@ +
+ + +
+ {{ $t("How many days of heartbeat history to show in the status page") }} +
+
+