diff --git a/docs/widgets.md b/docs/widgets.md index 99f2af6f..dbb85e76 100644 --- a/docs/widgets.md +++ b/docs/widgets.md @@ -52,6 +52,7 @@ Dashy has support for displaying dynamic content in the form of widgets. There a - [Disk IO](#disk-io) - [System Load](#system-load) - [System Load History](#system-load-history) + - [Resource Usage Alerts](#resource-usage-alerts) - **[Dynamic Widgets](#dynamic-widgets)** - [Iframe Widget](#iframe-widget) - [HTML Embed Widget](#html-embedded-widget) @@ -1354,6 +1355,22 @@ Shows recent historical system load, calculated from the number of processes wai --- +### Resource Usage Alerts + +Lists recent high resource usage alerts (e.g. CPU, mem, IO, load, temp) + +

+ +##### Example + +```yaml +- type: gl-alerts + options: + hostname: http://192.168.130.2:61208 +``` + +--- + ## Dynamic Widgets ### Iframe Widget diff --git a/src/components/Widgets/GlAlerts.vue b/src/components/Widgets/GlAlerts.vue new file mode 100644 index 00000000..358814ed --- /dev/null +++ b/src/components/Widgets/GlAlerts.vue @@ -0,0 +1,129 @@ + + + + + diff --git a/src/components/Widgets/WidgetBase.vue b/src/components/Widgets/WidgetBase.vue index b500b16d..3623ea1b 100644 --- a/src/components/Widgets/WidgetBase.vue +++ b/src/components/Widgets/WidgetBase.vue @@ -109,6 +109,13 @@ @error="handleError" :ref="widgetRef" /> + import('@/components/Widgets/Flights.vue'), GitHubTrending: () => import('@/components/Widgets/GitHubTrending.vue'), GitHubProfile: () => import('@/components/Widgets/GitHubProfile.vue'), + GlAlerts: () => import('@/components/Widgets/GlAlerts.vue'), GlCpuCores: () => import('@/components/Widgets/GlCpuCores.vue'), GlCpuGauge: () => import('@/components/Widgets/GlCpuGauge.vue'), GlCpuHistory: () => import('@/components/Widgets/GlCpuHistory.vue'), diff --git a/src/utils/MiscHelpers.js b/src/utils/MiscHelpers.js index 5e998048..e84b132f 100644 --- a/src/utils/MiscHelpers.js +++ b/src/utils/MiscHelpers.js @@ -117,19 +117,25 @@ export const truncateStr = (str, len = 60, ellipse = '...') => { return str.length > len + ellipse.length ? `${str.slice(0, len)}${ellipse}` : str; }; +/* Given two timestamp, return the difference in text format, e.g. '10 minutes' */ +export const getTimeDifference = (startTime, endTime) => { + const msDifference = new Date(endTime).getTime() - new Date(startTime).getTime(); + const diff = Math.abs(Math.round(msDifference / 1000)); + const divide = (time, round) => Math.round(time / round); + if (diff < 60) return `${divide(diff, 1)} seconds`; + if (diff < 3600) return `${divide(diff, 60)} minutes`; + if (diff < 86400) return `${divide(diff, 3600)} hours`; + if (diff < 604800) return `${divide(diff, 86400)} days`; + if (diff >= 604800) return `${divide(diff, 604800)} weeks`; + return 'unknown'; +}; + /* Given a timestamp, return how long ago it was, e.g. '10 minutes' */ export const getTimeAgo = (dateTime) => { const now = new Date().getTime(); - const then = new Date(dateTime).getTime(); - if (then < 0) return 'Never'; - const diff = (now - then) / 1000; - const divide = (time, round) => Math.round(time / round); - if (diff < 60) return `${divide(diff, 1)} seconds ago`; - if (diff < 3600) return `${divide(diff, 60)} minutes ago`; - if (diff < 86400) return `${divide(diff, 3600)} hours ago`; - if (diff < 604800) return `${divide(diff, 86400)} days ago`; - if (diff >= 604800) return `${divide(diff, 604800)} weeks ago`; - return 'unknown'; + const diffStr = getTimeDifference(dateTime, now); + if (diffStr === 'unknown') return diffStr; + return `${diffStr} ago`; }; /* Given the name of a CSS variable, returns it's value */