|
@@ -0,0 +1,240 @@
|
|
|
+<template>
|
|
|
+ <div class="container">
|
|
|
+ <metadata title="Admin | Statistics" />
|
|
|
+ <div class="columns">
|
|
|
+ <div
|
|
|
+ class="card column is-10-desktop is-offset-1-desktop is-12-mobile"
|
|
|
+ >
|
|
|
+ <header class="card-header">
|
|
|
+ <p class="card-header-title">
|
|
|
+ Average Logs
|
|
|
+ </p>
|
|
|
+ </header>
|
|
|
+ <div class="card-content">
|
|
|
+ <div class="content">
|
|
|
+ <table class="table">
|
|
|
+ <thead>
|
|
|
+ <tr>
|
|
|
+ <th>Name</th>
|
|
|
+ <th>Status</th>
|
|
|
+ <th>Stage</th>
|
|
|
+ <th>Jobs in queue</th>
|
|
|
+ <th>Jobs in progress</th>
|
|
|
+ <th>Concurrency</th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <tbody>
|
|
|
+ <tr
|
|
|
+ v-for="module_ in modules"
|
|
|
+ :key="module_.name"
|
|
|
+ >
|
|
|
+ <td>
|
|
|
+ <router-link
|
|
|
+ :to="'?moduleName=' + module_.name"
|
|
|
+ >{{ module_.name }}</router-link
|
|
|
+ >
|
|
|
+ </td>
|
|
|
+ <td>{{ module_.status }}</td>
|
|
|
+ <td>{{ module_.stage }}</td>
|
|
|
+ <td>{{ module_.jobsInQueue }}</td>
|
|
|
+ <td>{{ module_.jobsInProgress }}</td>
|
|
|
+ <td>{{ module_.concurrency }}</td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <br />
|
|
|
+ <div class="columns" v-if="module_">
|
|
|
+ <div
|
|
|
+ class="card column is-10-desktop is-offset-1-desktop is-12-mobile"
|
|
|
+ >
|
|
|
+ <header class="card-header">
|
|
|
+ <p class="card-header-title">
|
|
|
+ Average Logs
|
|
|
+ </p>
|
|
|
+ </header>
|
|
|
+ <div class="card-content">
|
|
|
+ <div class="content">
|
|
|
+ <table class="table">
|
|
|
+ <thead>
|
|
|
+ <tr>
|
|
|
+ <th>Name</th>
|
|
|
+ <th>Payload</th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <tbody>
|
|
|
+ <tr
|
|
|
+ v-for="job in module_.runningJobs"
|
|
|
+ :key="JSON.stringify(job)"
|
|
|
+ >
|
|
|
+ <td>{{ job.name }}</td>
|
|
|
+ <td>
|
|
|
+ {{ JSON.stringify(job.payload) }}
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <br />
|
|
|
+ <div class="columns" v-if="module_">
|
|
|
+ <div
|
|
|
+ class="card column is-10-desktop is-offset-1-desktop is-12-mobile"
|
|
|
+ >
|
|
|
+ <header class="card-header">
|
|
|
+ <p class="card-header-title">
|
|
|
+ Average Logs
|
|
|
+ </p>
|
|
|
+ </header>
|
|
|
+ <div class="card-content">
|
|
|
+ <div class="content">
|
|
|
+ <table class="table">
|
|
|
+ <thead>
|
|
|
+ <tr>
|
|
|
+ <th>Job name</th>
|
|
|
+ <th>Successful</th>
|
|
|
+ <th>Failed</th>
|
|
|
+ <th>Total</th>
|
|
|
+ <th>Average timing</th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <tbody>
|
|
|
+ <tr
|
|
|
+ v-for="(job,
|
|
|
+ jobName) in module_.jobStatistics"
|
|
|
+ :key="jobName"
|
|
|
+ >
|
|
|
+ <td>{{ jobName }}</td>
|
|
|
+ <td>
|
|
|
+ {{ job.successful }}
|
|
|
+ </td>
|
|
|
+ <td>
|
|
|
+ {{ job.failed }}
|
|
|
+ </td>
|
|
|
+ <td>
|
|
|
+ {{ job.total }}
|
|
|
+ </td>
|
|
|
+ <td>
|
|
|
+ {{ job.averageTiming }}
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script>
|
|
|
+import io from "../../io";
|
|
|
+
|
|
|
+export default {
|
|
|
+ components: {},
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ modules: [],
|
|
|
+ module_: null
|
|
|
+ };
|
|
|
+ },
|
|
|
+ mounted() {
|
|
|
+ io.getSocket(socket => {
|
|
|
+ this.socket = socket;
|
|
|
+ if (this.socket.connected) this.init();
|
|
|
+ io.onConnect(() => this.init());
|
|
|
+ });
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ init() {
|
|
|
+ this.socket.emit("utils.getModules", data => {
|
|
|
+ console.log(data);
|
|
|
+ if (data.status === "success") {
|
|
|
+ this.modules = data.modules;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if (this.$route.query.moduleName) {
|
|
|
+ this.socket.emit(
|
|
|
+ "utils.getModule",
|
|
|
+ this.$route.query.moduleName,
|
|
|
+ data => {
|
|
|
+ console.log(data);
|
|
|
+ if (data.status === "success") {
|
|
|
+ this.module_ = {
|
|
|
+ runningJobs: data.runningJobs,
|
|
|
+ jobStatistics: data.jobStatistics
|
|
|
+ };
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ }
|
|
|
+ },
|
|
|
+ round(number) {
|
|
|
+ return Math.round(number);
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+</script>
|
|
|
+
|
|
|
+//
|
|
|
+<style lang="scss" scoped>
|
|
|
+@import "styles/global.scss";
|
|
|
+
|
|
|
+.night-mode {
|
|
|
+ .table {
|
|
|
+ color: #ddd;
|
|
|
+ background-color: #222;
|
|
|
+
|
|
|
+ thead tr {
|
|
|
+ background: $night-mode-secondary;
|
|
|
+ td {
|
|
|
+ color: #fff;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tbody tr:hover {
|
|
|
+ background-color: #111 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ tbody tr:nth-child(even) {
|
|
|
+ background-color: #444;
|
|
|
+ }
|
|
|
+
|
|
|
+ strong {
|
|
|
+ color: #ddd;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .card {
|
|
|
+ background-color: $night-mode-secondary;
|
|
|
+
|
|
|
+ p {
|
|
|
+ color: #ddd;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+body {
|
|
|
+ font-family: "Roboto", sans-serif;
|
|
|
+}
|
|
|
+
|
|
|
+.user-avatar {
|
|
|
+ display: block;
|
|
|
+ max-width: 50px;
|
|
|
+ margin: 0 auto;
|
|
|
+}
|
|
|
+
|
|
|
+td {
|
|
|
+ vertical-align: middle;
|
|
|
+}
|
|
|
+
|
|
|
+.is-primary:focus {
|
|
|
+ background-color: $primary-color !important;
|
|
|
+}
|
|
|
+</style>
|