You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by jl...@apache.org on 2024/03/29 03:42:43 UTC
(pinot) branch emit-table-size-metrics created (now 3183940a20)
This is an automated email from the ASF dual-hosted git repository.
jlli pushed a change to branch emit-table-size-metrics
in repository https://gitbox.apache.org/repos/asf/pinot.git
at 3183940a20 Emit table size related metrics only in lead controller
This branch includes the following new commits:
new 3183940a20 Emit table size related metrics only in lead controller
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org
(pinot) 01/01: Emit table size related metrics only in lead controller
Posted by jl...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jlli pushed a commit to branch emit-table-size-metrics
in repository https://gitbox.apache.org/repos/asf/pinot.git
commit 3183940a2078e6de58642f2a2b9cd463f3d19f57
Author: jlli_LinkedIn <jl...@linkedin.com>
AuthorDate: Thu Mar 28 20:42:23 2024 -0700
Emit table size related metrics only in lead controller
---
.../controller/api/resources/DebugResource.java | 7 +++-
.../PinotSegmentUploadDownloadRestletResource.java | 2 +-
.../pinot/controller/api/resources/TableSize.java | 7 +++-
.../api/upload/SegmentValidationUtils.java | 6 ++--
.../controller/helix/SegmentStatusChecker.java | 2 +-
.../pinot/controller/util/TableSizeReader.java | 41 ++++++++++++----------
.../pinot/controller/api/TableSizeReaderTest.java | 11 ++++--
7 files changed, 49 insertions(+), 27 deletions(-)
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/DebugResource.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/DebugResource.java
index 88d81f679f..e8dbd0d8a1 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/DebugResource.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/DebugResource.java
@@ -65,6 +65,7 @@ import org.apache.pinot.common.restlet.resources.SegmentErrorInfo;
import org.apache.pinot.common.restlet.resources.SegmentServerDebugInfo;
import org.apache.pinot.common.utils.DatabaseUtils;
import org.apache.pinot.controller.ControllerConf;
+import org.apache.pinot.controller.LeadControllerManager;
import org.apache.pinot.controller.api.debug.TableDebugInfo;
import org.apache.pinot.controller.api.exception.ControllerApplicationException;
import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
@@ -123,6 +124,9 @@ public class DebugResource {
@Inject
ControllerConf _controllerConf;
+ @Inject
+ LeadControllerManager _leadControllerManager;
+
@GET
@Path("tables/{tableName}")
@Authorize(targetType = TargetType.TABLE, paramName = "tableName", action = Actions.Table.GET_DEBUG_INFO)
@@ -238,7 +242,8 @@ public class DebugResource {
private TableDebugInfo.TableSizeSummary getTableSize(String tableNameWithType) {
TableSizeReader tableSizeReader =
- new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _pinotHelixResourceManager);
+ new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _pinotHelixResourceManager,
+ _leadControllerManager);
TableSizeReader.TableSizeDetails tableSizeDetails;
try {
tableSizeDetails = tableSizeReader
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentUploadDownloadRestletResource.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentUploadDownloadRestletResource.java
index c92aef2cf3..04ff031674 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentUploadDownloadRestletResource.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentUploadDownloadRestletResource.java
@@ -363,7 +363,7 @@ public class PinotSegmentUploadDownloadRestletResource {
}
SegmentValidationUtils.checkStorageQuota(segmentName, untarredSegmentSizeInBytes, tableConfig,
_pinotHelixResourceManager, _controllerConf, _controllerMetrics, _connectionManager, _executor,
- _leadControllerManager.isLeaderForTable(tableNameWithType));
+ _leadControllerManager);
// Encrypt segment
String crypterNameInTableConfig = tableConfig.getValidationConfig().getCrypterClassName();
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableSize.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableSize.java
index dd8f7f78d3..22e95cc5f3 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableSize.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableSize.java
@@ -39,6 +39,7 @@ import javax.ws.rs.core.Response;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.pinot.common.metrics.ControllerMetrics;
import org.apache.pinot.controller.ControllerConf;
+import org.apache.pinot.controller.LeadControllerManager;
import org.apache.pinot.controller.api.exception.ControllerApplicationException;
import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
import org.apache.pinot.controller.util.TableSizeReader;
@@ -70,6 +71,9 @@ public class TableSize {
@Inject
ControllerMetrics _controllerMetrics;
+ @Inject
+ LeadControllerManager _leadControllerManager;
+
@GET
@Path("/tables/{tableName}/size")
@Authorize(targetType = TargetType.TABLE, paramName = "tableName", action = Actions.Table.GET_SIZE)
@@ -84,7 +88,8 @@ public class TableSize {
@ApiParam(value = "Table name without type", required = true, example = "myTable | myTable_OFFLINE")
@PathParam("tableName") String tableName) {
TableSizeReader tableSizeReader =
- new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _pinotHelixResourceManager);
+ new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _pinotHelixResourceManager,
+ _leadControllerManager);
TableSizeReader.TableSizeDetails tableSizeDetails = null;
try {
tableSizeDetails =
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/upload/SegmentValidationUtils.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/upload/SegmentValidationUtils.java
index f02718f1aa..18494b585e 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/upload/SegmentValidationUtils.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/upload/SegmentValidationUtils.java
@@ -23,6 +23,7 @@ import javax.ws.rs.core.Response;
import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.pinot.common.metrics.ControllerMetrics;
import org.apache.pinot.controller.ControllerConf;
+import org.apache.pinot.controller.LeadControllerManager;
import org.apache.pinot.controller.api.exception.ControllerApplicationException;
import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
import org.apache.pinot.controller.util.TableSizeReader;
@@ -65,12 +66,13 @@ public class SegmentValidationUtils {
public static void checkStorageQuota(String segmentName, long segmentSizeInBytes, TableConfig tableConfig,
PinotHelixResourceManager resourceManager, ControllerConf controllerConf, ControllerMetrics controllerMetrics,
- HttpClientConnectionManager connectionManager, Executor executor, boolean isLeaderForTable) {
+ HttpClientConnectionManager connectionManager, Executor executor, LeadControllerManager leadControllerManager) {
if (!controllerConf.getEnableStorageQuotaCheck()) {
return;
}
+ boolean isLeaderForTable = leadControllerManager.isLeaderForTable(tableConfig.getTableName());
TableSizeReader tableSizeReader =
- new TableSizeReader(executor, connectionManager, controllerMetrics, resourceManager);
+ new TableSizeReader(executor, connectionManager, controllerMetrics, resourceManager, leadControllerManager);
StorageQuotaChecker quotaChecker =
new StorageQuotaChecker(tableConfig, tableSizeReader, controllerMetrics, isLeaderForTable, resourceManager);
StorageQuotaChecker.QuotaCheckerResponse response;
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 1ac7446592..fa265c4f52 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
@@ -94,7 +94,7 @@ public class SegmentStatusChecker extends ControllerPeriodicTask<SegmentStatusCh
_waitForPushTimeSeconds = config.getStatusCheckerWaitForPushTimeInSeconds();
_tableSizeReader =
new TableSizeReader(executorService, new PoolingHttpClientConnectionManager(), _controllerMetrics,
- _pinotHelixResourceManager);
+ _pinotHelixResourceManager, leadControllerManager);
}
@Override
diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/util/TableSizeReader.java b/pinot-controller/src/main/java/org/apache/pinot/controller/util/TableSizeReader.java
index 82fadc50c9..dc4e8e2e08 100644
--- a/pinot-controller/src/main/java/org/apache/pinot/controller/util/TableSizeReader.java
+++ b/pinot-controller/src/main/java/org/apache/pinot/controller/util/TableSizeReader.java
@@ -36,6 +36,7 @@ import org.apache.pinot.common.metadata.ZKMetadataProvider;
import org.apache.pinot.common.metrics.ControllerGauge;
import org.apache.pinot.common.metrics.ControllerMetrics;
import org.apache.pinot.common.restlet.resources.SegmentSizeInfo;
+import org.apache.pinot.controller.LeadControllerManager;
import org.apache.pinot.controller.api.resources.ServerTableSizeReader;
import org.apache.pinot.controller.helix.core.PinotHelixResourceManager;
import org.apache.pinot.spi.config.table.TableConfig;
@@ -55,13 +56,16 @@ public class TableSizeReader {
private final HttpClientConnectionManager _connectionManager;
private final PinotHelixResourceManager _helixResourceManager;
private final ControllerMetrics _controllerMetrics;
+ private final LeadControllerManager _leadControllerManager;
public TableSizeReader(Executor executor, HttpClientConnectionManager connectionManager,
- ControllerMetrics controllerMetrics, PinotHelixResourceManager helixResourceManager) {
+ ControllerMetrics controllerMetrics, PinotHelixResourceManager helixResourceManager,
+ LeadControllerManager leadControllerManager) {
_executor = executor;
_connectionManager = connectionManager;
_controllerMetrics = controllerMetrics;
_helixResourceManager = helixResourceManager;
+ _leadControllerManager = leadControllerManager;
}
/**
@@ -104,11 +108,11 @@ public class TableSizeReader {
Math.max(tableSizeDetails._realtimeSegments._reportedSizePerReplicaInBytes, 0L);
isMissingAllRealtimeSegments =
(tableSizeDetails._realtimeSegments._missingSegments == tableSizeDetails._realtimeSegments._segments.size());
- _controllerMetrics.setValueOfTableGauge(realtimeTableName, ControllerGauge.TABLE_TOTAL_SIZE_ON_SERVER,
+ emitMetrics(realtimeTableName, ControllerGauge.TABLE_TOTAL_SIZE_ON_SERVER,
tableSizeDetails._realtimeSegments._estimatedSizeInBytes);
- _controllerMetrics.setValueOfTableGauge(realtimeTableName, ControllerGauge.TABLE_SIZE_PER_REPLICA_ON_SERVER,
- tableSizeDetails._realtimeSegments._estimatedSizeInBytes / _helixResourceManager
- .getNumReplicas(realtimeTableConfig));
+ emitMetrics(realtimeTableName, ControllerGauge.TABLE_SIZE_PER_REPLICA_ON_SERVER,
+ tableSizeDetails._realtimeSegments._estimatedSizeInBytes / _helixResourceManager.getNumReplicas(
+ realtimeTableConfig));
long largestSegmentSizeOnServer = DEFAULT_SIZE_WHEN_MISSING_OR_ERROR;
for (SegmentSizeDetails segmentSizeDetail : tableSizeDetails._realtimeSegments._segments.values()) {
@@ -117,8 +121,7 @@ public class TableSizeReader {
}
}
if (largestSegmentSizeOnServer != DEFAULT_SIZE_WHEN_MISSING_OR_ERROR) {
- _controllerMetrics.setValueOfTableGauge(realtimeTableName, ControllerGauge.LARGEST_SEGMENT_SIZE_ON_SERVER,
- largestSegmentSizeOnServer);
+ emitMetrics(realtimeTableName, ControllerGauge.LARGEST_SEGMENT_SIZE_ON_SERVER, largestSegmentSizeOnServer);
}
}
if (hasOfflineTableConfig) {
@@ -131,11 +134,11 @@ public class TableSizeReader {
Math.max(tableSizeDetails._offlineSegments._reportedSizePerReplicaInBytes, 0L);
isMissingAllOfflineSegments =
(tableSizeDetails._offlineSegments._missingSegments == tableSizeDetails._offlineSegments._segments.size());
- _controllerMetrics.setValueOfTableGauge(offlineTableName, ControllerGauge.TABLE_TOTAL_SIZE_ON_SERVER,
+ emitMetrics(offlineTableName, ControllerGauge.TABLE_TOTAL_SIZE_ON_SERVER,
tableSizeDetails._offlineSegments._estimatedSizeInBytes);
- _controllerMetrics.setValueOfTableGauge(offlineTableName, ControllerGauge.TABLE_SIZE_PER_REPLICA_ON_SERVER,
- tableSizeDetails._offlineSegments._estimatedSizeInBytes / _helixResourceManager
- .getNumReplicas(offlineTableConfig));
+ emitMetrics(offlineTableName, ControllerGauge.TABLE_SIZE_PER_REPLICA_ON_SERVER,
+ tableSizeDetails._offlineSegments._estimatedSizeInBytes / _helixResourceManager.getNumReplicas(
+ offlineTableConfig));
long largestSegmentSizeOnServer = DEFAULT_SIZE_WHEN_MISSING_OR_ERROR;
for (SegmentSizeDetails segmentSizeDetail : tableSizeDetails._offlineSegments._segments.values()) {
@@ -144,8 +147,7 @@ public class TableSizeReader {
}
}
if (largestSegmentSizeOnServer != DEFAULT_SIZE_WHEN_MISSING_OR_ERROR) {
- _controllerMetrics.setValueOfTableGauge(offlineTableName, ControllerGauge.LARGEST_SEGMENT_SIZE_ON_SERVER,
- largestSegmentSizeOnServer);
+ emitMetrics(offlineTableName, ControllerGauge.LARGEST_SEGMENT_SIZE_ON_SERVER, largestSegmentSizeOnServer);
}
}
@@ -160,6 +162,12 @@ public class TableSizeReader {
return tableSizeDetails;
}
+ private void emitMetrics(String tableNameWithType, ControllerGauge controllerGauge, long value) {
+ if (_leadControllerManager.isLeaderForTable(tableNameWithType)) {
+ _controllerMetrics.setValueOfTableGauge(tableNameWithType, controllerGauge, value);
+ }
+ }
+
//
// Reported size below indicates the sizes actually reported by servers on successful responses.
// Estimated sizes indicates the size estimated size with approximated calculations for errored servers
@@ -312,9 +320,7 @@ public class TableSizeReader {
if (subTypeSizeDetails._missingSegments > 0) {
int numSegments = segmentToSizeDetailsMap.size();
int missingPercent = subTypeSizeDetails._missingSegments * 100 / numSegments;
- _controllerMetrics
- .setValueOfTableGauge(tableNameWithType, ControllerGauge.TABLE_STORAGE_EST_MISSING_SEGMENT_PERCENT,
- missingPercent);
+ emitMetrics(tableNameWithType, ControllerGauge.TABLE_STORAGE_EST_MISSING_SEGMENT_PERCENT, missingPercent);
if (subTypeSizeDetails._missingSegments == numSegments) {
LOGGER.warn("Failed to get size report for all {} segments of table: {}", numSegments, tableNameWithType);
subTypeSizeDetails._reportedSizeInBytes = DEFAULT_SIZE_WHEN_MISSING_OR_ERROR;
@@ -325,8 +331,7 @@ public class TableSizeReader {
numSegments, tableNameWithType);
}
} else {
- _controllerMetrics
- .setValueOfTableGauge(tableNameWithType, ControllerGauge.TABLE_STORAGE_EST_MISSING_SEGMENT_PERCENT, 0);
+ emitMetrics(tableNameWithType, ControllerGauge.TABLE_STORAGE_EST_MISSING_SEGMENT_PERCENT, 0);
}
return subTypeSizeDetails;
diff --git a/pinot-controller/src/test/java/org/apache/pinot/controller/api/TableSizeReaderTest.java b/pinot-controller/src/test/java/org/apache/pinot/controller/api/TableSizeReaderTest.java
index 7fd7a6e572..18f0600b0f 100644
--- a/pinot-controller/src/test/java/org/apache/pinot/controller/api/TableSizeReaderTest.java
+++ b/pinot-controller/src/test/java/org/apache/pinot/controller/api/TableSizeReaderTest.java
@@ -42,6 +42,7 @@ import org.apache.pinot.common.metrics.MetricValueUtils;
import org.apache.pinot.common.restlet.resources.SegmentSizeInfo;
import org.apache.pinot.common.restlet.resources.TableSizeInfo;
import org.apache.pinot.common.utils.config.TableConfigUtils;
+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.controller.utils.FakeHttpServer;
@@ -77,6 +78,7 @@ public class TableSizeReaderTest {
private final HttpClientConnectionManager _connectionManager = new PoolingHttpClientConnectionManager();
private final ControllerMetrics _controllerMetrics =
new ControllerMetrics(PinotMetricUtils.getPinotMetricsRegistry());
+ private final LeadControllerManager _leadControllerManager = null;
private final Map<String, FakeSizeServer> _serverMap = new HashMap<>();
private PinotHelixResourceManager _helix;
@@ -218,8 +220,10 @@ public class TableSizeReaderTest {
}
@Test
- public void testNoSuchTable() throws InvalidConfigException {
- TableSizeReader reader = new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _helix);
+ public void testNoSuchTable()
+ throws InvalidConfigException {
+ TableSizeReader reader =
+ new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _helix, _leadControllerManager);
assertNull(reader.getTableSizeDetails("mytable", 5000));
}
@@ -239,7 +243,8 @@ public class TableSizeReaderTest {
}
});
- TableSizeReader reader = new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _helix);
+ TableSizeReader reader = new TableSizeReader(_executor, _connectionManager, _controllerMetrics, _helix,
+ _leadControllerManager);
return reader.getTableSizeDetails(table, TIMEOUT_MSEC);
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org