diff --git src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java index fc1dc36..8883251 100644 --- src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java +++ src/main/java/org/apache/hadoop/hbase/metrics/MetricsRate.java @@ -56,10 +56,12 @@ 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 < 0.5){ + return; //to make sure our averages aren't skewed by fast repeated calls, we simply ignore fast repeated calls. + } 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. diff --git src/test/java/org/apache/hadoop/hbase/metrics/TestMetricsMBeanBase.java src/test/java/org/apache/hadoop/hbase/metrics/TestMetricsMBeanBase.java index cd939cf..74a0338 100644 --- src/test/java/org/apache/hadoop/hbase/metrics/TestMetricsMBeanBase.java +++ src/test/java/org/apache/hadoop/hbase/metrics/TestMetricsMBeanBase.java @@ -70,6 +70,7 @@ public class TestMetricsMBeanBase extends TestCase { public void testGetAttribute() throws Exception { this.metricsRate.inc(2); + Thread.sleep(1000); this.metricsRate.pushMetric(this.metricsRecord); this.intValue.set(5); this.intValue.pushMetric(this.metricsRecord); @@ -78,7 +79,7 @@ public class TestMetricsMBeanBase extends TestCase { this.varyRate.pushMetric(this.metricsRecord); - assertEquals( 2.0, (Float)this.stats.getAttribute("metricsRate"), 0.001 ); + assertEquals( 2.0, (Float)this.stats.getAttribute("metricsRate"), 0.005 ); assertEquals( 5, this.stats.getAttribute("intValue") ); assertEquals( 10L, this.stats.getAttribute("varyRateMinTime") ); assertEquals( 50L, this.stats.getAttribute("varyRateMaxTime") );