chg: alerts - standardise history display timings

standardize-history-display-timestamp
Bharath Vignesh J K 2024-08-19 00:01:59 +05:30
parent 74a8b0bf34
commit 16d56109c8
3 changed files with 103 additions and 94 deletions

View File

@ -1,102 +1,111 @@
<template> <template>
<div class="plugin"> <div class="plugin">
<section id="alerts"> <section id="alerts">
<span class="title" v-if="hasAlerts"> <span class="title" v-if="hasAlerts">
Warning or critical alerts (last {{ countAlerts }} entries) Warning or critical alerts (last {{ countAlerts }} entries)
</span> </span>
<span class="title" v-else>No warning or critical alert detected</span> <span class="title" v-else>No warning or critical alert detected</span>
</section> </section>
<section id="alert"> <section id="alert">
<div class="table"> <div class="table">
<div class="table-row" v-for="(alert, alertId) in alerts" :key="alertId"> <div class="table-row" v-for="(alert, alertId) in alerts" :key="alertId">
<div class="table-cell text-left"> <div class="table-cell text-left">
{{ formatDate(alert.begin) }} {{ formatDate(alert.begin) }}
{{ alert.tz }} ({{ alert.ongoing ? 'ongoing' : alert.duration }}) -
({{ alert.ongoing ? 'ongoing' : alert.duration }}) - <span v-show="!alert.ongoing"> {{ alert.state }} on </span>
<span v-show="!alert.ongoing"> {{ alert.state }} on </span> <span :class="alert.state.toLowerCase()">
<span :class="alert.state.toLowerCase()">
{{ alert.type }} {{ alert.type }}
</span> </span>
({{ $filters.number(alert.max, 1) }}) ({{ $filters.number(alert.max, 1) }})
{{ alert.top }} {{ alert.top }}
</div> </div>
</div> </div>
</div> </div>
</section> </section>
</div> </div>
</template> </template>
<script> <script>
import { padStart } from 'lodash'; import {padStart} from 'lodash';
import { GlancesFavico } from '../services.js'; import {GlancesFavico} from '../services.js';
export default { export default {
props: { props: {
data: { data: {
type: Object type: Object
}
},
computed: {
stats() {
return this.data.stats['alert'];
},
alerts() {
return (this.stats || []).map((alertalertStats) => {
const alert = {};
var tzoffset = new Date().getTimezoneOffset();
alert.state = alertalertStats.state;
alert.type = alertalertStats.type;
alert.begin = alertalertStats.begin * 1000 - tzoffset * 60 * 1000;
alert.end = alertalertStats.end * 1000 - tzoffset * 60 * 1000;
alert.ongoing = alertalertStats.end == -1;
alert.min = alertalertStats.min;
alert.avg = alertalertStats.avg;
alert.max = alertalertStats.max;
alert.top = alertalertStats.top.join(', ');
if (!alert.ongoing) {
const duration = alert.end - alert.begin;
const seconds = parseInt((duration / 1000) % 60),
minutes = parseInt((duration / (1000 * 60)) % 60),
hours = parseInt((duration / (1000 * 60 * 60)) % 24);
alert.duration =
padStart(hours, 2, '0') +
':' +
padStart(minutes, 2, '0') +
':' +
padStart(seconds, 2, '0');
}
return alert;
});
},
hasAlerts() {
return this.countAlerts > 0;
},
countAlerts() {
return this.alerts.length;
},
hasOngoingAlerts() {
return this.countOngoingAlerts > 0;
},
countOngoingAlerts() {
return this.alerts.filter(({ ongoing }) => ongoing).length;
}
},
watch: {
countOngoingAlerts() {
if (this.countOngoingAlerts) {
GlancesFavico.badge(this.countOngoingAlerts);
} else {
GlancesFavico.reset();
}
}
},
methods: {
formatDate(date) {
return new Date(date).toLocaleString();
}
} }
},
computed: {
stats() {
return this.data.stats['alert'];
},
alerts() {
return (this.stats || []).map((alertStats) => {
const alert = {};
alert.state = alertStats.state;
alert.type = alertStats.type;
alert.begin = alertStats.begin * 1000;
alert.end = alertStats.end * 1000;
alert.ongoing = alertStats.end == -1;
alert.min = alertStats.min;
alert.avg = alertStats.avg;
alert.max = alertStats.max;
alert.top = alertStats.top.join(', ');
if (!alert.ongoing) {
const duration = alert.end - alert.begin;
const seconds = parseInt((duration / 1000) % 60),
minutes = parseInt((duration / (1000 * 60)) % 60),
hours = parseInt((duration / (1000 * 60 * 60)) % 24);
alert.duration = padStart(hours, 2, '0') +
':' + padStart(minutes, 2, '0') +
':' + padStart(seconds, 2, '0');
}
return alert;
});
},
hasAlerts() {
return this.countAlerts > 0;
},
countAlerts() {
return this.alerts.length;
},
hasOngoingAlerts() {
return this.countOngoingAlerts > 0;
},
countOngoingAlerts() {
return this.alerts.filter(({ongoing}) => ongoing).length;
}
},
watch: {
countOngoingAlerts() {
if (this.countOngoingAlerts) {
GlancesFavico.badge(this.countOngoingAlerts);
} else {
GlancesFavico.reset();
}
}
},
methods: {
formatDate(timestamp) {
const tzOffset = new Date().getTimezoneOffset();
const hours = Math.trunc(Math.abs(tzOffset) / 60);
const minutes = Math.abs(tzOffset % 60);
let tzString = tzOffset <= 0 ? '+' : '-';
tzString += String(hours).padStart(2, '0') + String(minutes).padStart(2, '0');
const date = new Date(timestamp);
return String(date.getFullYear()) +
'-' + String(date.getMonth()).padStart(2, '0') +
'-' + String(date.getDate()).padStart(2, '0') +
' ' + String(date.getHours()).padStart(2, '0') +
':' + String(date.getMinutes()).padStart(2, '0') +
':' + String(date.getSeconds()).padStart(2, '0') +
'(' + tzString + ')';
}
}
}; };
</script> </script>

File diff suppressed because one or more lines are too long

View File

@ -144,8 +144,8 @@ class PluginModel(GlancesPluginModel):
# New line # New line
ret.append(self.curse_new_line()) ret.append(self.curse_new_line())
# Start # Start
msg = str(datetime.fromtimestamp(alert['begin'], tz=datetime.now().astimezone().tzinfo)) alert_dt = datetime.fromtimestamp(alert['begin'], tz=datetime.now().astimezone().tzinfo)
ret.append(self.curse_add_line(msg)) ret.append(self.curse_add_line(alert_dt.strftime("%Y-%m-%d %H:%M:%S(%z)")))
# Duration # Duration
if alert['end'] > 0: if alert['end'] > 0:
# If finished display duration # If finished display duration