mirror of https://github.com/nicolargo/glances
chg: alerts - standardise history display timings
parent
74a8b0bf34
commit
16d56109c8
|
@ -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
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue