index.vue 4.52 KB
Newer Older
Johannes Edmeier committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
<!--
  - Copyright 2014-2018 the original author or authors.
  -
  - Licensed under the Apache License, Version 2.0 (the "License");
  - you may not use this file except in compliance with the License.
  - You may obtain a copy of the License at
  -
  -     http://www.apache.org/licenses/LICENSE-2.0
  -
  - Unless required by applicable law or agreed to in writing, software
  - distributed under the License is distributed on an "AS IS" BASIS,
  - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  - See the License for the specific language governing permissions and
  - limitations under the License.
  -->

<template>
18 19 20 21 22 23 24 25 26
  <section class="section">
    <div class="container">
      <div v-if="error" class="message is-danger">
        <div class="message-body">
          <strong>
            <font-awesome-icon class="has-text-danger" icon="exclamation-triangle"/>
            Fetching metrics index failed.
          </strong>
          <p v-text="error.message"/>
Johannes Edmeier committed
27
        </div>
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
      </div>
      <div class="columns is-desktop">
        <div class="column is-half-desktop">
          <details-info v-if="hasInfo" :instance="instance"/>
          <details-metadata v-if="hasMetadata" :instance="instance"/>
        </div>
        <div class="column is-half-desktop">
          <details-health :instance="instance"/>
        </div>
      </div>
      <div class="columns is-desktop">
        <div class="column is-half-desktop">
          <details-process v-if="hasProcess" :instance="instance"/>
          <details-gc v-if="hasGc" :instance="instance"/>
        </div>
        <div class="column is-half-desktop">
          <details-threads v-if="hasThreads" :instance="instance"/>
        </div>
      </div>
      <div class="columns is-desktop">
        <div class="column is-half-desktop">
          <details-memory v-if="hasMemory" :instance="instance" type="heap"/>
        </div>
        <div class="column is-half-desktop">
          <details-memory v-if="hasMemory" :instance="instance" type="nonheap"/>
        </div>
      </div>
      <div class="columns is-desktop">
        <div class="column is-half-desktop">
          <details-datasources v-if="hasDatasources" :instance="instance"/>
        </div>
        <div class="column is-half-desktop">
          <details-caches v-if="hasCaches" :instance="instance"/>
        </div>
      </div>
    </div>
  </section>
Johannes Edmeier committed
65 66 67
</template>

<script>
68
  import Instance from '@/services/instance';
69
  import detailsCaches from './details-caches';
70
  import detailsDatasources from './details-datasources';
71
  import detailsGc from './details-gc';
72 73 74
  import detailsHealth from './details-health';
  import detailsInfo from './details-info';
  import detailsMemory from './details-memory';
75
  import detailsMetadata from './details-metadata';
76 77
  import detailsProcess from './details-process';
  import detailsThreads from './details-threads';
Johannes Edmeier committed
78 79 80

  export default {
    components: {
81 82 83 84 85 86
      detailsHealth,
      detailsInfo,
      detailsProcess,
      detailsThreads,
      detailsDatasources,
      detailsMemory,
87
      detailsGc,
88 89
      detailsCaches,
      detailsMetadata
Johannes Edmeier committed
90
    },
91 92 93 94 95 96
    props: {
      instance: {
        type: Instance,
        required: true
      }
    },
97 98 99 100 101 102 103
    data: () => ({
      hasLoaded: false,
      error: null,
      metrics: []
    }),
    computed: {
      hasCaches() {
104
        return this.hasMetric('cache.gets');
105 106
      },
      hasDatasources() {
107
        return this.hasMetric('data.source.active.connections');
108 109
      },
      hasGc() {
110
        return this.hasMetric('jvm.gc.pause');
111 112
      },
      hasInfo() {
113
        return this.instance.hasEndpoint('info');
114 115
      },
      hasMemory() {
116
        return this.hasMetric('jvm.memory.max');
117 118
      },
      hasProcess() {
119
        return this.hasMetric('process.uptime');
120 121
      },
      hasThreads() {
122
        return this.hasMetric('jvm.threads.live');
123
      },
124
      hasMetadata() {
125
        return this.instance.registration && this.instance.registration.metadata;
126
      }
127 128 129 130 131
    },
    created() {
      this.fetchMetricIndex();
    },
    methods: {
132 133 134
      hasMetric(metric) {
        return this.metrics.indexOf(metric) >= 0;
      },
135
      async fetchMetricIndex() {
136
        if (this.instance.hasEndpoint('metrics')) {
137 138 139 140 141 142 143 144 145 146 147 148
          this.error = null;
          try {
            const res = await this.instance.fetchMetrics();
            this.metrics = res.data.names;
          } catch (error) {
            console.warn('Fetching metric index failed:', error);
            this.error = error;
          }
          this.hasLoaded = true;
        }
      }
    }
Johannes Edmeier committed
149
  }
150
</script>