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

nehapawar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pinot.git


The following commit(s) were added to refs/heads/master by this push:
     new 2e32ec2577 Add metric for replication count from config (#8761)
2e32ec2577 is described below

commit 2e32ec25773ae664b538d306d6166fa3dbaee1b2
Author: Neha Pawar <[email protected]>
AuthorDate: Mon May 23 16:38:14 2022 -0700

    Add metric for replication count from config (#8761)
---
 .../configs/controller.yml                         |  6 ++++++
 .../pinot/common/metrics/ControllerGauge.java      |  1 +
 .../controller/helix/SegmentStatusChecker.java     | 22 ++++++++++++++++++++++
 .../controller/helix/SegmentStatusCheckerTest.java | 13 +++++++++++++
 4 files changed, 42 insertions(+)

diff --git 
a/docker/images/pinot/etc/jmx_prometheus_javaagent/configs/controller.yml 
b/docker/images/pinot/etc/jmx_prometheus_javaagent/configs/controller.yml
index 0157c8e814..f8d116713f 100644
--- a/docker/images/pinot/etc/jmx_prometheus_javaagent/configs/controller.yml
+++ b/docker/images/pinot/etc/jmx_prometheus_javaagent/configs/controller.yml
@@ -20,6 +20,12 @@ rules:
   labels:
     table: "$1"
     tableType: "$2"
+- pattern: "\"org.apache.pinot.common.metrics\"<type=\"ControllerMetrics\", 
name=\"pinot.controller.replicationFromConfig.(\\w+)_(\\w+)\"><>(\\w+)"
+  name: "pinot_controller_replicationFromConfig_$3"
+  cache: true
+  labels:
+    table: "$1"
+    tableType: "$2"
 - pattern: "\"org.apache.pinot.common.metrics\"<type=\"ControllerMetrics\", 
name=\"pinot.controller.numberOfReplicas.(\\w+)_(\\w+)\"><>(\\w+)"
   name: "pinot_controller_numberOfReplicas_$3"
   cache: true
diff --git 
a/pinot-common/src/main/java/org/apache/pinot/common/metrics/ControllerGauge.java
 
b/pinot-common/src/main/java/org/apache/pinot/common/metrics/ControllerGauge.java
index 764b8337ae..2951cfc7fb 100644
--- 
a/pinot-common/src/main/java/org/apache/pinot/common/metrics/ControllerGauge.java
+++ 
b/pinot-common/src/main/java/org/apache/pinot/common/metrics/ControllerGauge.java
@@ -26,6 +26,7 @@ import org.apache.pinot.common.Utils;
  */
 public enum ControllerGauge implements AbstractMetrics.Gauge {
 
+  REPLICATION_FROM_CONFIG("replicas", false),
   // Number of complete replicas of table in external view containing all 
segments online in ideal state
   NUMBER_OF_REPLICAS("replicas", false),
 
diff --git 
a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/SegmentStatusChecker.java
 
b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/SegmentStatusChecker.java
index 6d14cb46df..a05dac5f9b 100644
--- 
a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/SegmentStatusChecker.java
+++ 
b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/SegmentStatusChecker.java
@@ -41,6 +41,7 @@ import org.apache.pinot.controller.LeadControllerManager;
 import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
 import 
org.apache.pinot.controller.helix.core.periodictask.ControllerPeriodicTask;
 import org.apache.pinot.controller.util.TableSizeReader;
+import org.apache.pinot.spi.config.table.TableConfig;
 import org.apache.pinot.spi.config.table.TableType;
 import org.apache.pinot.spi.utils.builder.TableNameBuilder;
 import org.slf4j.Logger;
@@ -108,6 +109,7 @@ public class SegmentStatusChecker extends 
ControllerPeriodicTask<SegmentStatusCh
   @Override
   protected void processTable(String tableNameWithType, Context context) {
     try {
+      updateTableConfigMetrics(tableNameWithType);
       updateSegmentMetrics(tableNameWithType, context);
       updateTableSizeMetrics(tableNameWithType);
     } catch (Exception e) {
@@ -124,6 +126,26 @@ public class SegmentStatusChecker extends 
ControllerPeriodicTask<SegmentStatusCh
     
_controllerMetrics.setValueOfGlobalGauge(ControllerGauge.DISABLED_TABLE_COUNT, 
context._disabledTableCount);
   }
 
+  /**
+   * Updates metrics related to the table config.
+   * If table config not found, resets the metrics
+   */
+  private void updateTableConfigMetrics(String tableNameWithType) {
+    TableConfig tableConfig = 
_pinotHelixResourceManager.getTableConfig(tableNameWithType);
+    if (tableConfig == null) {
+      LOGGER.warn("Found null table config for table: {}. Resetting table 
config metrics.", tableNameWithType);
+      _controllerMetrics.setValueOfTableGauge(tableNameWithType, 
ControllerGauge.REPLICATION_FROM_CONFIG, 0);
+      return;
+    }
+    int replication;
+    if (tableConfig.getTableType() == TableType.REALTIME) {
+      replication = 
tableConfig.getValidationConfig().getReplicasPerPartitionNumber();
+    } else {
+      replication = tableConfig.getValidationConfig().getReplicationNumber();
+    }
+    _controllerMetrics.setValueOfTableGauge(tableNameWithType, 
ControllerGauge.REPLICATION_FROM_CONFIG, replication);
+  }
+
   private void updateTableSizeMetrics(String tableNameWithType)
       throws InvalidConfigException {
     _tableSizeReader.getTableSizeDetails(tableNameWithType, 
TABLE_CHECKER_TIMEOUT_MS);
diff --git 
a/pinot-controller/src/test/java/org/apache/pinot/controller/helix/SegmentStatusCheckerTest.java
 
b/pinot-controller/src/test/java/org/apache/pinot/controller/helix/SegmentStatusCheckerTest.java
index dbcc0515d9..bdac60e617 100644
--- 
a/pinot-controller/src/test/java/org/apache/pinot/controller/helix/SegmentStatusCheckerTest.java
+++ 
b/pinot-controller/src/test/java/org/apache/pinot/controller/helix/SegmentStatusCheckerTest.java
@@ -43,8 +43,11 @@ import org.apache.pinot.controller.ControllerConf;
 import org.apache.pinot.controller.LeadControllerManager;
 import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
 import org.apache.pinot.controller.util.TableSizeReader;
+import org.apache.pinot.spi.config.table.TableConfig;
+import org.apache.pinot.spi.config.table.TableType;
 import org.apache.pinot.spi.metrics.PinotMetricsRegistry;
 import org.apache.pinot.spi.utils.CommonConstants;
+import org.apache.pinot.spi.utils.builder.TableConfigBuilder;
 import org.apache.pinot.spi.utils.builder.TableNameBuilder;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -74,6 +77,9 @@ public class SegmentStatusCheckerTest {
     final String tableName = "myTable_OFFLINE";
     List<String> allTableNames = new ArrayList<String>();
     allTableNames.add(tableName);
+    TableConfig tableConfig =
+        new 
TableConfigBuilder(TableType.OFFLINE).setTableName(tableName).setNumReplicas(2).build();
+
     IdealState idealState = new IdealState(tableName);
     idealState.setPartitionState("myTable_0", "pinot1", "ONLINE");
     idealState.setPartitionState("myTable_0", "pinot2", "ONLINE");
@@ -105,6 +111,7 @@ public class SegmentStatusCheckerTest {
     {
       _helixResourceManager = mock(PinotHelixResourceManager.class);
       when(_helixResourceManager.getAllTables()).thenReturn(allTableNames);
+      
when(_helixResourceManager.getTableConfig(tableName)).thenReturn(tableConfig);
       
when(_helixResourceManager.getTableIdealState(tableName)).thenReturn(idealState);
       
when(_helixResourceManager.getTableExternalView(tableName)).thenReturn(externalView);
     }
@@ -144,6 +151,7 @@ public class SegmentStatusCheckerTest {
     _segmentStatusChecker.setTableSizeReader(_tableSizeReader);
     _segmentStatusChecker.start();
     _segmentStatusChecker.run();
+    Assert.assertEquals(_controllerMetrics.getValueOfTableGauge(tableName, 
ControllerGauge.REPLICATION_FROM_CONFIG), 2);
     Assert
         
.assertEquals(_controllerMetrics.getValueOfTableGauge(externalView.getId(), 
ControllerGauge.SEGMENT_COUNT), 3);
     Assert.assertEquals(
@@ -171,6 +179,9 @@ public class SegmentStatusCheckerTest {
     final String rawTableName = 
TableNameBuilder.extractRawTableName(tableName);
     List<String> allTableNames = new ArrayList<String>();
     allTableNames.add(tableName);
+    TableConfig tableConfig =
+        new 
TableConfigBuilder(TableType.REALTIME).setTableName(tableName).setTimeColumnName("timeColumn").setLLC(true)
+            .setNumReplicas(3).build();
     final LLCSegmentName seg1 = new LLCSegmentName(rawTableName, 1, 0, 
System.currentTimeMillis());
     final LLCSegmentName seg2 = new LLCSegmentName(rawTableName, 1, 1, 
System.currentTimeMillis());
     final LLCSegmentName seg3 = new LLCSegmentName(rawTableName, 2, 1, 
System.currentTimeMillis());
@@ -201,6 +212,7 @@ public class SegmentStatusCheckerTest {
     {
       _helixResourceManager = mock(PinotHelixResourceManager.class);
       _helixPropertyStore = mock(ZkHelixPropertyStore.class);
+      
when(_helixResourceManager.getTableConfig(tableName)).thenReturn(tableConfig);
       
when(_helixResourceManager.getPropertyStore()).thenReturn(_helixPropertyStore);
       when(_helixResourceManager.getAllTables()).thenReturn(allTableNames);
       
when(_helixResourceManager.getTableIdealState(tableName)).thenReturn(idealState);
@@ -227,6 +239,7 @@ public class SegmentStatusCheckerTest {
     _segmentStatusChecker.setTableSizeReader(_tableSizeReader);
     _segmentStatusChecker.start();
     _segmentStatusChecker.run();
+    Assert.assertEquals(_controllerMetrics.getValueOfTableGauge(tableName, 
ControllerGauge.REPLICATION_FROM_CONFIG), 3);
     Assert.assertEquals(
         _controllerMetrics.getValueOfTableGauge(externalView.getId(), 
ControllerGauge.SEGMENTS_IN_ERROR_STATE), 0);
     Assert


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to