diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java index 987ab7be93d6e390dce5d2199cbd8db647cef931..45f7523c8f1812bba66f2777e8fb110453c8b305 100644 --- a/router/java/src/net/i2p/router/StatisticsManager.java +++ b/router/java/src/net/i2p/router/StatisticsManager.java @@ -111,6 +111,7 @@ public class StatisticsManager implements Service { includeRate("netDb.successPeers", stats, new long[] { 60*60*1000 }); includeRate("transport.receiveMessageSize", stats, new long[] { 5*60*1000, 60*60*1000 }); includeRate("transport.sendMessageSize", stats, new long[] { 5*60*1000, 60*60*1000 }); + includeRate("client.sendAckTime", stats, new long[] { 60*60*1000, 24*60*60*1000l }, true); stats.setProperty("stat_uptime", DataHelper.formatDuration(_context.router().getUptime())); stats.setProperty("stat__rateKey", "avg;maxAvg;pctLifetime;[sat;satLim;maxSat;maxSatLim;][num;lifetimeFreq;maxFreq]"); _log.debug("Publishing peer rankings"); @@ -127,6 +128,15 @@ public class StatisticsManager implements Service { includeRate(rateName, stats, null); } private void includeRate(String rateName, Properties stats, long selectedPeriods[]) { + includeRate(rateName, stats, selectedPeriods, false); + } + /** + * @param fudgeQuantity the data being published in this stat is too sensitive to, uh + * publish, so we're kludge the quantity (allowing the fairly safe + * publication of the average values + */ + private void includeRate(String rateName, Properties stats, long selectedPeriods[], + boolean fudgeQuantity) { RateStat rate = _context.statManager().getRate(rateName); if (rate == null) return; long periods[] = rate.getPeriods(); @@ -144,11 +154,11 @@ public class StatisticsManager implements Service { Rate curRate = rate.getRate(periods[i]); if (curRate == null) continue; - stats.setProperty("stat_" + rateName + '.' + getPeriod(curRate), renderRate(curRate)); + stats.setProperty("stat_" + rateName + '.' + getPeriod(curRate), renderRate(curRate, fudgeQuantity)); } } - private static String renderRate(Rate rate) { + private static String renderRate(Rate rate, boolean fudgeQuantity) { StringBuffer buf = new StringBuffer(255); buf.append(num(rate.getAverageValue())).append(';'); buf.append(num(rate.getExtremeAverageValue())).append(';'); @@ -159,13 +169,21 @@ public class StatisticsManager implements Service { buf.append(pct(rate.getExtremeEventSaturation())).append(';'); buf.append(num(rate.getExtremeSaturationLimit())).append(';'); } - buf.append(num(rate.getLastEventCount())).append(';'); long numPeriods = rate.getLifetimePeriods(); - if (numPeriods > 0) { - double avgFrequency = rate.getLifetimeEventCount() / (double)numPeriods; - double peakFrequency = rate.getExtremeEventCount(); - buf.append(num(avgFrequency)).append(';'); - buf.append(num(rate.getExtremeEventCount())).append(';'); + if (fudgeQuantity) { + buf.append("666").append(';'); + if (numPeriods > 0) { + buf.append("666").append(';'); + buf.append("666").append(';'); + } + } else { + buf.append(num(rate.getLastEventCount())).append(';'); + if (numPeriods > 0) { + double avgFrequency = rate.getLifetimeEventCount() / (double)numPeriods; + double peakFrequency = rate.getExtremeEventCount(); + buf.append(num(avgFrequency)).append(';'); + buf.append(num(rate.getExtremeEventCount())).append(';'); + } } return buf.toString(); } diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageJob.java b/router/java/src/net/i2p/router/message/OutboundClientMessageJob.java index 378833ee761fd5d1fd7ca6db21cbb7d5148e766e..7cf1bdd8f695984f6b730dd18e5ff7dc899bb9ec 100644 --- a/router/java/src/net/i2p/router/message/OutboundClientMessageJob.java +++ b/router/java/src/net/i2p/router/message/OutboundClientMessageJob.java @@ -87,6 +87,7 @@ public class OutboundClientMessageJob extends JobImpl { ctx.statManager().createFrequencyStat("client.sendMessageFailFrequency", "How often does a client fail to send a message?", "Client Messages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); ctx.statManager().createRateStat("client.sendMessageSize", "How large are messages sent by the client?", "Client Messages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); ctx.statManager().createRateStat("client.sendAttemptAverage", "How many different tunnels do we have to try when sending a client message?", "Client Messages", new long[] { 60*1000l, 60*60*1000l, 24*60*60*1000l }); + ctx.statManager().createRateStat("client.sendAckTime", "How long does it take to get an ACK back from a message?", "Client Messages", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l }); long timeoutMs = OVERALL_TIMEOUT_MS_DEFAULT; @@ -606,6 +607,7 @@ public class OutboundClientMessageJob extends JobImpl { _context.clientManager().messageDeliveryStatusUpdate(_status.getFrom(), msgId, true); _lease.setNumSuccess(_lease.getNumSuccess()+1); + _context.statManager().addRateData("client.sendAckTime", sendTime, 0); _context.statManager().addRateData("client.sendMessageSize", _status.getMessage().getPayload().getSize(), sendTime); _context.statManager().addRateData("client.sendAttemptAverage", _status.getNumSent(), sendTime); }