Add workers tab

This commit is contained in:
Elbandi 2014-05-13 17:30:54 +02:00
parent db94351c3b
commit 257a981c7a
5 changed files with 104 additions and 12 deletions

View File

@ -73,17 +73,16 @@ module.exports = function(logger, poolConfig){
if (isValidShare){
redisCommands.push(['hincrbyfloat', coin + ':shares:roundCurrent', shareData.worker, shareData.difficulty]);
redisCommands.push(['hincrby', coin + ':stats', 'validShares', 1]);
/* Stores share diff, worker, and unique value with a score that is the timestamp. Unique value ensures it
doesn't overwrite an existing entry, and timestamp as score lets us query shares from last X minutes to
generate hashrate for each worker and pool. */
var dateNow = Date.now();
var hashrateData = [shareData.difficulty, shareData.worker, dateNow];
redisCommands.push(['zadd', coin + ':hashrate', dateNow / 1000 | 0, hashrateData.join(':')]);
}
else{
redisCommands.push(['hincrby', coin + ':stats', 'invalidShares', 1]);
}
/* Stores share diff, worker, and unique value with a score that is the timestamp. Unique value ensures it
doesn't overwrite an existing entry, and timestamp as score lets us query shares from last X minutes to
generate hashrate for each worker and pool. */
var dateNow = Date.now();
var hashrateData = [ isValidShare ? shareData.difficulty : -shareData.difficulty, shareData.worker, dateNow];
redisCommands.push(['zadd', coin + ':hashrate', dateNow / 1000 | 0, hashrateData.join(':')]);
if (isValidBlock){
redisCommands.push(['rename', coin + ':shares:roundCurrent', coin + ':shares:round' + shareData.height]);

View File

@ -182,12 +182,28 @@ module.exports = function(logger, portalConfig, poolConfigs){
coinStats.hashrates.forEach(function(ins){
var parts = ins.split(':');
var workerShares = parseFloat(parts[0]);
coinStats.shares += workerShares;
var worker = parts[1];
if (worker in coinStats.workers)
coinStats.workers[worker] += workerShares;
else
coinStats.workers[worker] = workerShares;
if (workerShares > 0) {
coinStats.shares += workerShares;
if (worker in coinStats.workers)
coinStats.workers[worker].shares += workerShares;
else
coinStats.workers[worker] = {
shares: workerShares,
invalidshares: 0,
hashrateString: null
};
}
else {
if (worker in coinStats.workers)
coinStats.workers[worker].invalidshares -= workerShares; // workerShares is negative number!
else
coinStats.workers[worker] = {
shares: 0,
invalidshares: -workerShares,
hashrateString: null
};
}
});
var shareMultiplier = Math.pow(2, 32) / algos[coinStats.algorithm].multiplier;
@ -208,6 +224,10 @@ module.exports = function(logger, portalConfig, poolConfigs){
portalStats.algos[algo].hashrate += coinStats.hashrate;
portalStats.algos[algo].workers += Object.keys(coinStats.workers).length;
for (var worker in coinStats.workers) {
coinStats.workers[worker].hashrateString = _this.getReadableHashRateString(shareMultiplier * coinStats.workers[worker].shares / portalConfig.website.stats.hashrateWindow);
}
delete coinStats.hashrates;
delete coinStats.shares;
coinStats.hashrateString = _this.getReadableHashRateString(coinStats.hashrate);

View File

@ -38,6 +38,7 @@ module.exports = function(logger){
'getting_started.html': 'getting_started',
'stats.html': 'stats',
'tbs.html': 'tbs',
'wks.html': 'wks',
'api.html': 'api',
'admin.html': 'admin',
'mining_key.html': 'mining_key'

View File

@ -51,6 +51,12 @@
Tab Stats
</a>
</li>
<li class="{{? it.selected === 'wks' }}pure-menu-selected{{?}}">
<a class="hot-swapper" href="/wks">
<i class="fa fa-cogs"></i>&nbsp;
Workers Stats
</a>
</li>
<li class="{{? it.selected === 'api' }}pure-menu-selected{{?}}">
<a class="hot-swapper" href="/api">
<i class="fa fa-code"></i>&nbsp;

66
website/pages/wks.html Normal file
View File

@ -0,0 +1,66 @@
<style>
#topCharts {
padding: 18px;
}
#topCharts > div > div > svg {
display: block;
height: 280px;
}
.chartWrapper {
border: solid 1px #c7c7c7;
border-radius: 5px;
padding: 5px;
margin-bottom: 18px;
}
.chartLabel {
font-size: 1.2em;
text-align: center;
padding: 4px;
}
.chartHolder {
}
table {
width: 100%;
}
</style>
<div id="topCharts">
{{ for(var pool in it.stats.pools) { }}
<div class="chartWrapper">
<div class="chartLabel">{{=it.stats.pools[pool].name}}</div>
<div class="chartHolder">
<table class="pure-table">
<thead>
<tr>
<th>Address</th>
<th>Shares</th>
<th>Invalid shares</th>
<th>Efficiency</th>
<th>Hashrate</th>
</tr>
</thead>
{{ for(var worker in it.stats.pools[pool].workers) { }}
{{var workerstat = it.stats.pools[pool].workers[worker];}}
<tr class="pure-table-odd">
<td>{{=worker}}</td>
<td>{{=Math.floor(workerstat.shares)}}</td>
<td>{{=Math.floor(workerstat.invalidshares)}}</td>
<td>{{? workerstat.shares > 0}} {{=Math.floor(10000 * workerstat.shares / (workerstat.shares + workerstat.invalidshares)) / 100}}% {{??}} 0% {{?}}</td>
<td>{{=workerstat.hashrateString}}</td>
</tr>
{{ } }}
</table>
</div>
</div>
{{ } }}