HBASE-15742 Reduce allocation of objects in metrics (Phil Yang)

Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/f76ffb7f
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/f76ffb7f
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/f76ffb7f

Branch: refs/heads/hbase-12439
Commit: f76ffb7f38f003c4e01044eddc5e1d0d970a7efd
Parents: 082d193
Author: tedyu <yuzhih...@gmail.com>
Authored: Tue May 3 08:58:00 2016 -0700
Committer: tedyu <yuzhih...@gmail.com>
Committed: Tue May 3 08:58:00 2016 -0700

----------------------------------------------------------------------
 .../hbase/ipc/MetricsHBaseServerSourceImpl.java |   2 +-
 .../master/MetricsMasterProcSourceImpl.java     |   2 +-
 .../hbase/master/MetricsMasterSourceImpl.java   |   2 +-
 .../MetricsStochasticBalancerSourceImpl.java    |   2 +-
 .../apache/hadoop/hbase/metrics/Interns.java    | 104 +++++++++++++++++++
 .../hadoop/hbase/metrics/MetricsInfoImpl.java   |  65 ++++++++++++
 .../MetricsRegionAggregateSourceImpl.java       |   2 +-
 .../MetricsRegionServerSourceImpl.java          |   2 +-
 .../regionserver/MetricsRegionSourceImpl.java   |   2 +-
 .../MetricsTableAggregateSourceImpl.java        |   2 +-
 .../regionserver/MetricsTableSourceImpl.java    |   2 +-
 .../metrics2/lib/DynamicMetricsRegistry.java    |   1 +
 .../hadoop/metrics2/lib/MutableHistogram.java   |  57 +++++++---
 .../metrics2/lib/MutableRangeHistogram.java     |   1 +
 14 files changed, 225 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceImpl.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceImpl.java
index c466564..c72641d 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceImpl.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceImpl.java
@@ -21,10 +21,10 @@ package org.apache.hadoop.hbase.ipc;
 
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.metrics.BaseSourceImpl;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.metrics2.MetricHistogram;
 import org.apache.hadoop.metrics2.MetricsCollector;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
-import org.apache.hadoop.metrics2.lib.Interns;
 import org.apache.hadoop.metrics2.lib.MutableFastCounter;
 
 @InterfaceAudience.Private

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSourceImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSourceImpl.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSourceImpl.java
index 0375e37..2b56ead 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSourceImpl.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterProcSourceImpl.java
@@ -20,9 +20,9 @@ package org.apache.hadoop.hbase.master;
 
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.metrics.BaseSourceImpl;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.metrics2.MetricsCollector;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
-import org.apache.hadoop.metrics2.lib.Interns;
 
 /**
  * Hadoop2 implementation of MetricsMasterSource.

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java
index ea21967..fc859e5 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java
@@ -20,9 +20,9 @@ package org.apache.hadoop.hbase.master;
 
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.metrics.BaseSourceImpl;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.metrics2.MetricsCollector;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
-import org.apache.hadoop.metrics2.lib.Interns;
 import org.apache.hadoop.metrics2.lib.MutableFastCounter;
 
 /**

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancerSourceImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancerSourceImpl.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancerSourceImpl.java
index ded0a0c..f658a27 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancerSourceImpl.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancerSourceImpl.java
@@ -23,9 +23,9 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.metrics2.MetricsCollector;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
-import org.apache.hadoop.metrics2.lib.Interns;
 
 @InterfaceAudience.Private
 public class MetricsStochasticBalancerSourceImpl extends 
MetricsBalancerSourceImpl implements

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/Interns.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/Interns.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/Interns.java
new file mode 100644
index 0000000..7905561
--- /dev/null
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/Interns.java
@@ -0,0 +1,104 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.metrics;
+
+
+
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.classification.InterfaceStability;
+import org.apache.hadoop.metrics2.MetricsInfo;
+import org.apache.hadoop.metrics2.MetricsTag;
+
+
+/**
+ * Helpers to create interned metrics info
+ */
+@InterfaceAudience.Private
+@InterfaceStability.Evolving
+public final class Interns {
+
+  private static LoadingCache<String, ConcurrentHashMap<String, MetricsInfo>> 
infoCache =
+      CacheBuilder.newBuilder().expireAfterAccess(1, TimeUnit.DAYS)
+          .build(new CacheLoader<String, ConcurrentHashMap<String, 
MetricsInfo>>() {
+            public ConcurrentHashMap<String, MetricsInfo> load(String key) {
+              return new ConcurrentHashMap<String, MetricsInfo>();
+            }
+          });
+  private static LoadingCache<MetricsInfo, ConcurrentHashMap<String, 
MetricsTag>> tagCache =
+      CacheBuilder.newBuilder().expireAfterAccess(1, TimeUnit.DAYS)
+          .build(new CacheLoader<MetricsInfo, ConcurrentHashMap<String, 
MetricsTag>>() {
+            public ConcurrentHashMap<String, MetricsTag> load(MetricsInfo key) 
{
+              return new ConcurrentHashMap<String, MetricsTag>();
+            }
+          });
+
+  private Interns(){}
+
+  /**
+   * Get a metric info object
+   *
+   * @return an interned metric info object
+   */
+  public static MetricsInfo info(String name, String description) {
+    Map<String, MetricsInfo> map = infoCache.getUnchecked(name);
+    MetricsInfo info = map.get(description);
+    if (info == null) {
+      info = new MetricsInfoImpl(name, description);
+      map.put(description, info);
+    }
+    return info;
+  }
+
+  /**
+   * Get a metrics tag
+   *
+   * @param info  of the tag
+   * @param value of the tag
+   * @return an interned metrics tag
+   */
+  public static MetricsTag tag(MetricsInfo info, String value) {
+    Map<String, MetricsTag> map = tagCache.getUnchecked(info);
+    MetricsTag tag = map.get(value);
+    if (tag == null) {
+      tag = new MetricsTag(info, value);
+      map.put(value, tag);
+    }
+    return tag;
+  }
+
+  /**
+   * Get a metrics tag
+   *
+   * @param name        of the tag
+   * @param description of the tag
+   * @param value       of the tag
+   * @return an interned metrics tag
+   */
+  public static MetricsTag tag(String name, String description, String value) {
+    return tag(info(name, description), value);
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/MetricsInfoImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/MetricsInfoImpl.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/MetricsInfoImpl.java
new file mode 100644
index 0000000..73dc459
--- /dev/null
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/metrics/MetricsInfoImpl.java
@@ -0,0 +1,65 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.metrics;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Preconditions;
+
+import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.metrics2.MetricsInfo;
+
+/**
+ * Making implementing metric info a little easier
+ */
+@InterfaceAudience.Private
+class MetricsInfoImpl implements MetricsInfo {
+  private final String name, description;
+
+  MetricsInfoImpl(String name, String description) {
+    this.name = Preconditions.checkNotNull(name, "name");
+    this.description = Preconditions.checkNotNull(description, "description");
+  }
+
+  @Override public String name() {
+    return name;
+  }
+
+  @Override public String description() {
+    return description;
+  }
+
+  @Override public boolean equals(Object obj) {
+    if (obj instanceof MetricsInfo) {
+      MetricsInfo other = (MetricsInfo) obj;
+      return Objects.equal(name, other.name()) &&
+          Objects.equal(description, other.description());
+    }
+    return false;
+  }
+
+  @Override public int hashCode() {
+    return Objects.hashCode(name, description);
+  }
+
+  @Override public String toString() {
+    return Objects.toStringHelper(this)
+        .add("name", name).add("description", description)
+        .toString();
+  }
+}

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
index 1835f6b..c269c40 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionAggregateSourceImpl.java
@@ -27,10 +27,10 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.metrics.BaseSourceImpl;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.metrics2.MetricsCollector;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
 import org.apache.hadoop.metrics2.impl.JmxCacheBuster;
-import org.apache.hadoop.metrics2.lib.Interns;
 import org.apache.hadoop.metrics2.lib.MetricsExecutorImpl;
 
 @InterfaceAudience.Private

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java
index 965fc66..b412fd1 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceImpl.java
@@ -20,10 +20,10 @@ package org.apache.hadoop.hbase.regionserver;
 
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.metrics.BaseSourceImpl;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.metrics2.MetricHistogram;
 import org.apache.hadoop.metrics2.MetricsCollector;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
-import org.apache.hadoop.metrics2.lib.Interns;
 import org.apache.hadoop.metrics2.lib.MutableFastCounter;
 
 /**

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
index 05f1126..de46ac7 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsRegionSourceImpl.java
@@ -23,10 +23,10 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.metrics2.MetricHistogram;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
 import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;
-import org.apache.hadoop.metrics2.lib.Interns;
 import org.apache.hadoop.metrics2.lib.MutableFastCounter;
 
 @InterfaceAudience.Private

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java
index fba6e72..b46a21f 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableAggregateSourceImpl.java
@@ -24,9 +24,9 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.metrics.BaseSourceImpl;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.metrics2.MetricsCollector;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
-import org.apache.hadoop.metrics2.lib.Interns;
 
 @InterfaceAudience.Private
 public class MetricsTableAggregateSourceImpl extends BaseSourceImpl

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java
index 33a807f..5d1dd79 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/hbase/regionserver/MetricsTableSourceImpl.java
@@ -24,9 +24,9 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;
 import org.apache.hadoop.metrics2.lib.DynamicMetricsRegistry;
-import org.apache.hadoop.metrics2.lib.Interns;
 
 @InterfaceAudience.Private
 public class MetricsTableSourceImpl implements MetricsTableSource {

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/DynamicMetricsRegistry.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/DynamicMetricsRegistry.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/DynamicMetricsRegistry.java
index 1f3da12..977536a 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/DynamicMetricsRegistry.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/DynamicMetricsRegistry.java
@@ -24,6 +24,7 @@ import java.util.concurrent.ConcurrentMap;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.metrics2.MetricsException;
 import org.apache.hadoop.metrics2.MetricsInfo;
 import org.apache.hadoop.metrics2.MetricsRecordBuilder;

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/MutableHistogram.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/MutableHistogram.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/MutableHistogram.java
index 5b4a294..0bc7e9c 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/MutableHistogram.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/MutableHistogram.java
@@ -20,6 +20,7 @@ package org.apache.hadoop.metrics2.lib;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.hbase.util.Counter;
 import org.apache.hadoop.hbase.util.FastLongHistogram;
 import org.apache.hadoop.metrics2.MetricHistogram;
@@ -40,6 +41,20 @@ public class MutableHistogram extends MutableMetric 
implements MetricHistogram {
   protected final String desc;
   protected final Counter counter = new Counter(0);
 
+  private boolean metricsInfoStringInited = false;
+  private String NUM_OPS_METRIC;
+  private String MIN_METRIC;
+  private String MAX_METRIC;
+  private String MEAN_METRIC;
+  private String MEDIAN_METRIC;
+  private String TWENTY_FIFTH_PERCENTILE_METRIC;
+  private String SEVENTY_FIFTH_PERCENTILE_METRIC;
+  private String NINETIETH_PERCENTILE_METRIC;
+  private String NINETY_FIFTH_PERCENTILE_METRIC;
+  private String NINETY_EIGHTH_PERCENTILE_METRIC;
+  private String NINETY_NINETH_PERCENTILE_METRIC;
+  private String NINETY_NINE_POINT_NINETH_PERCENTILE_METRIC;
+
   public MutableHistogram(MetricsInfo info) {
     this(info.name(), info.description());
   }
@@ -70,29 +85,47 @@ public class MutableHistogram extends MutableMetric 
implements MetricHistogram {
 
   protected void updateSnapshotMetrics(MetricsRecordBuilder 
metricsRecordBuilder,
                                        FastLongHistogram histo) {
-    metricsRecordBuilder.addCounter(Interns.info(name + NUM_OPS_METRIC_NAME, 
desc), counter.get());
-    metricsRecordBuilder.addGauge(Interns.info(name + MIN_METRIC_NAME, desc), 
histo.getMin());
-    metricsRecordBuilder.addGauge(Interns.info(name + MAX_METRIC_NAME, desc), 
histo.getMax());
-    metricsRecordBuilder.addGauge(Interns.info(name + MEAN_METRIC_NAME, desc), 
histo.getMean());
+    if (!metricsInfoStringInited) {
+      NUM_OPS_METRIC = name + NUM_OPS_METRIC_NAME;
+      MIN_METRIC = name + MIN_METRIC_NAME;
+      MAX_METRIC = name + MAX_METRIC_NAME;
+      MEAN_METRIC = name + MEAN_METRIC_NAME;
+      MEDIAN_METRIC = name + MEDIAN_METRIC_NAME;
+      TWENTY_FIFTH_PERCENTILE_METRIC = name + 
TWENTY_FIFTH_PERCENTILE_METRIC_NAME;
+      SEVENTY_FIFTH_PERCENTILE_METRIC = name + 
SEVENTY_FIFTH_PERCENTILE_METRIC_NAME;
+      NINETIETH_PERCENTILE_METRIC = name + NINETIETH_PERCENTILE_METRIC_NAME;
+      NINETY_FIFTH_PERCENTILE_METRIC = name + 
NINETY_FIFTH_PERCENTILE_METRIC_NAME;
+      NINETY_EIGHTH_PERCENTILE_METRIC = name + 
NINETY_EIGHTH_PERCENTILE_METRIC_NAME;
+      NINETY_NINETH_PERCENTILE_METRIC = name + 
NINETY_NINETH_PERCENTILE_METRIC_NAME;
+      NINETY_NINE_POINT_NINETH_PERCENTILE_METRIC = name +
+          NINETY_NINE_POINT_NINETH_PERCENTILE_METRIC_NAME;
+
+      metricsInfoStringInited = true;
+    }
+
+    metricsRecordBuilder.addCounter(Interns.info(NUM_OPS_METRIC, desc), 
counter.get());
+    metricsRecordBuilder.addGauge(Interns.info(MIN_METRIC, desc), 
histo.getMin());
+    metricsRecordBuilder.addGauge(Interns.info(MAX_METRIC, desc), 
histo.getMax());
+    metricsRecordBuilder.addGauge(Interns.info(MEAN_METRIC, desc), 
histo.getMean());
 
     long[] percentiles = histo.getQuantiles();
 
-    metricsRecordBuilder.addGauge(Interns.info(name + 
TWENTY_FIFTH_PERCENTILE_METRIC_NAME, desc),
+    metricsRecordBuilder.addGauge(Interns.info(TWENTY_FIFTH_PERCENTILE_METRIC, 
desc),
         percentiles[0]);
-    metricsRecordBuilder.addGauge(Interns.info(name + MEDIAN_METRIC_NAME, 
desc),
+    metricsRecordBuilder.addGauge(Interns.info(MEDIAN_METRIC, desc),
         percentiles[1]);
-    metricsRecordBuilder.addGauge(Interns.info(name + 
SEVENTY_FIFTH_PERCENTILE_METRIC_NAME, desc),
+    
metricsRecordBuilder.addGauge(Interns.info(SEVENTY_FIFTH_PERCENTILE_METRIC, 
desc),
         percentiles[2]);
-    metricsRecordBuilder.addGauge(Interns.info(name + 
NINETIETH_PERCENTILE_METRIC_NAME, desc),
+    metricsRecordBuilder.addGauge(Interns.info(NINETIETH_PERCENTILE_METRIC, 
desc),
         percentiles[3]);
-    metricsRecordBuilder.addGauge(Interns.info(name + 
NINETY_FIFTH_PERCENTILE_METRIC_NAME, desc),
+    metricsRecordBuilder.addGauge(Interns.info(NINETY_FIFTH_PERCENTILE_METRIC, 
desc),
         percentiles[4]);
-    metricsRecordBuilder.addGauge(Interns.info(name + 
NINETY_EIGHTH_PERCENTILE_METRIC_NAME, desc),
+    
metricsRecordBuilder.addGauge(Interns.info(NINETY_EIGHTH_PERCENTILE_METRIC, 
desc),
         percentiles[5]);
-    metricsRecordBuilder.addGauge(Interns.info(name + 
NINETY_NINETH_PERCENTILE_METRIC_NAME, desc),
+    
metricsRecordBuilder.addGauge(Interns.info(NINETY_NINETH_PERCENTILE_METRIC, 
desc),
         percentiles[6]);
     metricsRecordBuilder.addGauge(
-        Interns.info(name + NINETY_NINE_POINT_NINETH_PERCENTILE_METRIC_NAME, 
desc),
+        Interns.info(NINETY_NINE_POINT_NINETH_PERCENTILE_METRIC, desc),
         percentiles[7]);
   }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/f76ffb7f/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/MutableRangeHistogram.java
----------------------------------------------------------------------
diff --git 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/MutableRangeHistogram.java
 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/MutableRangeHistogram.java
index 13187af..94bcdaa 100644
--- 
a/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/MutableRangeHistogram.java
+++ 
b/hbase-hadoop2-compat/src/main/java/org/apache/hadoop/metrics2/lib/MutableRangeHistogram.java
@@ -19,6 +19,7 @@
 package org.apache.hadoop.metrics2.lib;
 
 import org.apache.hadoop.hbase.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.metrics.Interns;
 import org.apache.hadoop.hbase.util.FastLongHistogram;
 import org.apache.hadoop.metrics2.MetricHistogram;
 import org.apache.hadoop.metrics2.MetricsInfo;

Reply via email to