]> git.immae.eu Git - github/bastienwirtz/homer.git/blobdiff - src/components/services/Prometheus.vue
Merge pull request #393 from jamesmacwhite/ping-endpoint-urls
[github/bastienwirtz/homer.git] / src / components / services / Prometheus.vue
index 25e9ddd700fa4c33bf5134a67f87ad67ba819fb1..6efcb34e8c9e46efe1f6f5ad775112dfd06aa558 100644 (file)
@@ -1,57 +1,41 @@
 <template>
-  <div>
-    <div
-      class="card"
-      :style="`background-color:${item.background};`"
-      :class="item.class"
-    >
-      <a :href="item.url" :target="item.target" rel="noreferrer">
-        <div class="card-content">
-          <div :class="mediaClass">
-            <slot name="icon">
-              <div v-if="item.logo" class="media-left">
-                <figure class="image is-48x48">
-                  <img :src="item.logo" :alt="`${item.name} logo`" />
-                </figure>
-              </div>
-              <div v-if="item.icon" class="media-left">
-                <figure class="image is-48x48">
-                  <i style="font-size: 35px" :class="['fa-fw', item.icon]"></i>
-                </figure>
-              </div>
-            </slot>
-            <div class="media-content">
-              <slot name="content">
-                <p class="title is-4">{{ item.name }}</p>
-                <p class="subtitle is-6">
-                  <template v-if="item.subtitle">
-                    {{ item.subtitle }}
-                  </template>
-                  <template v-else-if="api">
-                    {{ count }} {{ level }} alerts
-                  </template>
-                </p>
-              </slot>
-            </div>
-            <div v-if="api" class="status" :class="level">
-              {{ count }}
-            </div>
-          </div>
-          <div class="tag" :class="item.tagstyle" v-if="item.tag">
-            <strong class="tag-text">#{{ item.tag }}</strong>
-          </div>
-        </div>
-      </a>
-    </div>
-  </div>
+  <Generic :item="item">
+    <template #content>
+      <p class="title is-4">{{ item.name }}</p>
+      <p class="subtitle is-6">
+        <template v-if="item.subtitle">
+          {{ item.subtitle }}
+        </template>
+        <template v-else-if="api"> {{ count }} {{ level }} alerts </template>
+      </p>
+    </template>
+    <template #indicator>
+      <div v-if="api" class="status" :class="level">
+        {{ count }}
+      </div>
+    </template>
+  </Generic>
 </template>
 
 <script>
+import service from "@/mixins/service.js";
+import Generic from "./Generic.vue";
+
+const AlertsStatus = Object.freeze({
+  firing: "firing",
+  pending: "pending",
+  inactive: "inactive",
+});
+
 export default {
   name: "Prometheus",
+  mixins: [service],
   props: {
     item: Object,
   },
+  components: {
+    Generic,
+  },
   data: () => ({
     api: {
       status: "",
@@ -64,9 +48,6 @@ export default {
     },
   }),
   computed: {
-    mediaClass: function () {
-      return { media: true, "no-subtitle": !this.item.subtitle };
-    },
     count: function () {
       return (
         this.countFiring() || this.countPending() || this.countInactive() || 0
@@ -74,11 +55,11 @@ export default {
     },
     level: function () {
       if (this.countFiring()) {
-        return "firing";
+        return AlertsStatus.firing;
       } else if (this.countPending()) {
-        return "pending";
+        return AlertsStatus.pending;
       }
-      return "inactive";
+      return AlertsStatus.inactive;
     },
   },
   created() {
@@ -86,17 +67,12 @@ export default {
   },
   methods: {
     fetchStatus: async function () {
-      const url = `${this.item.url}/api/v1/alerts`;
-      this.api = await fetch(url, { method: "get" })
-        .then((response) => {
-          return response.json();
-        })
-        .catch((e) => console.log(e));
+      this.api = await this.fetch("api/v1/alerts").catch((e) => console.log(e));
     },
     countFiring: function () {
       if (this.api) {
         return this.api.data?.alerts?.filter(
-          (alert) => alert.state === "firing"
+          (alert) => alert.state === AlertsStatus.firing
         ).length;
       }
       return 0;
@@ -104,7 +80,7 @@ export default {
     countPending: function () {
       if (this.api) {
         return this.api.data?.alerts?.filter(
-          (alert) => alert.state === "pending"
+          (alert) => alert.state === AlertsStatus.pending
         ).length;
       }
       return 0;
@@ -112,7 +88,7 @@ export default {
     countInactive: function () {
       if (this.api) {
         return this.api.data?.alerts?.filter(
-          (alert) => alert.state === "inactive"
+          (alert) => alert.state === AlertsStatus.pending
         ).length;
       }
       return 0;