Add events to service detail page
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<router-link to="/" class="absolute top-2 left-2 inline-block px-2 py-0 text-lg text-black transition bg-gray-100 rounded shadow ripple hover:shadow-lg hover:bg-gray-200 focus:outline-none">
|
||||
←
|
||||
←
|
||||
</router-link>
|
||||
<div class="container mx-auto">
|
||||
<slot v-if="serviceStatus">
|
||||
@ -8,7 +8,7 @@
|
||||
<hr class="mb-4" />
|
||||
<Service :data="serviceStatus" :maximumNumberOfResults="20" @showTooltip="showTooltip" />
|
||||
</slot>
|
||||
<div v-if="serviceStatus.uptime" class="mt-5">
|
||||
<div v-if="serviceStatus.uptime" class="mt-12">
|
||||
<h1 class="text-3xl text-monospace text-gray-400">UPTIME</h1>
|
||||
<hr />
|
||||
<div class="flex space-x-4 text-center text-2xl mt-5">
|
||||
@ -25,20 +25,44 @@
|
||||
<h2 class="text-sm text-gray-400">Last hour</h2>
|
||||
</div>
|
||||
</div>
|
||||
<h3 class="text-xl text-monospace text-gray-400">BADGES</h3>
|
||||
<hr />
|
||||
<div class="flex space-x-4 text-center text-2xl mt-5">
|
||||
<hr class="mt-1"/>
|
||||
<h3 class="text-xl text-monospace text-gray-400 mt-1 text-right">BADGES</h3>
|
||||
<div class="flex space-x-4 text-center text-2xl mt-6 relative bottom-12">
|
||||
<div class="flex-1">
|
||||
<img :src="generateBadgeImageURL('7d')" alt="7d uptime badge" class="mx-auto" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<img :src="generateBadgeImageURL('24h')" alt="7d uptime badge" class="mx-auto" />
|
||||
<img :src="generateBadgeImageURL('24h')" alt="24h uptime badge" class="mx-auto" />
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<img :src="generateBadgeImageURL('1h')" alt="7d uptime badge" class="mx-auto" />
|
||||
<img :src="generateBadgeImageURL('1h')" alt="1h uptime badge" class="mx-auto" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h1 class="text-3xl text-monospace text-gray-400 mt-4">EVENTS</h1>
|
||||
<hr class="mb-4" />
|
||||
<div>
|
||||
<slot v-for="event in events" :key="event">
|
||||
<div class="p-3 my-4">
|
||||
<h2 class="text-lg">
|
||||
<span v-if="event.type === 'HEALTHY'" class="border border-green-600 rounded-full px-1 text-green-700 opacity-75 bg-green-100 mr-2"><span class="relative bottom-0.5">🡡</span></span>
|
||||
<span v-else-if="event.type === 'UNHEALTHY'" class="border border-red-500 rounded-full px-1 text-red-700 opacity-75 bg-red-100 mr-2">🡣</span>
|
||||
<span v-else-if="event.type === 'START'" class="mr-2">▶</span>
|
||||
{{ event.fancyText }}
|
||||
</h2>
|
||||
<div class="flex mt-1 text-sm text-gray-400">
|
||||
<div class="flex-1 text-left pl-10">
|
||||
{{ new Date(event.timestamp).toISOString() }}
|
||||
</div>
|
||||
<div class="flex-1 text-right">
|
||||
{{ event.fancyTimeAgo }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</slot>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<Settings @refreshData="fetchData"/>
|
||||
</template>
|
||||
@ -48,6 +72,7 @@
|
||||
import Settings from '@/components/Settings.vue'
|
||||
import Service from '@/components/Service.vue';
|
||||
import {SERVER_URL} from "@/main.js";
|
||||
import {helper} from "@/mixins/helper.js";
|
||||
|
||||
export default {
|
||||
name: 'Details',
|
||||
@ -56,6 +81,7 @@ export default {
|
||||
Settings,
|
||||
},
|
||||
emits: ['showTooltip'],
|
||||
mixins: [helper],
|
||||
methods: {
|
||||
fetchData() {
|
||||
console.log("[Details][fetchData] Fetching data");
|
||||
@ -63,8 +89,34 @@ export default {
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (JSON.stringify(this.serviceStatus) !== JSON.stringify(data)) {
|
||||
console.log(data);
|
||||
this.serviceStatus = data;
|
||||
this.serviceStatus = data.serviceStatus;
|
||||
let events = [];
|
||||
for (let i = data.events.length-1; i >= 0; i--) {
|
||||
let event = data.events[i];
|
||||
if (i === data.events.length-1) {
|
||||
if (event.type === "UNHEALTHY") {
|
||||
event.fancyText = "Service is unhealthy";
|
||||
} else {
|
||||
event.fancyText = "Service is healthy";
|
||||
}
|
||||
} else {
|
||||
let nextEvent = data.events[i+1];
|
||||
if (event.type === "HEALTHY") {
|
||||
event.fancyText = "Service became healthy again";
|
||||
} else if (event.type === "UNHEALTHY") {
|
||||
if (nextEvent) {
|
||||
event.fancyText = "Service was unhealthy for " + this.prettifyTimeDifference(nextEvent.timestamp, event.timestamp);
|
||||
} else {
|
||||
event.fancyText = "Service became unhealthy";
|
||||
}
|
||||
} else if (event.type === "START") {
|
||||
event.fancyText = "Monitoring started";
|
||||
}
|
||||
}
|
||||
event.fancyTimeAgo = this.generatePrettyTimeAgo(event.timestamp);
|
||||
events.push(event);
|
||||
}
|
||||
this.events = events;
|
||||
}
|
||||
});
|
||||
},
|
||||
@ -77,13 +129,18 @@ export default {
|
||||
}
|
||||
return (uptime * 100).toFixed(2) + "%"
|
||||
},
|
||||
prettifyTimeDifference(start, end) {
|
||||
let minutes = Math.ceil((new Date(start) - new Date(end))/1000/60);
|
||||
return minutes + (minutes === 1 ? " minute" : " minutes");
|
||||
},
|
||||
showTooltip(result, event) {
|
||||
this.$emit('showTooltip', result, event);
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
serviceStatus: {}
|
||||
serviceStatus: {},
|
||||
events: []
|
||||
}
|
||||
},
|
||||
created() {
|
||||
|
Reference in New Issue
Block a user