2014-04-11 16:26:45 -07:00
|
|
|
var poolWorkerData;
|
|
|
|
var poolHashrateData;
|
|
|
|
var poolBlockData;
|
2014-04-10 18:33:41 -07:00
|
|
|
|
|
|
|
var poolWorkerChart;
|
|
|
|
var poolHashrateChart;
|
|
|
|
var poolBlockChart;
|
|
|
|
|
2014-04-11 16:26:45 -07:00
|
|
|
var statData;
|
|
|
|
var poolKeys;
|
|
|
|
|
|
|
|
function buildChartData(){
|
2014-04-10 18:33:41 -07:00
|
|
|
|
|
|
|
var pools = {};
|
|
|
|
|
2014-04-11 16:26:45 -07:00
|
|
|
poolKeys = [];
|
|
|
|
for (var i = 0; i < statData.length; i++){
|
|
|
|
for (var pool in statData[i].pools){
|
|
|
|
if (poolKeys.indexOf(pool) === -1)
|
|
|
|
poolKeys.push(pool);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < statData.length; i++){
|
|
|
|
|
|
|
|
var time = statData[i].time * 1000;
|
|
|
|
|
|
|
|
for (var f = 0; f < poolKeys.length; f++){
|
|
|
|
var pName = poolKeys[f];
|
|
|
|
var a = pools[pName] = (pools[pName] || {
|
2014-04-10 18:33:41 -07:00
|
|
|
hashrate: [],
|
|
|
|
workers: [],
|
|
|
|
blocks: []
|
|
|
|
});
|
2014-04-11 16:26:45 -07:00
|
|
|
if (pName in statData[i].pools){
|
|
|
|
a.hashrate.push([time, statData[i].pools[pName].hashrate]);
|
|
|
|
a.workers.push([time, statData[i].pools[pName].workerCount]);
|
|
|
|
a.blocks.push([time, statData[i].pools[pName].blocks.pending])
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
a.hashrate.push([time, 0]);
|
|
|
|
a.workers.push([time, 0]);
|
|
|
|
a.blocks.push([time, 0])
|
|
|
|
}
|
|
|
|
|
2014-04-10 18:33:41 -07:00
|
|
|
}
|
2014-04-11 16:26:45 -07:00
|
|
|
|
2014-04-10 18:33:41 -07:00
|
|
|
}
|
|
|
|
|
2014-04-11 16:26:45 -07:00
|
|
|
poolWorkerData = [];
|
|
|
|
poolHashrateData = [];
|
|
|
|
poolBlockData = [];
|
|
|
|
|
2014-04-10 18:33:41 -07:00
|
|
|
for (var pool in pools){
|
|
|
|
poolWorkerData.push({
|
|
|
|
key: pool,
|
|
|
|
values: pools[pool].workers
|
|
|
|
});
|
|
|
|
poolHashrateData.push({
|
|
|
|
key: pool,
|
|
|
|
values: pools[pool].hashrate
|
|
|
|
});
|
|
|
|
poolBlockData.push({
|
|
|
|
key: pool,
|
|
|
|
values: pools[pool].blocks
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function getReadableHashRateString(hashrate){
|
|
|
|
var i = -1;
|
|
|
|
var byteUnits = [ ' KH', ' MH', ' GH', ' TH', ' PH' ];
|
|
|
|
do {
|
|
|
|
hashrate = hashrate / 1024;
|
|
|
|
i++;
|
|
|
|
} while (hashrate > 1024);
|
2014-04-11 16:26:45 -07:00
|
|
|
return Math.round(hashrate) + byteUnits[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
function timeOfDayFormat(timestamp){
|
|
|
|
var dStr = d3.time.format('%I:%M %p')(new Date(timestamp));
|
|
|
|
if (dStr.indexOf('0') === 0) dStr = dStr.slice(1);
|
|
|
|
return dStr;
|
2014-04-10 18:33:41 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function displayCharts(){
|
|
|
|
|
|
|
|
nv.addGraph(function() {
|
|
|
|
poolWorkerChart = nv.models.stackedAreaChart()
|
2014-04-11 16:26:45 -07:00
|
|
|
.margin({left: 40, right: 40})
|
2014-04-10 18:33:41 -07:00
|
|
|
.x(function(d){ return d[0] })
|
|
|
|
.y(function(d){ return d[1] })
|
|
|
|
.useInteractiveGuideline(true)
|
|
|
|
.clipEdge(true);
|
|
|
|
|
2014-04-11 16:26:45 -07:00
|
|
|
poolWorkerChart.xAxis.tickFormat(timeOfDayFormat);
|
2014-04-10 18:33:41 -07:00
|
|
|
|
|
|
|
poolWorkerChart.yAxis.tickFormat(d3.format('d'));
|
|
|
|
|
|
|
|
d3.select('#poolWorkers').datum(poolWorkerData).call(poolWorkerChart);
|
|
|
|
|
|
|
|
return poolWorkerChart;
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
nv.addGraph(function() {
|
|
|
|
poolHashrateChart = nv.models.lineChart()
|
2014-04-11 16:26:45 -07:00
|
|
|
.margin({left: 60, right: 40})
|
2014-04-10 18:33:41 -07:00
|
|
|
.x(function(d){ return d[0] })
|
|
|
|
.y(function(d){ return d[1] })
|
|
|
|
.useInteractiveGuideline(true);
|
|
|
|
|
2014-04-11 16:26:45 -07:00
|
|
|
poolHashrateChart.xAxis.tickFormat(timeOfDayFormat);
|
2014-04-10 18:33:41 -07:00
|
|
|
|
|
|
|
poolHashrateChart.yAxis.tickFormat(function(d){
|
|
|
|
return getReadableHashRateString(d);
|
|
|
|
});
|
|
|
|
|
|
|
|
d3.select('#poolHashrate').datum(poolHashrateData).call(poolHashrateChart);
|
|
|
|
|
|
|
|
return poolHashrateChart;
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
nv.addGraph(function() {
|
|
|
|
poolBlockChart = nv.models.multiBarChart()
|
|
|
|
.x(function(d){ return d[0] })
|
|
|
|
.y(function(d){ return d[1] });
|
|
|
|
|
2014-04-11 16:26:45 -07:00
|
|
|
poolBlockChart.xAxis.tickFormat(timeOfDayFormat);
|
2014-04-10 18:33:41 -07:00
|
|
|
|
|
|
|
d3.select('#poolBlocks').datum(poolBlockData).call(poolBlockChart);
|
|
|
|
|
|
|
|
return poolBlockChart;
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function TriggerChartUpdates(){
|
|
|
|
poolWorkerChart.update();
|
|
|
|
poolHashrateChart.update();
|
|
|
|
poolBlockChart.update();
|
|
|
|
}
|
|
|
|
|
|
|
|
nv.utils.windowResize(TriggerChartUpdates);
|
|
|
|
|
|
|
|
$.getJSON('/api/pool_stats', function(data){
|
2014-04-11 16:26:45 -07:00
|
|
|
statData = data;
|
|
|
|
buildChartData();
|
2014-04-10 18:33:41 -07:00
|
|
|
displayCharts();
|
|
|
|
});
|
|
|
|
|
|
|
|
statsSource.addEventListener('message', function(e){
|
|
|
|
var stats = JSON.parse(e.data);
|
2014-04-11 16:26:45 -07:00
|
|
|
statData.push(stats);
|
|
|
|
|
|
|
|
|
|
|
|
var newPoolAdded = (function(){
|
|
|
|
for (var p in stats.pools){
|
|
|
|
if (poolKeys.indexOf(p) === -1)
|
|
|
|
return true;
|
2014-04-10 18:33:41 -07:00
|
|
|
}
|
2014-04-11 16:26:45 -07:00
|
|
|
return false;
|
|
|
|
})();
|
|
|
|
|
|
|
|
if (newPoolAdded || Object.keys(stats.pools).length > poolKeys.length){
|
|
|
|
buildChartData();
|
|
|
|
displayCharts();
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
var time = stats.time * 1000;
|
|
|
|
for (var f = 0; f < poolKeys.length; f++) {
|
|
|
|
var pool = poolKeys[f];
|
|
|
|
for (var i = 0; i < poolWorkerData.length; i++) {
|
|
|
|
if (poolWorkerData[i].key === pool) {
|
|
|
|
poolWorkerData[i].values.shift();
|
|
|
|
poolWorkerData[i].values.push([time, pool in stats.pools ? stats.pools[pool].workerCount : 0]);
|
|
|
|
break;
|
|
|
|
}
|
2014-04-10 18:33:41 -07:00
|
|
|
}
|
2014-04-11 16:26:45 -07:00
|
|
|
for (var i = 0; i < poolHashrateData.length; i++) {
|
|
|
|
if (poolHashrateData[i].key === pool) {
|
|
|
|
poolHashrateData[i].values.shift();
|
|
|
|
poolHashrateData[i].values.push([time, pool in stats.pools ? stats.pools[pool].hashrate : 0]);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
for (var i = 0; i < poolBlockData.length; i++) {
|
|
|
|
if (poolBlockData[i].key === pool) {
|
|
|
|
poolBlockData[i].values.shift();
|
|
|
|
poolBlockData[i].values.push([time, pool in stats.pools ? stats.pools[pool].blocks.pending : 0]);
|
|
|
|
break;
|
|
|
|
}
|
2014-04-10 18:33:41 -07:00
|
|
|
}
|
|
|
|
}
|
2014-04-11 16:26:45 -07:00
|
|
|
TriggerChartUpdates();
|
2014-04-10 18:33:41 -07:00
|
|
|
}
|
|
|
|
|
2014-04-11 16:26:45 -07:00
|
|
|
|
2014-04-10 18:33:41 -07:00
|
|
|
});
|