Index: src/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java =================================================================== --- src/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java (revision 899858) +++ src/java/org/apache/hadoop/hbase/regionserver/metrics/RegionServerMetrics.java (working copy) @@ -169,13 +169,26 @@ this.blockCacheFree.pushMetric(this.metricsRecord); this.blockCacheCount.pushMetric(this.metricsRecord); this.blockCacheHitRatio.pushMetric(this.metricsRecord); + + // Mix in HFile and HLog metrics + // Be careful. Here is code for MTVR from up in hadoop: + // public synchronized void inc(final int numOps, final long time) { + // currentData.numOperations += numOps; + // currentData.time += time; + // long timePerOps = time/numOps; + // minMax.update(timePerOps); + // } + // Means you can't pass a numOps of zero or get a ArithmeticException / by zero. + int ops = (int)HFile.getReadOps(); + if (ops != 0) this.fsReadLatency.inc(ops, HFile.getReadTime()); + ops = (int)HFile.getWriteOps(); + if (ops != 0) this.fsWriteLatency.inc(ops, HFile.getWriteTime()); + // mix in HLog metrics + ops = (int)HLog.getWriteOps(); + if (ops != 0) this.fsWriteLatency.inc(ops, HLog.getWriteTime()); + ops = (int)HLog.getSyncOps(); + if (ops != 0) this.fsSyncLatency.inc(ops, HLog.getSyncTime()); - // mix in HFile metrics - this.fsReadLatency.inc((int)HFile.getReadOps(), HFile.getReadTime()); - this.fsWriteLatency.inc((int)HFile.getWriteOps(), HFile.getWriteTime()); - // mix in HLog metrics - this.fsWriteLatency.inc((int)HLog.getWriteOps(), HLog.getWriteTime()); - this.fsSyncLatency.inc((int)HLog.getSyncOps(), HLog.getSyncTime()); // push the result this.fsReadLatency.pushMetric(this.metricsRecord); this.fsWriteLatency.pushMetric(this.metricsRecord); @@ -250,4 +263,4 @@ Long.valueOf(this.fsSyncLatency.getPreviousIntervalAverageTime())); return sb.toString(); } -} \ No newline at end of file +} Index: src/java/org/apache/hadoop/hbase/metrics/MetricsMBeanBase.java =================================================================== --- src/java/org/apache/hadoop/hbase/metrics/MetricsMBeanBase.java (revision 899858) +++ src/java/org/apache/hadoop/hbase/metrics/MetricsMBeanBase.java (working copy) @@ -20,7 +20,6 @@ package org.apache.hadoop.hbase.metrics; import java.util.ArrayList; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -59,12 +58,27 @@ protected MBeanInfo extendedInfo; protected MetricsMBeanBase( MetricsRegistry mr, String description ) { - super(mr, description); + super(copyMinusHBaseMetrics(mr), description); this.registry = mr; this.description = description; this.init(); } + /* + * @param mr MetricsRegistry. + * @return A copy of the passed MetricsRegistry minus the hbase metrics + */ + private static MetricsRegistry copyMinusHBaseMetrics(final MetricsRegistry mr) { + MetricsRegistry copy = new MetricsRegistry(); + for (MetricsBase metric : mr.getMetricsList()) { + if (metric instanceof org.apache.hadoop.hbase.metrics.MetricsRate) { + continue; + } + copy.add(metric.getName(), metric); + } + return copy; + } + protected void init() { List attributes = new ArrayList(); MBeanInfo parentInfo = super.getMBeanInfo(); @@ -81,13 +95,12 @@ continue; // add on custom HBase metric types - if (metric instanceof MetricsRate) { + if (metric instanceof org.apache.hadoop.hbase.metrics.MetricsRate) { attributes.add( new MBeanAttributeInfo(metric.getName(), "java.lang.Float", metric.getDescription(), true, false, false) ); extendedAttributes.put(metric.getName(), metric); - } else { - LOG.error("unknown metrics instance: "+metric.getClass().getName()); - } + } + // else, its probably a hadoop metric already registered. Skip it. } this.extendedInfo = new MBeanInfo( this.getClass().getName(),