You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dw...@apache.org on 2021/03/10 10:07:02 UTC

[lucene] 15/17: SOLR-15019: Renaming, iterators and other fixes from review.

This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr-15019
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit 95b1b118a6dcac14d37187e055f2b1b684fe3939
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Thu Dec 24 09:48:21 2020 +0100

    SOLR-15019: Renaming, iterators and other fixes from review.
---
 .../solr/cluster/placement/AttributeFetcher.java   |  6 +--
 .../solr/cluster/placement/AttributeValues.java    |  2 +-
 .../solr/cluster/placement/CollectionMetrics.java  |  2 +
 .../{MetricAttribute.java => Metric.java}          | 15 +------
 .../apache/solr/cluster/placement/NodeMetric.java  | 11 +++--
 .../solr/cluster/placement/ReplicaMetric.java      |  2 +-
 .../solr/cluster/placement/ReplicaMetrics.java     |  4 ++
 .../solr/cluster/placement/ShardMetrics.java       |  3 ++
 .../placement/impl/AttributeFetcherImpl.java       | 12 +++---
 .../placement/impl/CollectionMetricsBuilder.java   | 50 +++++++++++++++++++---
 .../{MetricAttributeImpl.java => MetricImpl.java}  | 20 ++++-----
 .../cluster/placement/impl/NodeMetricImpl.java     |  4 +-
 .../cluster/placement/impl/ReplicaMetricImpl.java  |  2 +-
 .../apache/solr/cluster/placement/Builders.java    |  4 +-
 14 files changed, 88 insertions(+), 49 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/AttributeFetcher.java b/solr/core/src/java/org/apache/solr/cluster/placement/AttributeFetcher.java
index 14051d7..5502c47 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/AttributeFetcher.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/AttributeFetcher.java
@@ -61,10 +61,10 @@ public interface AttributeFetcher {
   AttributeFetcher fetchFrom(Set<Node> nodes);
 
   /**
-   * Fetches all requested node attributes from all nodes passed to {@link #fetchFrom(Set)} as well as non node attributes
-   * (those requested for example using {@link #requestNodeMetric(NodeMetric)}.
+   * Fetches all requested node attributes from all nodes passed to {@link #fetchFrom(Set)} as well as non-node attributes
+   * (those requested using e.g. {@link #requestCollectionMetrics(SolrCollection, Set)}.
    *
-   * @return An instance allowing retrieval of all attributed that could be fetched.
+   * @return An instance allowing retrieval of all attributes that could be fetched.
    */
   AttributeValues fetchAttributes();
 }
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/AttributeValues.java b/solr/core/src/java/org/apache/solr/cluster/placement/AttributeValues.java
index 43e51e5..b0e7e45 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/AttributeValues.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/AttributeValues.java
@@ -33,7 +33,7 @@ public interface AttributeValues {
   Optional<String> getEnvironmentVariable(Node node, String name);
 
   /**
-   * For the given node: metric of specific name and registry
+   * For the given node: metric identified by an instance of {@link NodeMetric}
    */
   <T> Optional<T> getNodeMetric(Node node, NodeMetric<T> metric);
 
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/CollectionMetrics.java b/solr/core/src/java/org/apache/solr/cluster/placement/CollectionMetrics.java
index 5093745..3d20516 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/CollectionMetrics.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/CollectionMetrics.java
@@ -17,6 +17,7 @@
 
 package org.apache.solr.cluster.placement;
 
+import java.util.Iterator;
 import java.util.Optional;
 
 /**
@@ -27,4 +28,5 @@ import java.util.Optional;
 public interface CollectionMetrics {
 
   Optional<ShardMetrics> getShardMetrics(String shardName);
+  Iterator<ShardMetrics> iterator();
 }
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/MetricAttribute.java b/solr/core/src/java/org/apache/solr/cluster/placement/Metric.java
similarity index 79%
rename from solr/core/src/java/org/apache/solr/cluster/placement/MetricAttribute.java
rename to solr/core/src/java/org/apache/solr/cluster/placement/Metric.java
index c587b9e..a29abde 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/MetricAttribute.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/Metric.java
@@ -16,14 +16,12 @@
  */
 package org.apache.solr.cluster.placement;
 
-import java.util.function.Function;
-
 /**
  * Metric-related attribute of a node or replica. It defines a short symbolic name of the metric, the corresponding
  * internal metric name and the desired format/unit conversion. Generic type
  * defines the type of converted values of this attribute.
  */
-public interface MetricAttribute<T> {
+public interface Metric<T> {
 
   /**
    * Return the short-hand name that identifies this attribute.
@@ -36,18 +34,9 @@ public interface MetricAttribute<T> {
   String getInternalName();
 
   /**
-   * Conversion function to convert formats/units of raw values.
-   */
-  Function<Object, T> getConverter();
-
-  /**
    * Convert raw value. This may involve changing value type or units.
-   * Default implementation simply applies the converter function
-   * returned by {@link #getConverter()}.
    * @param value raw value
    * @return converted value
    */
-  default T convert(Object value) {
-    return getConverter().apply(value);
-  }
+  T convert(Object value);
 }
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/NodeMetric.java b/solr/core/src/java/org/apache/solr/cluster/placement/NodeMetric.java
index fba5aed..f9eb65c 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/NodeMetric.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/NodeMetric.java
@@ -20,10 +20,8 @@ package org.apache.solr.cluster.placement;
 /**
  * Node metric identifier, corresponding
  * to a node-level metric registry and the internal metric name.
- * Alternatively this identified may use a fully-qualified metric key,
- * in which case the registry is set to null.
  */
-public interface NodeMetric<T> extends MetricAttribute<T> {
+public interface NodeMetric<T> extends Metric<T> {
 
   /**
    * Metric registry. If this metric identifier uses a fully-qualified
@@ -46,6 +44,11 @@ public interface NodeMetric<T> extends MetricAttribute<T> {
     /**
      * corresponds to solr.jetty
      */
-    SOLR_JETTY
+    SOLR_JETTY,
+    /**
+     * In case when the registry name is not relevant (eg. a fully-qualified
+     * metric key was provided as the metric name).
+     */
+    UNSPECIFIED
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/ReplicaMetric.java b/solr/core/src/java/org/apache/solr/cluster/placement/ReplicaMetric.java
index 368c313..9e70d53 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/ReplicaMetric.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/ReplicaMetric.java
@@ -20,5 +20,5 @@ package org.apache.solr.cluster.placement;
  * Replica metric identifier, corresponding to one of the
  * internal replica-level metric names (as reported in <code>solr.core.[collection].[replica]</code> registry)
  */
-public interface ReplicaMetric<T> extends MetricAttribute<T> {
+public interface ReplicaMetric<T> extends Metric<T> {
 }
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/ReplicaMetrics.java b/solr/core/src/java/org/apache/solr/cluster/placement/ReplicaMetrics.java
index f5783e8..4c061c8 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/ReplicaMetrics.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/ReplicaMetrics.java
@@ -17,6 +17,8 @@
 
 package org.apache.solr.cluster.placement;
 
+import java.util.Iterator;
+import java.util.Map;
 import java.util.Optional;
 
 /**
@@ -24,5 +26,7 @@ import java.util.Optional;
  */
 public interface ReplicaMetrics {
 
+  String getReplicaName();
   <T> Optional<T> getReplicaMetric(ReplicaMetric<T> metric);
+  Iterator<Map.Entry<ReplicaMetric<?>, Object>> iterator();
 }
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/ShardMetrics.java b/solr/core/src/java/org/apache/solr/cluster/placement/ShardMetrics.java
index 79d5966..9fe0360 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/ShardMetrics.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/ShardMetrics.java
@@ -16,6 +16,7 @@
  */
 package org.apache.solr.cluster.placement;
 
+import java.util.Iterator;
 import java.util.Optional;
 
 /**
@@ -24,6 +25,8 @@ import java.util.Optional;
  * primitive shard-level metrics.
  */
 public interface ShardMetrics {
+  String getShardName();
   Optional<ReplicaMetrics> getLeaderMetrics();
   Optional<ReplicaMetrics> getReplicaMetrics(String replicaName);
+  Iterator<ReplicaMetrics> iterator();
 }
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/AttributeFetcherImpl.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/AttributeFetcherImpl.java
index b4bb971..e3a7a3f 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/AttributeFetcherImpl.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/AttributeFetcherImpl.java
@@ -94,7 +94,6 @@ public class AttributeFetcherImpl implements AttributeFetcher {
 
   @Override
   public AttributeValues fetchAttributes() {
-    // TODO Code here only supports node related attributes for now
 
     // Maps in which attribute values will be added
     Map<String, Map<Node, String>> systemSnitchToNodeToValue = new HashMap<>();
@@ -132,6 +131,8 @@ public class AttributeFetcherImpl implements AttributeFetcher {
     });
 
     // Now that we know everything we need to fetch (and where to put it), just do it.
+    // TODO: we could probably fetch this in parallel - for large clusters this could
+    // significantly shorten the execution time
     for (Node node : nodes) {
       Map<String, Object> tagValues = cloudManager.getNodeStateProvider().getNodeValues(node.getName(), allSnitchTagsToInsertion.keySet());
       for (Map.Entry<String, Object> e : tagValues.entrySet()) {
@@ -159,19 +160,16 @@ public class AttributeFetcherImpl implements AttributeFetcher {
             entry.getValue().forEach((shardName, replicas) -> {
               CollectionMetricsBuilder.ShardMetricsBuilder shardMetricsBuilder =
                   collectionMetricsBuilder.getShardMetricsBuilders()
-                  .computeIfAbsent(shardName, s -> new CollectionMetricsBuilder.ShardMetricsBuilder());
+                  .computeIfAbsent(shardName, s -> new CollectionMetricsBuilder.ShardMetricsBuilder(s));
               replicas.forEach(replica -> {
                 CollectionMetricsBuilder.ReplicaMetricsBuilder replicaMetricsBuilder =
                     shardMetricsBuilder.getReplicaMetricsBuilders()
-                    .computeIfAbsent(replica.getName(), n -> new CollectionMetricsBuilder.ReplicaMetricsBuilder());
+                    .computeIfAbsent(replica.getName(), n -> new CollectionMetricsBuilder.ReplicaMetricsBuilder(n));
                 replicaMetricsBuilder.setLeader(replica.isLeader());
                 if (replica.isLeader()) {
                   shardMetricsBuilder.setLeaderMetrics(replicaMetricsBuilder);
                 }
                 Set<ReplicaMetric<?>> requestedMetrics = requestedCollectionNamesMetrics.get(replica.getCollection());
-                if (requestedMetrics == null) {
-                  throw new RuntimeException("impossible error");
-                }
                 requestedMetrics.forEach(metric -> {
                   replicaMetricsBuilder.addMetric(metric, replica.get(metric.getInternalName()));
                 });
@@ -202,7 +200,7 @@ public class AttributeFetcherImpl implements AttributeFetcher {
   }
 
   public static String getMetricSnitchTag(NodeMetric<?> metric) {
-    if (metric.getRegistry() != null) {
+    if (metric.getRegistry() != NodeMetric.Registry.UNSPECIFIED) {
       // regular registry + metricName
       return SolrClientNodeStateProvider.METRICS_PREFIX +
           SolrMetricManager.getRegistryName(getGroupFromMetricRegistry(metric.getRegistry())) + ":" + metric.getInternalName();
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/CollectionMetricsBuilder.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/CollectionMetricsBuilder.java
index 0f88feb..2aeec59 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/CollectionMetricsBuilder.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/CollectionMetricsBuilder.java
@@ -22,6 +22,7 @@ import org.apache.solr.cluster.placement.ReplicaMetrics;
 import org.apache.solr.cluster.placement.ShardMetrics;
 
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Optional;
 
@@ -40,19 +41,37 @@ public class CollectionMetricsBuilder {
   public CollectionMetrics build() {
     final Map<String, ShardMetrics> metricsMap = new HashMap<>();
     shardMetricsBuilders.forEach((shard, builder) -> metricsMap.put(shard, builder.build()));
-    return shardName -> Optional.ofNullable(metricsMap.get(shardName));
+    return new CollectionMetrics() {
+      @Override
+      public Optional<ShardMetrics> getShardMetrics(String shardName) {
+        return Optional.ofNullable(metricsMap.get(shardName));
+      }
+
+      @Override
+      public Iterator<ShardMetrics> iterator() {
+        return metricsMap.values().iterator();
+      }
+    };
   }
 
   public static class ShardMetricsBuilder {
     final Map<String, ReplicaMetricsBuilder> replicaMetricsBuilders = new HashMap<>();
+    final String shardName;
     ReplicaMetricsBuilder leaderMetricsBuilder;
 
+    public ShardMetricsBuilder(String shardName) {
+      this.shardName = shardName;
+    }
+
     public Map<String, ReplicaMetricsBuilder> getReplicaMetricsBuilders() {
       return replicaMetricsBuilders;
     }
 
     public ShardMetricsBuilder setLeaderMetrics(ReplicaMetricsBuilder replicaMetricsBuilder) {
       leaderMetricsBuilder = replicaMetricsBuilder;
+      if (leaderMetricsBuilder != null) {
+        replicaMetricsBuilders.put(leaderMetricsBuilder.replicaName, leaderMetricsBuilder);
+      }
       return this;
     }
 
@@ -61,19 +80,20 @@ public class CollectionMetricsBuilder {
       replicaMetricsBuilders.forEach((name, replicaBuilder) -> {
         ReplicaMetrics metrics = replicaBuilder.build();
         metricsMap.put(name, metrics);
-        // skip leader from map
         if (replicaBuilder.leader) {
           if (leaderMetricsBuilder == null) {
             leaderMetricsBuilder = replicaBuilder;
           }
-          if (replicaBuilder != leaderMetricsBuilder) {
-            throw new RuntimeException("inconsistent data for leader metrics: found " + replicaBuilder + " but expected " + leaderMetricsBuilder);
-          }
         }
       });
       final ReplicaMetrics finalLeaderMetrics = leaderMetricsBuilder != null ? leaderMetricsBuilder.build() : null;
       return new ShardMetrics() {
         @Override
+        public String getShardName() {
+          return shardName;
+        }
+
+        @Override
         public Optional<ReplicaMetrics> getLeaderMetrics() {
           return Optional.ofNullable(finalLeaderMetrics);
         }
@@ -82,14 +102,24 @@ public class CollectionMetricsBuilder {
         public Optional<ReplicaMetrics> getReplicaMetrics(String replicaName) {
           return Optional.ofNullable(metricsMap.get(replicaName));
         }
+
+        @Override
+        public Iterator<ReplicaMetrics> iterator() {
+          return metricsMap.values().iterator();
+        }
       };
     }
   }
 
   public static class ReplicaMetricsBuilder {
     final Map<ReplicaMetric<?>, Object> metrics = new HashMap<>();
+    final String replicaName;
     boolean leader;
 
+    public ReplicaMetricsBuilder(String replicaName) {
+      this.replicaName = replicaName;
+    }
+
     public ReplicaMetricsBuilder setLeader(boolean leader) {
       this.leader = leader;
       return this;
@@ -111,10 +141,20 @@ public class CollectionMetricsBuilder {
     public ReplicaMetrics build() {
       return new ReplicaMetrics() {
         @Override
+        public String getReplicaName() {
+          return replicaName;
+        }
+
+        @Override
         @SuppressWarnings("unchecked")
         public <T> Optional<T> getReplicaMetric(ReplicaMetric<T> metric) {
           return Optional.ofNullable((T) metrics.get(metric));
         }
+
+        @Override
+        public Iterator<Map.Entry<ReplicaMetric<?>, Object>> iterator() {
+          return metrics.entrySet().iterator();
+        }
       };
     }
   }
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricAttributeImpl.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java
similarity index 85%
rename from solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricAttributeImpl.java
rename to solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java
index 60e55f1..7b789d7 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricAttributeImpl.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/MetricImpl.java
@@ -16,15 +16,15 @@
  */
 package org.apache.solr.cluster.placement.impl;
 
-import org.apache.solr.cluster.placement.MetricAttribute;
+import org.apache.solr.cluster.placement.Metric;
 
 import java.util.Objects;
 import java.util.function.Function;
 
 /**
- * Base class for {@link MetricAttribute} implementations.
+ * Base class for {@link Metric} implementations.
  */
-public class MetricAttributeImpl<T> implements MetricAttribute<T> {
+public abstract class MetricImpl<T> implements Metric<T> {
 
   public static final double GB = 1024 * 1024 * 1024;
 
@@ -54,7 +54,7 @@ public class MetricAttributeImpl<T> implements MetricAttribute<T> {
         return null;
       }
       try {
-        sizeInBytes = Double.valueOf(String.valueOf(v)).doubleValue();
+        sizeInBytes = Double.parseDouble(String.valueOf(v));
       } catch (Exception nfe) {
         return null;
       }
@@ -73,7 +73,7 @@ public class MetricAttributeImpl<T> implements MetricAttribute<T> {
    * @param name short-hand name that identifies this attribute.
    * @param internalName internal name of a Solr metric.
    */
-  public MetricAttributeImpl(String name, String internalName) {
+  public MetricImpl(String name, String internalName) {
     this(name, internalName, null);
   }
 
@@ -84,7 +84,7 @@ public class MetricAttributeImpl<T> implements MetricAttribute<T> {
    * @param converter optional raw value converter. If null then
    *                  {@link #IDENTITY_CONVERTER} will be used.
    */
-  public MetricAttributeImpl(String name, String internalName, Function<Object, T> converter) {
+  public MetricImpl(String name, String internalName, Function<Object, T> converter) {
     Objects.requireNonNull(name);
     Objects.requireNonNull(internalName);
     this.name = name;
@@ -107,8 +107,8 @@ public class MetricAttributeImpl<T> implements MetricAttribute<T> {
   }
 
   @Override
-  public Function<Object, T> getConverter() {
-    return converter;
+  public T convert(Object value) {
+    return converter.apply(value);
   }
 
   @Override
@@ -119,8 +119,8 @@ public class MetricAttributeImpl<T> implements MetricAttribute<T> {
     if (o == null || getClass() != o.getClass()) {
       return false;
     }
-    MetricAttribute<?> that = (MetricAttribute<?>) o;
-    return name.equals(that.getName()) && internalName.equals(that.getInternalName()) && converter.equals(that.getConverter());
+    MetricImpl<?> that = (MetricImpl<?>) o;
+    return name.equals(that.getName()) && internalName.equals(that.getInternalName()) && converter.equals(that.converter);
   }
 
   @Override
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/NodeMetricImpl.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/NodeMetricImpl.java
index f98f441..8c27331 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/NodeMetricImpl.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/NodeMetricImpl.java
@@ -27,7 +27,7 @@ import java.util.function.Function;
  * Node metric identifier, corresponding
  * to a node-level metric registry and the internal metric name.
  */
-public class NodeMetricImpl<T> extends MetricAttributeImpl<T> implements NodeMetric<T> {
+public class NodeMetricImpl<T> extends MetricImpl<T> implements NodeMetric<T> {
 
   /** Total disk space in GB. */
   public static final NodeMetricImpl<Double> TOTAL_DISK_GB = new NodeMetricImpl<>("totalDisk",
@@ -67,7 +67,7 @@ public class NodeMetricImpl<T> extends MetricAttributeImpl<T> implements NodeMet
 
   public NodeMetricImpl(String key, Function<Object, T> converter) {
     super(key, key, converter);
-    this.registry = null;
+    this.registry = Registry.UNSPECIFIED;
   }
 
   public Registry getRegistry() {
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/impl/ReplicaMetricImpl.java b/solr/core/src/java/org/apache/solr/cluster/placement/impl/ReplicaMetricImpl.java
index 27afa72..f793a64 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/impl/ReplicaMetricImpl.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/impl/ReplicaMetricImpl.java
@@ -24,7 +24,7 @@ import java.util.function.Function;
  * Replica metric identifier, corresponding to one of the
  * internal replica-level metric names (as reported in <code>solr.core.[collection].[replica]</code> registry)
  */
-public class ReplicaMetricImpl<T> extends MetricAttributeImpl<T> implements ReplicaMetric<T> {
+public class ReplicaMetricImpl<T> extends MetricImpl<T> implements ReplicaMetric<T> {
 
   public static final ReplicaMetricImpl<Double> INDEX_SIZE_GB = new ReplicaMetricImpl<>("sizeGB", "INDEX.sizeInBytes", BYTES_TO_GB_CONVERTER);
 
diff --git a/solr/core/src/test/org/apache/solr/cluster/placement/Builders.java b/solr/core/src/test/org/apache/solr/cluster/placement/Builders.java
index 44807e5..21b8369 100644
--- a/solr/core/src/test/org/apache/solr/cluster/placement/Builders.java
+++ b/solr/core/src/test/org/apache/solr/cluster/placement/Builders.java
@@ -286,7 +286,7 @@ public class Builders {
       for (int shardNumber = 1; shardNumber <= countShards; shardNumber++) {
         String shardName = buildShardName(shardNumber);
 
-        CollectionMetricsBuilder.ShardMetricsBuilder shardMetricsBuilder = new CollectionMetricsBuilder.ShardMetricsBuilder();
+        CollectionMetricsBuilder.ShardMetricsBuilder shardMetricsBuilder = new CollectionMetricsBuilder.ShardMetricsBuilder(shardName);
 
         LinkedList<ReplicaBuilder> replicas = new LinkedList<>();
         ReplicaBuilder leader = null;
@@ -315,7 +315,7 @@ public class Builders {
                 .setReplicaState(Replica.ReplicaState.ACTIVE).setReplicaNode(node);
             replicas.add(replicaBuilder);
 
-            CollectionMetricsBuilder.ReplicaMetricsBuilder replicaMetricsBuilder = new CollectionMetricsBuilder.ReplicaMetricsBuilder();
+            CollectionMetricsBuilder.ReplicaMetricsBuilder replicaMetricsBuilder = new CollectionMetricsBuilder.ReplicaMetricsBuilder(replicaName);
             shardMetricsBuilder.getReplicaMetricsBuilders().put(replicaName, replicaMetricsBuilder);
             if (initialSizeGBPerShard != null) {
               replicaMetricsBuilder.addMetric(ReplicaMetricImpl.INDEX_SIZE_GB, initialSizeGBPerShard.get(shardNumber - 1) * ReplicaMetricImpl.GB);