summaryrefslogtreecommitdiffstats
path: root/glances/outputs/static/js/components/plugin-containers.vue
diff options
context:
space:
mode:
Diffstat (limited to 'glances/outputs/static/js/components/plugin-containers.vue')
-rw-r--r--glances/outputs/static/js/components/plugin-containers.vue175
1 files changed, 175 insertions, 0 deletions
diff --git a/glances/outputs/static/js/components/plugin-containers.vue b/glances/outputs/static/js/components/plugin-containers.vue
new file mode 100644
index 00000000..10099ccc
--- /dev/null
+++ b/glances/outputs/static/js/components/plugin-containers.vue
@@ -0,0 +1,175 @@
+<template>
+ <section id="containers-plugin" class="plugin" v-if="containers.length">
+ <span class="title">CONTAINERS</span>
+ {{ containers.length }} sorted by {{ sorter.getColumnLabel(sorter.column) }}
+ <div class="table">
+ <div class="table-row">
+ <div class="table-cell text-left">Engine</div>
+ <div class="table-cell text-left">Pod</div>
+ <div
+ class="table-cell text-left"
+ :class="['sortable', sorter.column === 'name' && 'sort']"
+ @click="args.sort_processes_key = 'name'"
+ >
+ Name
+ </div>
+ <div class="table-cell">Status</div>
+ <div class="table-cell">Uptime</div>
+ <div
+ class="table-cell"
+ :class="['sortable', sorter.column === 'cpu_percent' && 'sort']"
+ @click="args.sort_processes_key = 'cpu_percent'"
+ >
+ CPU%
+ </div>
+ <div
+ class="table-cell"
+ :class="['sortable', sorter.column === 'memory_percent' && 'sort']"
+ @click="args.sort_processes_key = 'memory_percent'"
+ >
+ MEM
+ </div>
+ <div class="table-cell">/MAX</div>
+ <div class="table-cell">IOR/s</div>
+ <div class="table-cell">IOW/s</div>
+ <div class="table-cell">RX/s</div>
+ <div class="table-cell">TX/s</div>
+ <div class="table-cell text-left">Command</div>
+ </div>
+ <div
+ class="table-row"
+ v-for="(container, containerId) in containers"
+ :key="containerId"
+ >
+ <div class="table-cell text-left">{{ container.engine }}</div>
+ <div class="table-cell text-left">{{ container.pod_id || '-' }}</div>
+ <div class="table-cell text-left">{{ container.name }}</div>
+ <div class="table-cell" :class="container.status == 'Paused' ? 'careful' : 'ok'">
+ {{ container.status }}
+ </div>
+ <div class="table-cell">
+ {{ container.uptime }}
+ </div>
+ <div class="table-cell">
+ {{ $filters.number(container.cpu_percent, 1) }}
+ </div>
+ <div class="table-cell">
+ {{ $filters.bytes(container.memory_usage) }}
+ </div>
+ <div class="table-cell">
+ {{ $filters.bytes(container.limit) }}
+ </div>
+ <div class="table-cell">
+ {{ $filters.bits(container.ior / container.io_time_since_update) }}
+ </div>
+ <div class="table-cell">
+ {{ $filters.bits(container.iow / container.io_time_since_update) }}
+ </div>
+ <div class="table-cell">
+ {{ $filters.bits(container.rx / container.net_time_since_update) }}
+ </div>
+ <div class="table-cell">
+ {{ $filters.bits(container.tx / container.net_time_since_update) }}
+ </div>
+ <div class="table-cell text-left">
+ {{ container.command }}
+ </div>
+ </div>
+ </div>
+ </section>
+</template>
+
+<script>
+import { orderBy } from 'lodash';
+import { store } from '../store.js';
+
+export default {
+ props: {
+ data: {
+ type: Object
+ }
+ },
+ data() {
+ return {
+ store,
+ sorter: undefined
+ };
+ },
+ computed: {
+ args() {
+ return this.store.args || {};
+ },
+ sortProcessesKey() {
+ return this.args.sort_processes_key;
+ },
+ stats() {
+ return this.data.stats['containers'];
+ },
+ containers() {
+ const { sorter } = this;
+ const containers = (this.stats.containers || []).map((containerData) => {
+ // prettier-ignore
+ return {
+ 'id': containerData.Id,
+ 'name': containerData.name,
+ 'status': containerData.Status,
+ 'uptime': containerData.Uptime,
+ 'cpu_percent': containerData.cpu.total,
+ 'memory_usage': containerData.memory.usage != undefined ? containerData.memory.usage : '?',
+ 'limit': containerData.memory.limit != undefined ? containerData.memory.limit : '?',
+ 'ior': containerData.io.ior != undefined ? containerData.io.ior : '?',
+ 'iow': containerData.io.iow != undefined ? containerData.io.iow : '?',
+ 'io_time_since_update': containerData.io.time_since_update,
+ 'rx': containerData.network.rx != undefined ? containerData.network.rx : '?',
+ 'tx': containerData.network.tx != undefined ? containerData.network.tx : '?',
+ 'net_time_since_update': containerData.network.time_since_update,
+ 'command': containerData.Command.join(' '),
+ 'image': containerData.Image,
+ 'engine': containerData.engine,
+ 'pod_id': containerData.pod_id
+ };
+ });
+ return orderBy(
+ containers,
+ [sorter.column].reduce((retval, col) => {
+ if (col === 'memory_percent') {
+ col = ['memory_usage'];
+ }
+ return retval.concat(col);
+ }, []),
+ [sorter.isReverseColumn(sorter.column) ? 'desc' : 'asc']
+ );
+ }
+ },
+ watch: {
+ sortProcessesKey: {
+ immediate: true,
+ handler(sortProcessesKey) {
+ const sortable = ['cpu_percent', 'memory_percent', 'name'];
+ function isReverseColumn(column) {
+ return !['name'].includes(column);
+ }
+ function getColumnLabel(value) {
+ const labels = {
+ io_counters: 'disk IO',
+ cpu_percent: 'CPU consumption',
+ memory_usage: 'memory consumption',
+ cpu_times: 'uptime',
+ name: 'container name',
+ None: 'None'
+ };
+ return labels[value] || value;
+ }
+ if (!sortProcessesKey || sortable.includes(sortProcessesKey)) {
+ this.sorter = {
+ column: this.args.sort_processes_key || 'cpu_percent',
+ auto: !this.args.sort_processes_key,
+ isReverseColumn,
+ getColumnLabel
+ };
+ }
+ }
+ }
+ }
+};
+</script> \ No newline at end of file