From 8d0471da88625ff39436be8fafd67072a81f20d8 Mon Sep 17 00:00:00 2001 From: Bowsickdharan Date: Thu, 11 Jun 2026 15:57:08 +0000 Subject: [PATCH 1/4] Inject MetricsPersistence into PersistingMetricsReporter --- .../service/config/ServiceProducers.java | 6 ++++ .../reporting/PersistingMetricsReporter.java | 26 ++++++-------- .../PersistingMetricsReporterTest.java | 34 +++++++------------ 3 files changed, 28 insertions(+), 38 deletions(-) diff --git a/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java b/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java index 8a5f9a71526..4e68ee349ed 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java @@ -149,6 +149,12 @@ public CallContext polarisCallContext( return new PolarisCallContext(realmContext, metaStore, metricsPersistence, configurationSource); } + @Produces + @RequestScoped + public MetricsPersistence metricsPersistence(CallContext callContext) { + return callContext.getPolarisCallContext().getMetricsPersistence(); + } + @Produces @RequestScoped public RealmConfig realmConfig( diff --git a/runtime/service/src/main/java/org/apache/polaris/service/reporting/PersistingMetricsReporter.java b/runtime/service/src/main/java/org/apache/polaris/service/reporting/PersistingMetricsReporter.java index 8703d3b8db5..8925213819e 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/reporting/PersistingMetricsReporter.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/reporting/PersistingMetricsReporter.java @@ -30,32 +30,29 @@ import org.apache.iceberg.metrics.MetricsReport; import org.apache.iceberg.metrics.ScanReport; import org.apache.polaris.core.auth.PolarisPrincipal; -import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RequestIdSupplier; import org.apache.polaris.core.metrics.iceberg.MetricsRecordConverter; -import org.apache.polaris.core.persistence.PolarisMetaStoreManager; import org.apache.polaris.core.persistence.metrics.CommitMetricsRecord; +import org.apache.polaris.core.persistence.metrics.MetricsPersistence; import org.apache.polaris.core.persistence.metrics.ScanMetricsRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * Implementation of {@link PolarisMetricsReporter} that persists metrics using the {@link - * PolarisMetaStoreManager} from the current {@link CallContext}. + * Implementation of {@link PolarisMetricsReporter} that persists metrics via the request-scoped + * {@link MetricsPersistence} backend. * *

This reporter is selected when {@code polaris.iceberg-metrics.reporting.type} is set to {@code * "persisting"}. * - *

The reporter uses {@link PolarisMetaStoreManager} to persist metrics, following the same - * abstraction pattern as other Polaris operations. If the underlying persistence does not support - * metrics, they are silently discarded. + *

If the underlying persistence does not support metrics, they are silently discarded. * *

The reporter receives catalog and table IDs from the caller (already resolved during * authorization), avoiding redundant entity lookups. It uses {@link MetricsRecordConverter} to * convert Iceberg metrics reports to SPI records before persisting them. * * @see PolarisMetricsReporter - * @see PolarisMetaStoreManager + * @see MetricsPersistence * @see MetricsRecordConverter */ @RequestScoped @@ -63,19 +60,16 @@ public class PersistingMetricsReporter implements PolarisMetricsReporter { private static final Logger LOGGER = LoggerFactory.getLogger(PersistingMetricsReporter.class); - private final CallContext callContext; - private final PolarisMetaStoreManager metaStoreManager; + private final MetricsPersistence metricsPersistence; private final Instance polarisPrincipal; private final Instance requestIdSupplier; @Inject public PersistingMetricsReporter( - CallContext callContext, - PolarisMetaStoreManager metaStoreManager, + MetricsPersistence metricsPersistence, Instance polarisPrincipal, Instance requestIdSupplier) { - this.callContext = callContext; - this.metaStoreManager = metaStoreManager; + this.metricsPersistence = metricsPersistence; this.polarisPrincipal = polarisPrincipal; this.requestIdSupplier = requestIdSupplier; } @@ -113,7 +107,7 @@ public void reportMetric( .otelTraceId(otelTraceId) .otelSpanId(otelSpanId) .build(); - metaStoreManager.writeScanMetrics(callContext.getPolarisCallContext(), record); + metricsPersistence.writeScanReport(record); LOGGER.debug( "Persisted scan metrics for {}.{} (reportId={})", catalogName, table, record.reportId()); } else if (metricsReport instanceof CommitReport commitReport) { @@ -127,7 +121,7 @@ public void reportMetric( .otelTraceId(otelTraceId) .otelSpanId(otelSpanId) .build(); - metaStoreManager.writeCommitMetrics(callContext.getPolarisCallContext(), record); + metricsPersistence.writeCommitReport(record); LOGGER.debug( "Persisted commit metrics for {}.{} (reportId={})", catalogName, diff --git a/runtime/service/src/test/java/org/apache/polaris/service/reporting/PersistingMetricsReporterTest.java b/runtime/service/src/test/java/org/apache/polaris/service/reporting/PersistingMetricsReporterTest.java index 88face5b245..ac76f8dcc1d 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/reporting/PersistingMetricsReporterTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/reporting/PersistingMetricsReporterTest.java @@ -40,12 +40,10 @@ import org.apache.iceberg.metrics.ScanMetrics; import org.apache.iceberg.metrics.ScanMetricsResult; import org.apache.iceberg.metrics.ScanReport; -import org.apache.polaris.core.PolarisCallContext; import org.apache.polaris.core.auth.PolarisPrincipal; -import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RequestIdSupplier; -import org.apache.polaris.core.persistence.PolarisMetaStoreManager; import org.apache.polaris.core.persistence.metrics.CommitMetricsRecord; +import org.apache.polaris.core.persistence.metrics.MetricsPersistence; import org.apache.polaris.core.persistence.metrics.ScanMetricsRecord; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -56,7 +54,7 @@ * *

Note: The reporter now receives catalogId and tableId directly from the caller (already * resolved during authorization in IcebergCatalogHandler), so there's no need to mock entity - * lookups. The reporter uses {@link PolarisMetaStoreManager} to persist metrics. + * lookups. The reporter uses {@link MetricsPersistence} to persist metrics. */ public class PersistingMetricsReporterTest { @@ -67,20 +65,13 @@ public class PersistingMetricsReporterTest { private static final TableIdentifier TABLE_IDENTIFIER = TableIdentifier.of(Namespace.of("db", "schema"), TABLE_NAME); - private PolarisMetaStoreManager metaStoreManager; - private PolarisCallContext polarisCallContext; + private MetricsPersistence metricsPersistence; private PersistingMetricsReporter reporter; @SuppressWarnings("unchecked") @BeforeEach void setUp() { - // Mock PolarisMetaStoreManager - metaStoreManager = mock(PolarisMetaStoreManager.class); - - // Mock CallContext - CallContext callContext = mock(CallContext.class); - polarisCallContext = mock(PolarisCallContext.class); - when(callContext.getPolarisCallContext()).thenReturn(polarisCallContext); + metricsPersistence = mock(MetricsPersistence.class); // Mock Instance beans (not resolvable in test context) Instance principalInstance = mock(Instance.class); @@ -90,8 +81,7 @@ void setUp() { when(requestIdInstance.isResolvable()).thenReturn(false); reporter = - new PersistingMetricsReporter( - callContext, metaStoreManager, principalInstance, requestIdInstance); + new PersistingMetricsReporter(metricsPersistence, principalInstance, requestIdInstance); } @Test @@ -103,9 +93,9 @@ void testReportScanMetrics() { reporter.reportMetric( CATALOG_NAME, CATALOG_ID, TABLE_IDENTIFIER, TABLE_ID, scanReport, Instant.now()); - // Verify metaStoreManager was called with correct record + // Verify metricsPersistence was called with correct record ArgumentCaptor captor = ArgumentCaptor.forClass(ScanMetricsRecord.class); - verify(metaStoreManager).writeScanMetrics(any(PolarisCallContext.class), captor.capture()); + verify(metricsPersistence).writeScanReport(captor.capture()); ScanMetricsRecord record = captor.getValue(); assertThat(record.catalogId()).isEqualTo(CATALOG_ID); @@ -122,9 +112,9 @@ void testReportCommitMetrics() { reporter.reportMetric( CATALOG_NAME, CATALOG_ID, TABLE_IDENTIFIER, TABLE_ID, commitReport, Instant.now()); - // Verify metaStoreManager was called with correct record + // Verify metricsPersistence was called with correct record ArgumentCaptor captor = ArgumentCaptor.forClass(CommitMetricsRecord.class); - verify(metaStoreManager).writeCommitMetrics(any(PolarisCallContext.class), captor.capture()); + verify(metricsPersistence).writeCommitReport(captor.capture()); CommitMetricsRecord record = captor.getValue(); assertThat(record.catalogId()).isEqualTo(CATALOG_ID); @@ -141,9 +131,9 @@ void testUnknownReportType() { reporter.reportMetric( CATALOG_NAME, CATALOG_ID, TABLE_IDENTIFIER, TABLE_ID, unknownReport, Instant.now()); - // Verify metaStoreManager was NOT called since report type is unknown - verify(metaStoreManager, never()).writeScanMetrics(any(), any()); - verify(metaStoreManager, never()).writeCommitMetrics(any(), any()); + // Verify metricsPersistence was NOT called since report type is unknown + verify(metricsPersistence, never()).writeScanReport(any()); + verify(metricsPersistence, never()).writeCommitReport(any()); } private ScanReport createScanReport() { From 89b440651b28594deb16835daa87fb285d03516d Mon Sep 17 00:00:00 2001 From: Bowsickdharan Date: Fri, 12 Jun 2026 06:16:20 +0000 Subject: [PATCH 2/4] Remove MetricsPersistence from PolarisCallContext --- .../maintenance/TestCatalogMaintenance.java | 6 +- .../NoSqlMetaStoreManagerFactory.java | 6 +- .../metastore/TestNoSqlMetaStoreManager.java | 3 +- .../nosql/metastore/TestNoSqlResolver.java | 3 +- .../TestIndexedContainerAccess.java | 4 +- .../indexaccess/TestMemoizedIndexAccess.java | 4 +- .../polaris/core/PolarisCallContext.java | 55 ++++--------------- .../metrics/PolarisMetricsManager.java | 11 +++- ...cOperationMetaStoreManagerRefreshTest.java | 3 +- .../service/config/ServiceProducers.java | 18 +++--- .../inmemory/InMemoryBufferEventListener.java | 3 +- .../apache/polaris/service/TestServices.java | 2 - 12 files changed, 37 insertions(+), 81 deletions(-) diff --git a/persistence/nosql/persistence/metastore-maintenance/src/test/java/org/apache/polaris/persistence/nosql/metastore/maintenance/TestCatalogMaintenance.java b/persistence/nosql/persistence/metastore-maintenance/src/test/java/org/apache/polaris/persistence/nosql/metastore/maintenance/TestCatalogMaintenance.java index bfe8ffd220a..2c914383976 100644 --- a/persistence/nosql/persistence/metastore-maintenance/src/test/java/org/apache/polaris/persistence/nosql/metastore/maintenance/TestCatalogMaintenance.java +++ b/persistence/nosql/persistence/metastore-maintenance/src/test/java/org/apache/polaris/persistence/nosql/metastore/maintenance/TestCatalogMaintenance.java @@ -569,8 +569,7 @@ private TestSetup bootstrapRealm() { var manager = metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext); var session = metaStoreManagerFactory.getOrCreateSession(realmContext); - var metrics = metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext); - var callCtx = new PolarisCallContext(realmContext, session, metrics, configurationSource); + var callCtx = new PolarisCallContext(realmContext, session, configurationSource); var persistence = realmPersistenceFactory.newBuilder().realmId(realmId).skipDecorators().build(); @@ -927,8 +926,7 @@ private void checkEntities(String step, List entities) { var manager = metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext); var session = metaStoreManagerFactory.getOrCreateSession(realmContext); - var metrics = metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext); - var callCtx = new PolarisCallContext(realmContext, session, metrics, configurationSource); + var callCtx = new PolarisCallContext(realmContext, session, configurationSource); for (var e : entities) { var result = diff --git a/persistence/nosql/persistence/metastore/src/main/java/org/apache/polaris/persistence/nosql/metastore/NoSqlMetaStoreManagerFactory.java b/persistence/nosql/persistence/metastore/src/main/java/org/apache/polaris/persistence/nosql/metastore/NoSqlMetaStoreManagerFactory.java index 63e30a4b7f6..0851b705726 100644 --- a/persistence/nosql/persistence/metastore/src/main/java/org/apache/polaris/persistence/nosql/metastore/NoSqlMetaStoreManagerFactory.java +++ b/persistence/nosql/persistence/metastore/src/main/java/org/apache/polaris/persistence/nosql/metastore/NoSqlMetaStoreManagerFactory.java @@ -283,11 +283,7 @@ private PrincipalSecretsResult bootstrapRealm( clock); PolarisCallContext ctx = - new PolarisCallContext( - () -> realmId, - metaStore, - NO_OP_METRICS_PERSISTENCE, - RealmConfigurationSource.EMPTY_CONFIG); + new PolarisCallContext(() -> realmId, metaStore, RealmConfigurationSource.EMPTY_CONFIG); var secretsResult = createPolarisPrincipalForRealm(metaStoreManager, ctx); realmManagement.update( diff --git a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlMetaStoreManager.java b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlMetaStoreManager.java index 98d3fb40aa6..9949ac40670 100644 --- a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlMetaStoreManager.java +++ b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlMetaStoreManager.java @@ -105,9 +105,8 @@ protected PolarisTestMetaStoreManager createPolarisTestMetaStoreManager() { var manager = metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext); var session = metaStoreManagerFactory.getOrCreateSession(realmContext); - var metrics = metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext); - var callCtx = new PolarisCallContext(realmContext, session, metrics, configurationSource); + var callCtx = new PolarisCallContext(realmContext, session, configurationSource); return new PolarisTestMetaStoreManager(manager, callCtx, startTime, false); } diff --git a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlResolver.java b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlResolver.java index 27c99e211d8..2b6e29b319a 100644 --- a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlResolver.java +++ b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/TestNoSqlResolver.java @@ -72,8 +72,7 @@ protected PolarisCallContext callCtx() { metaStoreManager = metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext); var session = metaStoreManagerFactory.getOrCreateSession(realmContext); - var metrics = metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext); - callCtx = new PolarisCallContext(realmContext, session, metrics, configurationSource); + callCtx = new PolarisCallContext(realmContext, session, configurationSource); tm = new PolarisTestMetaStoreManager(metaStoreManager, callCtx, startTime, false); } diff --git a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/indexaccess/TestIndexedContainerAccess.java b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/indexaccess/TestIndexedContainerAccess.java index 4e9012d44ea..1a780d476ce 100644 --- a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/indexaccess/TestIndexedContainerAccess.java +++ b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/indexaccess/TestIndexedContainerAccess.java @@ -97,9 +97,7 @@ public void setup(TestInfo testInfo) { var realmContext = (RealmContext) () -> realmId; callContext = new PolarisCallContext( - realmContext, - metaStoreManagerFactory.getOrCreateSession(realmContext), - metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext)); + realmContext, metaStoreManagerFactory.getOrCreateSession(realmContext)); metaStoreManager = metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext); } diff --git a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/indexaccess/TestMemoizedIndexAccess.java b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/indexaccess/TestMemoizedIndexAccess.java index 77698876242..fc8319b32be 100644 --- a/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/indexaccess/TestMemoizedIndexAccess.java +++ b/persistence/nosql/persistence/metastore/src/test/java/org/apache/polaris/persistence/nosql/metastore/indexaccess/TestMemoizedIndexAccess.java @@ -92,9 +92,7 @@ public void setup(TestInfo testInfo) { var realmContext = (RealmContext) () -> realmId; callContext = new PolarisCallContext( - realmContext, - metaStoreManagerFactory.getOrCreateSession(realmContext), - metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext)); + realmContext, metaStoreManagerFactory.getOrCreateSession(realmContext)); metaStoreManager = metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext); memoized = MemoizedIndexedAccess.newMemoizedIndexedAccess(persistence); diff --git a/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java b/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java index 394f8180dd3..3379390f626 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/PolarisCallContext.java @@ -25,31 +25,29 @@ import org.apache.polaris.core.context.CallContext; import org.apache.polaris.core.context.RealmContext; import org.apache.polaris.core.persistence.BasePersistence; -import org.apache.polaris.core.persistence.metrics.MetricsPersistence; import org.jspecify.annotations.NonNull; /** * The Call context is allocated each time a new REST request is processed. It contains instances of * low-level services required to process that request. * - *

{@link BasePersistence} continues to carry the bulk of the metastore SPI surface (and still - * extends {@code PolicyMappingPersistence} / acts as the {@code IntegrationPersistence} via a - * runtime cast for now). {@link MetricsPersistence} is intentionally decoupled and supplied - * separately so callers that only need metrics persistence do not have to depend on {@link - * BasePersistence}. + *

{@link BasePersistence} carries the bulk of the metastore SPI surface (and still extends + * {@code PolicyMappingPersistence} / acts as the {@code IntegrationPersistence} via a runtime cast + * for now). {@link org.apache.polaris.core.persistence.metrics.MetricsPersistence} is intentionally + * kept out of this context; service code that needs metrics persistence should depend on that SPI + * directly. */ public class PolarisCallContext implements CallContext { // meta store which is used to persist Polaris entity metadata private final BasePersistence metaStore; - private final MetricsPersistence metricsPersistence; private final RealmConfigurationSource configurationSource; private final RealmContext realmContext; private final RealmConfig realmConfig; /** * @deprecated Use {@link PolarisCallContext#PolarisCallContext(RealmContext, BasePersistence, - * MetricsPersistence, RealmConfigurationSource)}. + * RealmConfigurationSource)}. */ @SuppressWarnings("removal") @Deprecated(forRemoval = true) @@ -57,61 +55,29 @@ public PolarisCallContext( @NonNull RealmContext realmContext, @NonNull BasePersistence metaStore, @NonNull PolarisConfigurationStore configurationStore) { - this( - realmContext, metaStore, new MetricsPersistence() {}, configurationStore::getConfiguration); + this(realmContext, metaStore, configurationStore::getConfiguration); } - /** - * Convenience constructor for backends whose {@link BasePersistence} implementation also - * implements {@link MetricsPersistence} (the common in-tree case). Callers that need to wire a - * distinct metrics implementation should use {@link #PolarisCallContext(RealmContext, - * BasePersistence, MetricsPersistence, RealmConfigurationSource)}. - */ - public

PolarisCallContext( - @NonNull RealmContext realmContext, - @NonNull P metaStore, - @NonNull RealmConfigurationSource configurationSource) { - this(realmContext, metaStore, metaStore, configurationSource); - } - - /** Primary constructor — {@link MetricsPersistence} is supplied separately from the metastore. */ public PolarisCallContext( @NonNull RealmContext realmContext, @NonNull BasePersistence metaStore, - @NonNull MetricsPersistence metricsPersistence, @NonNull RealmConfigurationSource configurationSource) { this.realmContext = realmContext; this.metaStore = metaStore; - this.metricsPersistence = metricsPersistence; this.configurationSource = configurationSource; this.realmConfig = new RealmConfigImpl(this.configurationSource, this.realmContext); } /** Convenience constructor that defaults to {@link RealmConfigurationSource#EMPTY_CONFIG}. */ public PolarisCallContext( - @NonNull RealmContext realmContext, - @NonNull BasePersistence metaStore, - @NonNull MetricsPersistence metricsPersistence) { - this(realmContext, metaStore, metricsPersistence, RealmConfigurationSource.EMPTY_CONFIG); - } - - /** - * Convenience constructor for callers whose persistence type satisfies both SPIs and who do not - * have a {@link RealmConfigurationSource}. - */ - public

PolarisCallContext( - @NonNull RealmContext realmContext, @NonNull P metaStore) { - this(realmContext, metaStore, metaStore, RealmConfigurationSource.EMPTY_CONFIG); + @NonNull RealmContext realmContext, @NonNull BasePersistence metaStore) { + this(realmContext, metaStore, RealmConfigurationSource.EMPTY_CONFIG); } public BasePersistence getMetaStore() { return metaStore; } - public MetricsPersistence getMetricsPersistence() { - return metricsPersistence; - } - @Override public RealmContext getRealmContext() { return realmContext; @@ -136,7 +102,6 @@ public PolarisCallContext copy() { // copy of the RealmContext to ensure the access during the task executor. String realmId = this.realmContext.getRealmIdentifier(); RealmContext realmContext = () -> realmId; - return new PolarisCallContext( - realmContext, this.metaStore, this.metricsPersistence, this.configurationSource); + return new PolarisCallContext(realmContext, this.metaStore, this.configurationSource); } } diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/PolarisMetricsManager.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/PolarisMetricsManager.java index 1d2885d0d94..e6f866232f4 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/PolarisMetricsManager.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/PolarisMetricsManager.java @@ -19,6 +19,7 @@ package org.apache.polaris.core.persistence.metrics; import org.apache.polaris.core.PolarisCallContext; +import org.apache.polaris.core.persistence.BasePersistence; import org.jspecify.annotations.NonNull; /** @@ -56,7 +57,10 @@ public interface PolarisMetricsManager { */ default void writeScanMetrics( @NonNull PolarisCallContext callCtx, @NonNull ScanMetricsRecord record) { - callCtx.getMetricsPersistence().writeScanReport(record); + BasePersistence metaStore = callCtx.getMetaStore(); + if (metaStore instanceof MetricsPersistence metricsPersistence) { + metricsPersistence.writeScanReport(record); + } } /** @@ -73,6 +77,9 @@ default void writeScanMetrics( */ default void writeCommitMetrics( @NonNull PolarisCallContext callCtx, @NonNull CommitMetricsRecord record) { - callCtx.getMetricsPersistence().writeCommitReport(record); + BasePersistence metaStore = callCtx.getMetaStore(); + if (metaStore instanceof MetricsPersistence metricsPersistence) { + metricsPersistence.writeCommitReport(record); + } } } diff --git a/polaris-core/src/test/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManagerRefreshTest.java b/polaris-core/src/test/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManagerRefreshTest.java index 189d0d2f7bc..d19d47c9397 100644 --- a/polaris-core/src/test/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManagerRefreshTest.java +++ b/polaris-core/src/test/java/org/apache/polaris/core/persistence/AtomicOperationMetaStoreManagerRefreshTest.java @@ -36,7 +36,6 @@ import org.apache.polaris.core.entity.PolarisEntityType; import org.apache.polaris.core.persistence.dao.entity.BaseResult; import org.apache.polaris.core.persistence.dao.entity.ResolvedEntityResult; -import org.apache.polaris.core.persistence.metrics.MetricsPersistence; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @@ -58,7 +57,7 @@ public class AtomicOperationMetaStoreManagerRefreshTest { public void setUp() { diagnostics = new PolarisDefaultDiagServiceImpl(); metaStore = Mockito.mock(BasePersistence.class); - callCtx = new PolarisCallContext(() -> "testRealm", metaStore, new MetricsPersistence() {}); + callCtx = new PolarisCallContext(() -> "testRealm", metaStore); manager = new AtomicOperationMetaStoreManager(Clock.systemUTC(), diagnostics); } diff --git a/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java b/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java index 4e68ee349ed..a24765a69b4 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java @@ -140,19 +140,19 @@ public CallContext polarisCallContext( RealmConfigurationSource configurationSource, MetaStoreManagerFactory metaStoreManagerFactory) { BasePersistence metaStore = metaStoreManagerFactory.getOrCreateSession(realmContext); - // When the backend implements both SPIs on the same instance (e.g. JDBC, in-memory), reuse the - // session instead of building a second persistence instance per request. - MetricsPersistence metricsPersistence = - (metaStore instanceof MetricsPersistence mp) - ? mp - : metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext); - return new PolarisCallContext(realmContext, metaStore, metricsPersistence, configurationSource); + return new PolarisCallContext(realmContext, metaStore, configurationSource); } @Produces @RequestScoped - public MetricsPersistence metricsPersistence(CallContext callContext) { - return callContext.getPolarisCallContext().getMetricsPersistence(); + public MetricsPersistence metricsPersistence( + RealmContext realmContext, MetaStoreManagerFactory metaStoreManagerFactory) { + BasePersistence metaStore = metaStoreManagerFactory.getOrCreateSession(realmContext); + // When the backend implements both SPIs on the same instance (e.g. JDBC, in-memory), reuse the + // session instead of building a second persistence instance per request. + return (metaStore instanceof MetricsPersistence mp) + ? mp + : metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext); } @Produces diff --git a/runtime/service/src/main/java/org/apache/polaris/service/events/listeners/inmemory/InMemoryBufferEventListener.java b/runtime/service/src/main/java/org/apache/polaris/service/events/listeners/inmemory/InMemoryBufferEventListener.java index 4e25261cd0e..0ec6cd534bc 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/events/listeners/inmemory/InMemoryBufferEventListener.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/events/listeners/inmemory/InMemoryBufferEventListener.java @@ -168,8 +168,7 @@ protected void flush(String realmId, List events) { RealmContext realmContext = () -> realmId; var metaStoreManager = metaStoreManagerFactory.getOrCreateMetaStoreManager(realmContext); var basePersistence = metaStoreManagerFactory.getOrCreateSession(realmContext); - var metricsPersistence = metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext); - var callContext = new PolarisCallContext(realmContext, basePersistence, metricsPersistence); + var callContext = new PolarisCallContext(realmContext, basePersistence); metaStoreManager.writeEvents(callContext, events); } diff --git a/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java b/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java index ce52a212023..bb4779eedf7 100644 --- a/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java +++ b/runtime/service/src/testFixtures/java/org/apache/polaris/service/TestServices.java @@ -232,7 +232,6 @@ public TestServices build() { new PolarisCallContext( realmContext, metaStoreManagerFactory.getOrCreateSession(realmContext), - metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext), configurationSource); PolarisMetaStoreManager metaStoreManager = @@ -471,7 +470,6 @@ public PolarisCallContext newCallContext() { return new PolarisCallContext( realmContext, metaStoreManagerFactory.getOrCreateSession(realmContext), - metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext), configurationSource); } } From 033667858d4f3b6c0e08d3d513f93568e4ab1910 Mon Sep 17 00:00:00 2001 From: Bowsickdharan Date: Sat, 13 Jun 2026 07:33:37 +0000 Subject: [PATCH 3/4] Address review comments for metrics persistence injection --- agent_gradle_out.txt | Bin 0 -> 125072 bytes .../persistence/PolarisMetaStoreManager.java | 4 +- .../metrics/MetricsPersistence.java | 2 - .../metrics/PolarisMetricsManager.java | 85 ------------------ .../service/config/ServiceProducers.java | 7 +- 5 files changed, 2 insertions(+), 96 deletions(-) create mode 100644 agent_gradle_out.txt delete mode 100644 polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/PolarisMetricsManager.java diff --git a/agent_gradle_out.txt b/agent_gradle_out.txt new file mode 100644 index 0000000000000000000000000000000000000000..c77b00f0d8975291cf3cfee188b51376a1aec43f GIT binary patch literal 125072 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 literal 0 HcmV?d00001 diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisMetaStoreManager.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisMetaStoreManager.java index 35c8c72221c..939d1f76258 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisMetaStoreManager.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/PolarisMetaStoreManager.java @@ -48,7 +48,6 @@ import org.apache.polaris.core.persistence.dao.entity.ListEntitiesResult; import org.apache.polaris.core.persistence.dao.entity.ResolvedEntitiesResult; import org.apache.polaris.core.persistence.dao.entity.ResolvedEntityResult; -import org.apache.polaris.core.persistence.metrics.PolarisMetricsManager; import org.apache.polaris.core.persistence.pagination.Page; import org.apache.polaris.core.persistence.pagination.PageToken; import org.apache.polaris.core.policy.PolarisPolicyMappingManager; @@ -63,8 +62,7 @@ public interface PolarisMetaStoreManager extends PolarisSecretsManager, PolarisGrantManager, PolarisPolicyMappingManager, - PolarisEventManager, - PolarisMetricsManager { + PolarisEventManager { /** * Bootstrap the Polaris service, creating the root catalog, root principal, and associated diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/MetricsPersistence.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/MetricsPersistence.java index bec34a97a12..881fa5b8ba8 100644 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/MetricsPersistence.java +++ b/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/MetricsPersistence.java @@ -42,8 +42,6 @@ * *

Note: This SPI is currently experimental and not yet implemented in all persistence * backends. The API may change in future releases. - * - * @see PolarisMetricsManager */ @Beta public interface MetricsPersistence { diff --git a/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/PolarisMetricsManager.java b/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/PolarisMetricsManager.java deleted file mode 100644 index e6f866232f4..00000000000 --- a/polaris-core/src/main/java/org/apache/polaris/core/persistence/metrics/PolarisMetricsManager.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * 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.polaris.core.persistence.metrics; - -import org.apache.polaris.core.PolarisCallContext; -import org.apache.polaris.core.persistence.BasePersistence; -import org.jspecify.annotations.NonNull; - -/** - * Interface for managing Iceberg metrics persistence through the metastore manager layer. - * - *

This follows the same pattern as {@link org.apache.polaris.core.entity.PolarisEventManager}, - * providing a high-level interface that delegates to the underlying persistence layer. - * - *

The service layer should interact with this interface (via {@link - * org.apache.polaris.core.persistence.PolarisMetaStoreManager}) rather than directly accessing - * persistence implementations. - * - *

Request context (principal name, request ID, OTEL trace/span IDs) should be populated in the - * record by the caller before invoking these methods. This keeps the SPI simple with a single - * method parameter containing all the data needed for persistence. - * - *

Since {@link org.apache.polaris.core.persistence.BasePersistence} now extends {@link - * MetricsPersistence} with default no-op implementations, all persistence backends automatically - * support this interface. Backends that want actual metrics persistence (e.g., JDBC) override the - * methods; others use the default no-op behavior. - */ -public interface PolarisMetricsManager { - - /** - * Writes a scan metrics record to the persistence layer. - * - *

Delegates to the underlying {@link MetricsPersistence#writeScanReport} method. If the - * persistence backend doesn't override the default implementation, this is a no-op. - * - *

The record should contain all request context fields (principalName, requestId, otelTraceId, - * otelSpanId) populated by the caller. - * - * @param callCtx the call context containing the persistence layer - * @param record the scan metrics record to persist (including request context) - */ - default void writeScanMetrics( - @NonNull PolarisCallContext callCtx, @NonNull ScanMetricsRecord record) { - BasePersistence metaStore = callCtx.getMetaStore(); - if (metaStore instanceof MetricsPersistence metricsPersistence) { - metricsPersistence.writeScanReport(record); - } - } - - /** - * Writes a commit metrics record to the persistence layer. - * - *

Delegates to the underlying {@link MetricsPersistence#writeCommitReport} method. If the - * persistence backend doesn't override the default implementation, this is a no-op. - * - *

The record should contain all request context fields (principalName, requestId, otelTraceId, - * otelSpanId) populated by the caller. - * - * @param callCtx the call context containing the persistence layer - * @param record the commit metrics record to persist (including request context) - */ - default void writeCommitMetrics( - @NonNull PolarisCallContext callCtx, @NonNull CommitMetricsRecord record) { - BasePersistence metaStore = callCtx.getMetaStore(); - if (metaStore instanceof MetricsPersistence metricsPersistence) { - metricsPersistence.writeCommitReport(record); - } - } -} diff --git a/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java b/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java index a24765a69b4..be424489437 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java @@ -147,12 +147,7 @@ public CallContext polarisCallContext( @RequestScoped public MetricsPersistence metricsPersistence( RealmContext realmContext, MetaStoreManagerFactory metaStoreManagerFactory) { - BasePersistence metaStore = metaStoreManagerFactory.getOrCreateSession(realmContext); - // When the backend implements both SPIs on the same instance (e.g. JDBC, in-memory), reuse the - // session instead of building a second persistence instance per request. - return (metaStore instanceof MetricsPersistence mp) - ? mp - : metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext); + return metaStoreManagerFactory.getOrCreateMetricsPersistence(realmContext); } @Produces From 60e4362c8dca76ec4f0412b740e7b1cf3f415798 Mon Sep 17 00:00:00 2001 From: Dmitri Bourlatchkov Date: Tue, 16 Jun 2026 13:32:26 -0400 Subject: [PATCH 4/4] Delete agent_gradle_out.txt --- agent_gradle_out.txt | Bin 125072 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 agent_gradle_out.txt diff --git a/agent_gradle_out.txt b/agent_gradle_out.txt deleted file mode 100644 index c77b00f0d8975291cf3cfee188b51376a1aec43f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125072 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