mirror of https://github.com/portainer/portainer
114 lines
3.1 KiB
TypeScript
114 lines
3.1 KiB
TypeScript
import { values } from 'lodash';
|
|
|
|
import { ContainerStats } from '@/react/docker/containers/queries/useContainerStats';
|
|
import { ValueOf } from '@/types';
|
|
|
|
/**
|
|
* This type is arbitrary and only defined based on what we use / observed from the API responses.
|
|
*/
|
|
export class ContainerStatsViewModel {
|
|
read: string;
|
|
|
|
preread: string;
|
|
|
|
MemoryUsage: number;
|
|
|
|
MemoryCache: number = 0;
|
|
|
|
NumProcs: number = 0;
|
|
|
|
isWindows: boolean = false;
|
|
|
|
PreviousCPUTotalUsage: number;
|
|
|
|
PreviousCPUSystemUsage: number;
|
|
|
|
CurrentCPUTotalUsage: number;
|
|
|
|
CurrentCPUSystemUsage: number;
|
|
|
|
CPUCores: number;
|
|
|
|
Networks: ValueOf<NonNullable<ContainerStats['networks']>>[];
|
|
|
|
BytesRead: number = 0;
|
|
|
|
BytesWrite: number = 0;
|
|
|
|
noIOdata: boolean = false;
|
|
|
|
constructor(data: ContainerStats) {
|
|
this.read = data.read || '';
|
|
this.preread = data.preread || '';
|
|
if (data?.memory_stats?.privateworkingset !== undefined) {
|
|
// Windows
|
|
this.MemoryUsage = data?.memory_stats?.privateworkingset;
|
|
this.MemoryCache = 0;
|
|
this.NumProcs = data.num_procs || 0;
|
|
this.isWindows = true;
|
|
}
|
|
// Linux
|
|
else if (
|
|
data?.memory_stats?.stats === undefined ||
|
|
data?.memory_stats?.usage === undefined
|
|
) {
|
|
this.MemoryUsage = 0;
|
|
this.MemoryCache = 0;
|
|
} else {
|
|
this.MemoryCache = 0;
|
|
if (data?.memory_stats?.stats?.cache !== undefined) {
|
|
// cgroups v1
|
|
this.MemoryCache = data.memory_stats.stats.cache;
|
|
}
|
|
this.MemoryUsage = data.memory_stats.usage - this.MemoryCache;
|
|
}
|
|
this.PreviousCPUTotalUsage =
|
|
data?.precpu_stats?.cpu_usage?.total_usage || 0;
|
|
this.PreviousCPUSystemUsage = data?.precpu_stats?.system_cpu_usage || 0;
|
|
this.CurrentCPUTotalUsage = data?.cpu_stats?.cpu_usage?.total_usage || 0;
|
|
this.CurrentCPUSystemUsage = data?.cpu_stats?.system_cpu_usage || 0;
|
|
this.CPUCores = 1;
|
|
|
|
this.CPUCores =
|
|
data?.cpu_stats?.cpu_usage?.percpu_usage?.length ??
|
|
data?.cpu_stats?.online_cpus ??
|
|
1;
|
|
|
|
this.Networks = values(data.networks);
|
|
|
|
if (
|
|
data.blkio_stats !== undefined &&
|
|
data.blkio_stats.io_service_bytes_recursive !== null
|
|
) {
|
|
// TODO: take care of multiple block devices
|
|
let readData = data?.blkio_stats?.io_service_bytes_recursive?.find(
|
|
(d) => d.op === 'Read'
|
|
);
|
|
if (readData === undefined) {
|
|
// try the cgroups v2 version
|
|
readData = data?.blkio_stats?.io_service_bytes_recursive?.find(
|
|
(d) => d.op === 'read'
|
|
);
|
|
}
|
|
if (readData !== undefined) {
|
|
this.BytesRead = readData.value;
|
|
}
|
|
let writeData = data?.blkio_stats?.io_service_bytes_recursive?.find(
|
|
(d) => d.op === 'Write'
|
|
);
|
|
if (writeData === undefined) {
|
|
// try the cgroups v2 version
|
|
writeData = data?.blkio_stats?.io_service_bytes_recursive?.find(
|
|
(d) => d.op === 'write'
|
|
);
|
|
}
|
|
if (writeData !== undefined) {
|
|
this.BytesWrite = writeData.value;
|
|
}
|
|
} else {
|
|
// no IO related data is available
|
|
this.noIOdata = true;
|
|
}
|
|
}
|
|
}
|