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 <j...@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-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org