added uncle count chart
This commit is contained in:
parent
937f14bc0a
commit
c7b71f6d5e
9
app.js
9
app.js
@ -66,6 +66,9 @@ api.on('connection', function(spark) {
|
|||||||
|
|
||||||
var blockPropagationChart = Nodes.blockPropagationChart();
|
var blockPropagationChart = Nodes.blockPropagationChart();
|
||||||
client.write({action: 'blockPropagationChart', data: blockPropagationChart});
|
client.write({action: 'blockPropagationChart', data: blockPropagationChart});
|
||||||
|
|
||||||
|
var uncleCount = Nodes.getUncleCount();
|
||||||
|
client.write({action: 'uncleCount', data: uncleCount});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -83,6 +86,9 @@ api.on('connection', function(spark) {
|
|||||||
|
|
||||||
var blockPropagationChart = Nodes.blockPropagationChart();
|
var blockPropagationChart = Nodes.blockPropagationChart();
|
||||||
client.write({action: 'blockPropagationChart', data: blockPropagationChart});
|
client.write({action: 'blockPropagationChart', data: blockPropagationChart});
|
||||||
|
|
||||||
|
var uncleCount = Nodes.getUncleCount();
|
||||||
|
client.write({action: 'uncleCount', data: uncleCount});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -124,6 +130,9 @@ client.on('connection', function(spark) {
|
|||||||
|
|
||||||
var blockPropagationChart = Nodes.blockPropagationChart();
|
var blockPropagationChart = Nodes.blockPropagationChart();
|
||||||
spark.write({action: 'blockPropagationChart', data: blockPropagationChart});
|
spark.write({action: 'blockPropagationChart', data: blockPropagationChart});
|
||||||
|
|
||||||
|
var uncleCount = Nodes.getUncleCount();
|
||||||
|
spark.write({action: 'uncleCount', data: uncleCount});
|
||||||
});
|
});
|
||||||
|
|
||||||
spark.on('client-pong', function(data) {
|
spark.on('client-pong', function(data) {
|
||||||
|
@ -103,4 +103,9 @@ Collection.prototype.blockPropagationChart = function()
|
|||||||
return this._history.getBlockPropagation();
|
return this._history.getBlockPropagation();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Collection.prototype.getUncleCount = function()
|
||||||
|
{
|
||||||
|
return this._history.getUncleCount();
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = Collection;
|
module.exports = Collection;
|
@ -1,11 +1,11 @@
|
|||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
var d3 = require('d3');
|
var d3 = require('d3');
|
||||||
|
|
||||||
var MAX_HISTORY = 1008;
|
var MAX_HISTORY = 1000;
|
||||||
var MAX_PEER_PROPAGATION = 36;
|
var MAX_PEER_PROPAGATION = 36;
|
||||||
var MAX_BLOCK_PROPAGATION = 96;
|
var MIN_PROPAGATION_RANGE = 0;
|
||||||
var MIN_PROPAGATION_RANGE = 1;
|
|
||||||
var MAX_PROPAGATION_RANGE = 20000;
|
var MAX_PROPAGATION_RANGE = 20000;
|
||||||
|
var MAX_UNCLE_BINS = 36;
|
||||||
var MAX_BINS = 40;
|
var MAX_BINS = 40;
|
||||||
|
|
||||||
var History = function History(data)
|
var History = function History(data)
|
||||||
@ -114,7 +114,6 @@ History.prototype.getNodePropagation = function(id)
|
|||||||
{
|
{
|
||||||
var index = MAX_PEER_PROPAGATION - 1 - bestBlock + n.height;
|
var index = MAX_PEER_PROPAGATION - 1 - bestBlock + n.height;
|
||||||
|
|
||||||
|
|
||||||
if(index > 0)
|
if(index > 0)
|
||||||
{
|
{
|
||||||
propagation[index] = _.result(_.find(n.propagTimes, 'node', id), 'propagation', -1);
|
propagation[index] = _.result(_.find(n.propagTimes, 'node', id), 'propagation', -1);
|
||||||
@ -141,7 +140,7 @@ History.prototype.getBlockPropagation = function()
|
|||||||
});
|
});
|
||||||
|
|
||||||
var x = d3.scale.linear()
|
var x = d3.scale.linear()
|
||||||
.domain([0, 20000])
|
.domain([MIN_PROPAGATION_RANGE, MAX_PROPAGATION_RANGE])
|
||||||
.interpolate(d3.interpolateRound);
|
.interpolate(d3.interpolateRound);
|
||||||
|
|
||||||
var data = d3.layout.histogram()
|
var data = d3.layout.histogram()
|
||||||
@ -150,13 +149,37 @@ History.prototype.getBlockPropagation = function()
|
|||||||
(propagation);
|
(propagation);
|
||||||
|
|
||||||
var freqCum = 0;
|
var freqCum = 0;
|
||||||
var histo = data.map(function(val) {
|
var histogram = data.map(function(val) {
|
||||||
freqCum += val.length;
|
freqCum += val.length;
|
||||||
var cumPercent = (freqCum / Math.max(1, propagation.length));
|
var cumPercent = (freqCum / Math.max(1, propagation.length));
|
||||||
return {x: val.x, dx: val.dx, y: val.y, frequency: val.length, cumulative: freqCum, cumpercent: cumPercent};
|
return {x: val.x, dx: val.dx, y: val.y, frequency: val.length, cumulative: freqCum, cumpercent: cumPercent};
|
||||||
});
|
});
|
||||||
|
|
||||||
return histo;
|
return histogram;
|
||||||
|
}
|
||||||
|
|
||||||
|
History.prototype.getUncleCount = function(id)
|
||||||
|
{
|
||||||
|
var uncles = _(this._items)
|
||||||
|
.sortByOrder('height', false)
|
||||||
|
.map(function(item)
|
||||||
|
{
|
||||||
|
return item.block.uncles.length;
|
||||||
|
})
|
||||||
|
.value();
|
||||||
|
|
||||||
|
console.log(uncles);
|
||||||
|
|
||||||
|
var uncleBins = _.fill(Array(MAX_UNCLE_BINS), 0);
|
||||||
|
|
||||||
|
var sumMapper = function(array, key) {
|
||||||
|
uncleBins[key] = _.sum(array);
|
||||||
|
return _.sum(array);
|
||||||
|
};
|
||||||
|
|
||||||
|
_.map(_.chunk(uncles, MAX_BINS), sumMapper);
|
||||||
|
|
||||||
|
return uncleBins;
|
||||||
}
|
}
|
||||||
|
|
||||||
History.prototype.history = function()
|
History.prototype.history = function()
|
||||||
|
@ -14,6 +14,7 @@ function StatsCtrl($scope, $filter, socket, _, toastr) {
|
|||||||
$scope.lastDifficulty = 0;
|
$scope.lastDifficulty = 0;
|
||||||
$scope.upTimeTotal = 0;
|
$scope.upTimeTotal = 0;
|
||||||
$scope.avgBlockTime = 0;
|
$scope.avgBlockTime = 0;
|
||||||
|
$scope.unclesInLast = 0;
|
||||||
$scope.bestStats = {};
|
$scope.bestStats = {};
|
||||||
|
|
||||||
$scope.lastBlocksTime = [];
|
$scope.lastBlocksTime = [];
|
||||||
@ -25,6 +26,7 @@ function StatsCtrl($scope, $filter, socket, _, toastr) {
|
|||||||
$scope.nodes = [];
|
$scope.nodes = [];
|
||||||
$scope.map = [];
|
$scope.map = [];
|
||||||
$scope.blockPropagationChart = [];
|
$scope.blockPropagationChart = [];
|
||||||
|
$scope.uncleCount = [];
|
||||||
|
|
||||||
$scope.latency = 0;
|
$scope.latency = 0;
|
||||||
|
|
||||||
@ -129,6 +131,14 @@ function StatsCtrl($scope, $filter, socket, _, toastr) {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case "uncleCount":
|
||||||
|
$scope.uncleCount = data;
|
||||||
|
$scope.unclesInLast = data[0];
|
||||||
|
|
||||||
|
jQuery('.spark-uncles').sparkline($scope.uncleCount.reverse(), {type: 'bar'});
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
case "inactive":
|
case "inactive":
|
||||||
$scope.nodes[findIndex({id: data.id})].stats = data.stats;
|
$scope.nodes[findIndex({id: data.id})].stats = data.stats;
|
||||||
toastr['error']("Node "+ $scope.nodes[findIndex({id: data.id})].info.name +" went away!", "Node connection was lost!");
|
toastr['error']("Node "+ $scope.nodes[findIndex({id: data.id})].info.name +" went away!", "Node connection was lost!");
|
||||||
|
@ -85,7 +85,7 @@ angular.module('netStatsApp.directives', []).
|
|||||||
link: function(scope, element, attrs) {
|
link: function(scope, element, attrs) {
|
||||||
var margin = {top: 0, right: 0, bottom: 0, left: 0};
|
var margin = {top: 0, right: 0, bottom: 0, left: 0};
|
||||||
var width = 280 - margin.left - margin.right,
|
var width = 280 - margin.left - margin.right,
|
||||||
height = 173 - margin.top - margin.bottom;
|
height = 50 - margin.top - margin.bottom;
|
||||||
|
|
||||||
var TICKS = 40;
|
var TICKS = 40;
|
||||||
|
|
||||||
@ -111,7 +111,7 @@ angular.module('netStatsApp.directives', []).
|
|||||||
var yAxis = d3.svg.axis()
|
var yAxis = d3.svg.axis()
|
||||||
.scale(y)
|
.scale(y)
|
||||||
.orient("left")
|
.orient("left")
|
||||||
.ticks(4)
|
.ticks(3)
|
||||||
.tickFormat(d3.format("%"));
|
.tickFormat(d3.format("%"));
|
||||||
|
|
||||||
var line = d3.svg.line()
|
var line = d3.svg.line()
|
||||||
@ -124,7 +124,7 @@ angular.module('netStatsApp.directives', []).
|
|||||||
.offset([10, 0])
|
.offset([10, 0])
|
||||||
.direction('s')
|
.direction('s')
|
||||||
.html(function(d) {
|
.html(function(d) {
|
||||||
return '<div class="tooltip-arrow"></div><div class="tooltip-inner"><b>' + (d.x/1000) + 's - ' + ((d.x + d.dx)/1000) + 's</b><div class="small">Percent: <b>' + Math.round(d.y * 100) + '%</b>' + '<br>Frequency: <b>' + d.frequency + '</b><br>Cumulative: <b>' + Math.floor(d.cumpercent*100) + '%</b></div></div>';
|
return '<div class="tooltip-arrow"></div><div class="tooltip-inner"><b>' + (d.x/1000) + 's - ' + ((d.x + d.dx)/1000) + 's</b><div class="small">Percent: <b>' + Math.round(d.y * 100) + '%</b>' + '<br>Frequency: <b>' + d.frequency + '</b><br>Cumulative: <b>' + Math.round(d.cumpercent*100) + '%</b></div></div>';
|
||||||
})
|
})
|
||||||
|
|
||||||
scope.init = function()
|
scope.init = function()
|
||||||
|
@ -71,10 +71,15 @@ block content
|
|||||||
span.big-details.spark-difficulty
|
span.big-details.spark-difficulty
|
||||||
|
|
||||||
div.col-xs-4.stat-holder.pull-right
|
div.col-xs-4.stat-holder.pull-right
|
||||||
div.big-info.chart.double-chart
|
div.big-info.chart.xdouble-chart
|
||||||
span.small-title block propagation
|
span.small-title block propagation
|
||||||
histogram.big-details.d3-blockpropagation(data="blockPropagationChart")
|
histogram.big-details.d3-blockpropagation(data="blockPropagationChart")
|
||||||
|
|
||||||
|
div.col-xs-4.stat-holder
|
||||||
|
div.big-info.chart
|
||||||
|
span.small-title uncle count
|
||||||
|
span.big-details.spark-uncles
|
||||||
|
|
||||||
div.col-xs-4.stat-holder
|
div.col-xs-4.stat-holder
|
||||||
div.big-info.chart
|
div.big-info.chart
|
||||||
span.small-title transactions
|
span.small-title transactions
|
||||||
|
Loading…
Reference in New Issue
Block a user