ArrayList<TabletServerStatus> tservers = new ArrayList<TabletServerStatus>();
if (Monitor.getMmi() != null)
tservers.addAll(Monitor.getMmi().tServerInfo);
Table tServerList = new Table("tservers", "Tablet Servers");
tServerList.setSubCaption("Click on the <span style='color: #0000ff;'>server address</span> to view detailed performance statistics for that server.");
doTserverList(req, sb, tservers, tServerList);
return;
}
double totalElapsedForAll = 0;
long minorStdDev = 0;
long splitStdDev = 0;
long minorQueueStdDev = 0;
long majorStdDev = 0;
long majorQueueStdDev = 0;
double currentMajorAvg = 0;
long currentMinorAvg = 0;
long currentMajorStdDev = 0;
long currentMinorStdDev = 0;
TabletStats total = new TabletStats(null, new ActionStats(), new ActionStats(), new ActionStats(), 0, 0, 0, 0);
InetSocketAddress address = AddressUtil.parseAddress(tserverAddress, -1);
TabletStats historical = new TabletStats(null, new ActionStats(), new ActionStats(), new ActionStats(), 0, 0, 0, 0);
List<TabletStats> tsStats = new ArrayList<TabletStats>();
try {
TabletClientService.Iface client = ThriftUtil
.getClient(new TabletClientService.Client.Factory(), address, AccumuloConfiguration.getSystemConfiguration());
try {
for (String tableId : Monitor.getMmi().tableMap.keySet()) {
tsStats.addAll(client.getTabletStats(null, SecurityConstants.systemCredentials, tableId));
}
historical = client.getHistoricalStats(null, SecurityConstants.systemCredentials);
} finally {
ThriftUtil.returnClient(client);
}
} catch (Exception e) {
banner(sb, "error", "No Such Tablet ServerAvailable");
log.error(e, e);
return;
}
Table perTabletResults = new Table("perTabletResults", "Detailed Current Operations");
perTabletResults.setSubCaption("Per-tablet Details");
perTabletResults.addSortableColumn("Table", new TableLinkType(), null);
perTabletResults.addSortableColumn("Tablet");
perTabletResults.addSortableColumn("Entries", new NumberType<Long>(), null);
perTabletResults.addSortableColumn("Ingest", new NumberType<Long>(), null);
perTabletResults.addSortableColumn("Query", new NumberType<Long>(), null);
perTabletResults.addSortableColumn("Minor Avg", new NumberType<Double>(), null);
perTabletResults.addSortableColumn("Minor Std Dev", new NumberType<Double>(), null);
perTabletResults.addSortableColumn("Minor Avg e/s", new NumberType<Double>(), null);
perTabletResults.addSortableColumn("Major Avg", new NumberType<Double>(), null);
perTabletResults.addSortableColumn("Major Std Dev", new NumberType<Double>(), null);
perTabletResults.addSortableColumn("Major Avg e/s", new NumberType<Double>(), null);
for (TabletStats info : tsStats) {
if (info.extent == null) {
historical = info;
continue;
}
total.numEntries += info.numEntries;
TabletStatsKeeper.update(total.minor, info.minor);
TabletStatsKeeper.update(total.major, info.major);
KeyExtent extent = new KeyExtent(info.extent);
String tableId = extent.getTableId().toString();
MessageDigest digester = MessageDigest.getInstance("MD5");
if (extent.getEndRow() != null && extent.getEndRow().getLength() > 0) {
digester.update(extent.getEndRow().getBytes(), 0, extent.getEndRow().getLength());
}
String obscuredExtent = new String(Base64.encodeBase64(digester.digest()));
String displayExtent = String.format("<code>[%s]</code>", obscuredExtent);
TableRow row = perTabletResults.prepareRow();
row.add(tableId);
row.add(displayExtent);
row.add(info.numEntries);
row.add(info.ingestRate);
row.add(info.queryRate);
row.add(info.minor.num != 0 ? info.minor.elapsed / info.minor.num : null);
row.add(stddev(info.minor.elapsed, info.minor.num, info.minor.sumDev));
row.add(info.minor.elapsed != 0 ? info.minor.count / info.minor.elapsed : null);
row.add(info.major.num != 0 ? info.major.elapsed / info.major.num : null);
row.add(stddev(info.major.elapsed, info.major.num, info.major.sumDev));
row.add(info.major.elapsed != 0 ? info.major.count / info.major.elapsed : null);
perTabletResults.addRow(row);
}
// Calculate current averages oldServer adding in historical data
if (total.minor.num != 0)
currentMinorAvg = (long) (total.minor.elapsed / total.minor.num);
if (total.minor.elapsed != 0 && total.minor.num != 0)
currentMinorStdDev = (long) stddev(total.minor.elapsed, total.minor.num, total.minor.sumDev);
if (total.major.num != 0)
currentMajorAvg = total.major.elapsed / total.major.num;
if (total.major.elapsed != 0 && total.major.num != 0 && total.major.elapsed > total.major.num)
currentMajorStdDev = (long) stddev(total.major.elapsed, total.major.num, total.major.sumDev);
// After these += operations, these variables are now total for current
// tablets and historical tablets
TabletStatsKeeper.update(total.minor, historical.minor);
TabletStatsKeeper.update(total.major, historical.major);
totalElapsedForAll += total.major.elapsed + historical.split.elapsed + total.minor.elapsed;
minorStdDev = (long) stddev(total.minor.elapsed, total.minor.num, total.minor.sumDev);
minorQueueStdDev = (long) stddev(total.minor.queueTime, total.minor.num, total.minor.queueSumDev);
majorStdDev = (long) stddev(total.major.elapsed, total.major.num, total.major.sumDev);
majorQueueStdDev = (long) stddev(total.major.queueTime, total.major.num, total.major.queueSumDev);
splitStdDev = (long) stddev(historical.split.num, historical.split.elapsed, historical.split.sumDev);
doDetailTable(req, sb, address, tsStats.size(), total, historical);
doAllTimeTable(req, sb, total, historical, majorQueueStdDev, minorQueueStdDev, totalElapsedForAll, splitStdDev, majorStdDev, minorStdDev);
doCurrentTabletOps(req, sb, currentMinorAvg, currentMinorStdDev, currentMajorAvg, currentMajorStdDev);
perTabletResults.generate(req, sb);
}