diff --git src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java index fc1dc36..1aadfc3 100644 --- src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java +++ src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java @@ -56,10 +56,15 @@ public class MetricsRate extends MetricsBase { value++; } - private synchronized void intervalHeartBeat() { + public synchronized void intervalHeartBeat() { long now = System.currentTimeMillis(); long diff = (now-ts)/1000; - if (diff == 0) diff = 1; // sigh this is crap. + if (diff < 500){ + return; //to make sure our averages aren't skewed by fast repeated calls. + } + if (diff == 0) { + diff = 1; // sigh this is crap. + } this.prevRate = (float)value / diff; this.value = 0; this.ts = now; diff --git src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index 39c7940..15db080 100644 --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -1275,6 +1275,7 @@ public class HRegionServer implements HRegionInterface, HBaseRPCErrorHandler, protected void metrics() { this.metrics.regions.set(this.onlineRegions.size()); this.metrics.incrementRequests(this.requestCount.get()); + this.metrics.requests.intervalHeartBeat(); // Is this too expensive every three seconds getting a lock on onlineRegions // and then per store carried? Can I make metrics be sloppier and avoid // the synchronizations? diff --git src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java index cbf6da4..d512686 100644 --- src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java +++ src/main/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java @@ -116,7 +116,7 @@ public class RegionServerMetrics implements Updater { /* * Count of requests to the regionservers since last call to metrics update */ - private final MetricsRate requests = new MetricsRate("requests", registry); + public final MetricsRate requests = new MetricsRate("requests", registry); /** * Count of stores open on the regionserver.