onMouseOut(lockedMetric)}>
-
- METRICS
-
- {_.sortBy(availableCanvasMetrics, label).map(m => {
- const id = m.id;
- const isLocked = (id === lockedMetric);
- const isSelected = (id === selectedMetric);
- const className = classNames('sidebar-item', {
- 'locked': isLocked,
- 'selected': isSelected
- });
-
- return (
-
onMouseOver(id)}
- onClick={() => onMouseClick(id, lockedMetric)}>
- {label(m)}
- {isLocked &&
-
- }
-
- );
- })}
-
- );
-}
diff --git a/client/app/scripts/debug.js b/client/app/scripts/debug.js
new file mode 100644
index 000000000..a546827ee
--- /dev/null
+++ b/client/app/scripts/debug.js
@@ -0,0 +1,3 @@
+import Immutable from 'immutable';
+import installDevTools from 'immutable-devtools';
+installDevTools(Immutable);
diff --git a/client/app/scripts/stores/app-store.js b/client/app/scripts/stores/app-store.js
index ca61ad508..c8b7d1042 100644
--- a/client/app/scripts/stores/app-store.js
+++ b/client/app/scripts/stores/app-store.js
@@ -589,9 +589,9 @@ export class AppStore extends Store {
});
// update existing nodes
- _.each(payload.delta.update, function(node) {
+ _.each(payload.delta.update, (node) => {
if (nodes.has(node.id)) {
- nodes = nodes.set(node.id, nodes.get(node.id).merge(Immutable.fromJS(node)));
+ nodes = nodes.set(node.id, nodes.get(node.id).merge(fromJS(node)));
}
});
@@ -600,6 +600,14 @@ export class AppStore extends Store {
nodes = nodes.set(node.id, fromJS(makeNode(node)));
});
+ availableCanvasMetrics = nodes
+ .valueSeq()
+ .flatMap(n => (n.get('metrics') || makeMap()).keys())
+ .toSet()
+ .sort()
+ .toJS()
+ .map(v => ({id: v, label: v}));
+
if (emitChange) {
this.__emitChange();
}
@@ -627,15 +635,6 @@ export class AppStore extends Store {
}
topologiesLoaded = true;
- availableCanvasMetrics = nodes
- .valueSeq()
- .flatMap(n => (n.get('metrics') || makeMap()).keys())
- .toSet()
- .sort()
- .toJS()
- .map(v => {
- return {id: v, label: v};
- });
this.__emitChange();
break;
}
diff --git a/client/app/scripts/utils/data-utils.js b/client/app/scripts/utils/data-utils.js
index 8426e00b8..04d09018b 100644
--- a/client/app/scripts/utils/data-utils.js
+++ b/client/app/scripts/utils/data-utils.js
@@ -5,6 +5,7 @@ import AppStore from '../stores/app-store';
// Inspired by Lee Byron's test data generator.
+/*eslint-disable */
function bumpLayer(n, maxValue) {
function bump(a) {
const x = 1 / (0.1 + Math.random());
@@ -24,6 +25,7 @@ function bumpLayer(n, maxValue) {
const s = d3.scale.linear().domain(d3.extent(values)).range([0, maxValue]);
return values.map(s);
}
+/*eslint-enable */
const nodeData = {};
@@ -40,17 +42,56 @@ function getNextValue(keyValues, maxValue) {
}
+const METRIC_FORMATS = {
+ docker_cpu_total_usage: 'percent',
+ docker_memory_usage: 'filesize',
+ host_cpu_usage_percent: 'percent',
+ host_mem_usage_bytes: 'filesize',
+ load1: 'number',
+ load15: 'number',
+ load5: 'number',
+ open_files_count: 'integer',
+ process_cpu_usage_percent: 'percent',
+ process_memory_usage_bytes: 'filesize'
+};
+
+
+const memoryMetric = (node, name, max = 1024 * 1024 * 1024) => ({
+ samples: [{value: getNextValue([node.id, name], max)}],
+ max
+});
+
+const cpuMetric = (node, name, max = 100) => ({
+ samples: [{value: getNextValue([node.id, name], max)}],
+ max
+});
+
+const fileMetric = (node, name, max = 10000) => ({
+ samples: [{value: getNextValue([node.id, name], max)}],
+ max
+});
+
+const loadMetric = (node, name, max = 10) => ({
+ samples: [{value: getNextValue([node.id, name], max)}],
+ max
+});
+
function mergeMetrics(node) {
+ if (node.pseudo) {
+ return node;
+ }
return Object.assign({}, node, {
metrics: {
- 'process_cpu_usage_percent': {
- samples: [{value: getNextValue([node.id, 'cpu'], 100)}],
- max: 100
- },
- 'memory': {
- samples: [{value: getNextValue([node.id, 'memory'], 1024)}],
- max: 1024
- }
+ process_cpu_usage_percent: cpuMetric(node, 'process_cpu_usage_percent'),
+ process_memory_usage_bytes: memoryMetric(node, 'process_memory_usage_bytes'),
+ open_files_count: fileMetric(node, 'open_files_count'),
+ load1: loadMetric(node, 'load1'),
+ load5: loadMetric(node, 'load5'),
+ load15: loadMetric(node, 'load15'),
+ docker_cpu_total_usage: cpuMetric(node, 'docker_cpu_total_usage'),
+ docker_memory_usage: memoryMetric(node, 'docker_memory_usage'),
+ host_cpu_usage_percent: cpuMetric(node, 'host_cpu_usage_percent'),
+ host_mem_usage_bytes: memoryMetric(node, 'host_mem_usage_bytes')
}
});
}
@@ -66,9 +107,9 @@ function handleAdd(nodes) {
function handleUpdated(updatedNodes, prevNodes) {
const modifiedNodesIndex = _.zipObject((updatedNodes || []).map(n => [n.id, n]));
- return prevNodes.toIndexedSeq().toJS().map(n => {
- return Object.assign({}, mergeMetrics(n), modifiedNodesIndex[n.id]);
- });
+ return prevNodes.toIndexedSeq().toJS().map(n => (
+ Object.assign({}, mergeMetrics(n), modifiedNodesIndex[n.id])
+ ));
}
@@ -79,19 +120,6 @@ export function addMetrics(delta, prevNodes) {
});
}
-const METRIC_FORMATS = {
- docker_cpu_total_usage: 'percent',
- docker_memory_usage: 'filesize',
- host_cpu_usage_percent: 'percent',
- host_mem_usage_bytes: 'filesize',
- load1: 'number',
- load15: 'number',
- load5: 'number',
- open_files_count: 'integer',
- process_cpu_usage_percent: 'percent',
- process_memory_usage_bytes: 'filesize'
-};
-
const openFilesScale = d3.scale.log().domain([1, 100000]).range([0, 1]);
//
// loadScale(1) == 0.5; E.g. a nicely balanced system :).
@@ -123,8 +151,8 @@ export function getMetricValue(metric, size) {
{}, {format: METRIC_FORMATS[selectedMetric]}, metric.toJS());
return {
- height: height,
- value: value,
+ height,
+ value,
formattedValue: formatMetric(value, metricWithFormat, true)
};
}
diff --git a/client/app/scripts/utils/string-utils.js b/client/app/scripts/utils/string-utils.js
index 98ed1703f..f75677583 100644
--- a/client/app/scripts/utils/string-utils.js
+++ b/client/app/scripts/utils/string-utils.js
@@ -22,10 +22,11 @@ function makeFormatters(renderFn) {
},
integer(value) {
+ const intNumber = Number(value).toFixed(0);
if (value < 1100 && value >= 0) {
- return Number(value).toFixed(0);
+ return intNumber;
}
- return formatLargeValue(value);
+ return formatLargeValue(intNumber);
},
number(value) {
diff --git a/client/package.json b/client/package.json
index a32a4b084..2e00b91d7 100644
--- a/client/package.json
+++ b/client/package.json
@@ -44,6 +44,7 @@
"eslint-plugin-react": "4.2.2",
"file-loader": "0.8.5",
"http-proxy-rules": "^1.0.1",
+ "immutable-devtools": "0.0.6",
"jest-cli": "~0.9.2",
"json-loader": "0.5.4",
"less": "~2.6.1",
diff --git a/client/webpack.local.config.js b/client/webpack.local.config.js
index 51604fcc3..0decb0c70 100644
--- a/client/webpack.local.config.js
+++ b/client/webpack.local.config.js
@@ -26,7 +26,8 @@ module.exports = {
'app': [
'./app/scripts/main',
'webpack-dev-server/client?http://localhost:4041',
- 'webpack/hot/only-dev-server'
+ 'webpack/hot/only-dev-server',
+ './app/scripts/debug'
],
'contrast-app': [
'./app/scripts/contrast-main',