From 309620545c5bf1c2acb6a07caa53638214ba195b Mon Sep 17 00:00:00 2001 From: Yassir Hannoun Date: Thu, 8 Nov 2018 01:31:33 +0100 Subject: [PATCH] fix(container-stat): fix cpu/mem charts on Windows containers * Fixing the CPU and Memory charts on Windows containers * Fixing the CPU and Memory charts on Windows containers --- app/docker/models/container.js | 14 +++++++--- .../stats/containerStatsController.js | 19 +++++++++++--- app/portainer/services/chartService.js | 26 ++++++++++++------- 3 files changed, 42 insertions(+), 17 deletions(-) diff --git a/app/docker/models/container.js b/app/docker/models/container.js index ee8837498..a28e978cb 100644 --- a/app/docker/models/container.js +++ b/app/docker/models/container.js @@ -63,9 +63,17 @@ function ContainerViewModel(data) { } function ContainerStatsViewModel(data) { - this.Date = data.read; - this.MemoryUsage = data.memory_stats.usage - data.memory_stats.stats.cache; - this.MemoryCache = data.memory_stats.stats.cache; + 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; + this.isWindows = true; + } else { // Linux + this.MemoryUsage = data.memory_stats.usage - data.memory_stats.stats.cache; + this.MemoryCache = data.memory_stats.stats.cache; + } this.PreviousCPUTotalUsage = data.precpu_stats.cpu_usage.total_usage; this.PreviousCPUSystemUsage = data.precpu_stats.system_cpu_usage; this.CurrentCPUTotalUsage = data.cpu_stats.cpu_usage.total_usage; diff --git a/app/docker/views/containers/stats/containerStatsController.js b/app/docker/views/containers/stats/containerStatsController.js index d14aeaca1..5f62b09d4 100644 --- a/app/docker/views/containers/stats/containerStatsController.js +++ b/app/docker/views/containers/stats/containerStatsController.js @@ -23,21 +23,21 @@ function ($q, $scope, $transition$, $document, $interval, ContainerService, Char if (stats.Networks.length > 0) { var rx = stats.Networks[0].rx_bytes; var tx = stats.Networks[0].tx_bytes; - var label = moment(stats.Date).format('HH:mm:ss'); + var label = moment(stats.read).format('HH:mm:ss'); ChartService.UpdateNetworkChart(label, rx, tx, chart); } } function updateMemoryChart(stats, chart) { - var label = moment(stats.Date).format('HH:mm:ss'); + var label = moment(stats.read).format('HH:mm:ss'); ChartService.UpdateMemoryChart(label, stats.MemoryUsage, stats.MemoryCache, chart); } function updateCPUChart(stats, chart) { - var label = moment(stats.Date).format('HH:mm:ss'); - var value = calculateCPUPercentUnix(stats); + var label = moment(stats.read).format('HH:mm:ss'); + var value = stats.isWindows ? calculateCPUPercentWindows(stats) : calculateCPUPercentUnix(stats); ChartService.UpdateCPUChart(label, value, chart); } @@ -54,6 +54,17 @@ function ($q, $scope, $transition$, $document, $interval, ContainerService, Char return cpuPercent; } + function calculateCPUPercentWindows(stats) { + var possIntervals = stats.NumProcs * parseFloat( + moment(stats.read, 'YYYY-MM-DDTHH:mm:ss.SSSSSSSSSZ').valueOf() - moment(stats.preread, 'YYYY-MM-DDTHH:mm:ss.SSSSSSSSSZ').valueOf()); + var windowsCpuUsage = 0.0; + if(possIntervals > 0) { + windowsCpuUsage = parseFloat(stats.CurrentCPUTotalUsage - stats.PreviousCPUTotalUsage) / parseFloat(possIntervals * 100); + } + return windowsCpuUsage; + } + + $scope.changeUpdateRepeater = function() { var networkChart = $scope.networkChart; var cpuChart = $scope.cpuChart; diff --git a/app/portainer/services/chartService.js b/app/portainer/services/chartService.js index 818ed6e3d..079180ab2 100644 --- a/app/portainer/services/chartService.js +++ b/app/portainer/services/chartService.js @@ -135,6 +135,14 @@ angular.module('portainer.app') }); }; + function LimitChartItems(chart, CHART_LIMIT) { + if (chart.data.datasets[0].data.length > CHART_LIMIT) { + chart.data.labels.pop(); + chart.data.datasets[0].data.pop(); + chart.data.datasets[1].data.pop(); + } + } + function UpdateChart(label, value, chart) { chart.data.labels.push(label); chart.data.datasets[0].data.push(value); @@ -150,13 +158,15 @@ angular.module('portainer.app') service.UpdateMemoryChart = function UpdateChart(label, memoryValue, cacheValue, chart) { chart.data.labels.push(label); chart.data.datasets[0].data.push(memoryValue); - chart.data.datasets[1].data.push(cacheValue); - - if (chart.data.datasets[0].data.length > CHART_LIMIT) { - chart.data.labels.pop(); - chart.data.datasets[0].data.pop(); + + if(cacheValue) { + chart.data.datasets[1].data.push(cacheValue); + } else { // cache values are not available for Windows + chart.data.datasets.splice(1, 1); } + LimitChartItems(chart); + chart.update(0); }; service.UpdateCPUChart = UpdateChart; @@ -166,11 +176,7 @@ angular.module('portainer.app') chart.data.datasets[0].data.push(rx); chart.data.datasets[1].data.push(tx); - if (chart.data.datasets[0].data.length > CHART_LIMIT) { - chart.data.labels.pop(); - chart.data.datasets[0].data.pop(); - chart.data.datasets[1].data.pop(); - } + LimitChartItems(chart); chart.update(0); };