diff --git a/pages/containers_html.go b/pages/containers_html.go
index 037aa3f4..fc5f9811 100644
--- a/pages/containers_html.go
+++ b/pages/containers_html.go
@@ -149,6 +149,14 @@ const containersHtmlTemplate = `
{{end}}
+
{{end}}
diff --git a/pages/static/containers_js.go b/pages/static/containers_js.go
index 086c610b..a1514d4d 100644
--- a/pages/static/containers_js.go
+++ b/pages/static/containers_js.go
@@ -219,6 +219,42 @@ function drawMemoryPageFaults(elementId, containerInfo) {
drawLineChart(titles, data, elementId, "Faults");
}
+// Draw the graph for network tx/rx bytes.
+function drawNetworkBytes(elementId, machineInfo, stats) {
+ var titles = ["Time", "Tx bytes", "Rx bytes"];
+ var data = [];
+ for (var i = 1; i < stats.stats.length; i++) {
+ var cur = stats.stats[i];
+ var prev = stats.stats[i - 1];
+
+ // TODO(vmarmol): This assumes we sample every second, use the timestamps.
+ var elements = [];
+ elements.push(cur.timestamp);
+ elements.push(cur.network.tx_bytes - prev.network.tx_bytes);
+ elements.push(cur.network.rx_bytes - prev.network.rx_bytes);
+ data.push(elements);
+ }
+ drawLineChart(titles, data, elementId, "Bytes");
+}
+
+// Draw the graph for network errors
+function drawNetworkErrors(elementId, machineInfo, stats) {
+ var titles = ["Time", "Tx", "Rx"];
+ var data = [];
+ for (var i = 1; i < stats.stats.length; i++) {
+ var cur = stats.stats[i];
+ var prev = stats.stats[i - 1];
+
+ // TODO(vmarmol): This assumes we sample every second, use the timestamps.
+ var elements = [];
+ elements.push(cur.timestamp);
+ elements.push(cur.network.tx_errors - prev.network.tx_errors);
+ elements.push(cur.network.rx_errors - prev.network.rx_errors);
+ data.push(elements);
+ }
+ drawLineChart(titles, data, elementId, "Errors");
+}
+
// Expects an array of closures to call. After each execution the JS runtime is given control back before continuing.
// This function returns asynchronously
function stepExecute(steps) {
@@ -264,6 +300,14 @@ function drawCharts(machineInfo, containerInfo) {
drawMemoryPageFaults("memory-page-faults-chart", containerInfo);
});
+ // Network.
+ steps.push(function() {
+ drawNetworkBytes("network-bytes-chart", machineInfo, containerInfo);
+ });
+ steps.push(function() {
+ drawNetworkErrors("network-errors-chart", machineInfo, containerInfo);
+ });
+
stepExecute(steps);
}