From 177440dec1be72998ec916f035dd3b511b84fccc Mon Sep 17 00:00:00 2001 From: flyingImer <1973868+flyingImer@users.noreply.github.com> Date: Wed, 12 Aug 2026 21:43:51 +0000 Subject: [PATCH 1/6] refactor(metrics): move IcebergMetricsReporter SPI to a new spi module PR #5068 put this SPI (plus its MetricsReportEnvelope carrier and MetricType discriminator) in runtime/service. As raised in review (https://github.com/apache/polaris/pull/5068#discussion_r3676236578), the interface has no CDI, Quarkus or JAX-RS dependency at all: only guava, jspecify, and Iceberg's own types. Nothing in the type stops it being implemented outside Quarkus; only the module we put it in did. Introduces a shared spi module for framework-free contracts and lands these three types in it. The reporter is a substrate contract rather than a feature one: the user-facing operation is the Iceberg REST catalog's own metrics endpoint, gated by the ordinary table data privileges, and the reporter is the replaceable sink that endpoint hands the report to. That puts it alongside authorization in the call graph, which is why it sits under spi.substrate rather than spi.feature. Only the metrics contracts move here. Relocating anything else out of polaris-core is deliberately left out of this change. --- bom/build.gradle.kts | 1 + gradle/projects.main.properties | 1 + spi/build.gradle.kts | 36 +++++++++++++++++++ .../metrics/IcebergMetricsReporter.java | 2 +- .../spi/substrate}/metrics/MetricType.java | 2 +- .../metrics/MetricsReportEnvelope.java | 2 +- 6 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 spi/build.gradle.kts rename {runtime/service/src/main/java/org/apache/polaris/service => spi/src/main/java/org/apache/polaris/spi/substrate}/metrics/IcebergMetricsReporter.java (97%) rename {runtime/service/src/main/java/org/apache/polaris/service => spi/src/main/java/org/apache/polaris/spi/substrate}/metrics/MetricType.java (96%) rename {runtime/service/src/main/java/org/apache/polaris/service => spi/src/main/java/org/apache/polaris/spi/substrate}/metrics/MetricsReportEnvelope.java (97%) diff --git a/bom/build.gradle.kts b/bom/build.gradle.kts index ee9b2a4bda9..4042409cfd0 100644 --- a/bom/build.gradle.kts +++ b/bom/build.gradle.kts @@ -93,6 +93,7 @@ dependencies { api(project(":polaris-config-docs-generator")) api(project(":polaris-core")) + api(project(":polaris-spi")) api(project(":polaris-relational-jdbc")) diff --git a/gradle/projects.main.properties b/gradle/projects.main.properties index f691d5782aa..aa5196ed731 100644 --- a/gradle/projects.main.properties +++ b/gradle/projects.main.properties @@ -20,6 +20,7 @@ polaris-bom=bom polaris-core=polaris-core +polaris-spi=spi polaris-api-iceberg-service=api/iceberg-service polaris-api-management-model=api/management-model polaris-api-management-service=api/management-service diff --git a/spi/build.gradle.kts b/spi/build.gradle.kts new file mode 100644 index 00000000000..bb0d6b7cd25 --- /dev/null +++ b/spi/build.gradle.kts @@ -0,0 +1,36 @@ +/* + * 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. + */ + +plugins { + id("polaris-client") + id("org.kordamp.gradle.jandex") +} + +description = "Polaris shared SPI contracts" + +dependencies { + implementation(platform(libs.iceberg.bom)) + implementation("org.apache.iceberg:iceberg-api") + + implementation(libs.guava) + + compileOnly(libs.jspecify) +} + +tasks.named("javadoc") { dependsOn("jandex") } diff --git a/runtime/service/src/main/java/org/apache/polaris/service/metrics/IcebergMetricsReporter.java b/spi/src/main/java/org/apache/polaris/spi/substrate/metrics/IcebergMetricsReporter.java similarity index 97% rename from runtime/service/src/main/java/org/apache/polaris/service/metrics/IcebergMetricsReporter.java rename to spi/src/main/java/org/apache/polaris/spi/substrate/metrics/IcebergMetricsReporter.java index 48bd022390d..88c5dd40f70 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/metrics/IcebergMetricsReporter.java +++ b/spi/src/main/java/org/apache/polaris/spi/substrate/metrics/IcebergMetricsReporter.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.service.metrics; +package org.apache.polaris.spi.substrate.metrics; import com.google.common.annotations.Beta; import org.jspecify.annotations.NonNull; diff --git a/runtime/service/src/main/java/org/apache/polaris/service/metrics/MetricType.java b/spi/src/main/java/org/apache/polaris/spi/substrate/metrics/MetricType.java similarity index 96% rename from runtime/service/src/main/java/org/apache/polaris/service/metrics/MetricType.java rename to spi/src/main/java/org/apache/polaris/spi/substrate/metrics/MetricType.java index 4124d849325..d45a401cb6c 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/metrics/MetricType.java +++ b/spi/src/main/java/org/apache/polaris/spi/substrate/metrics/MetricType.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.service.metrics; +package org.apache.polaris.spi.substrate.metrics; import com.google.common.annotations.Beta; diff --git a/runtime/service/src/main/java/org/apache/polaris/service/metrics/MetricsReportEnvelope.java b/spi/src/main/java/org/apache/polaris/spi/substrate/metrics/MetricsReportEnvelope.java similarity index 97% rename from runtime/service/src/main/java/org/apache/polaris/service/metrics/MetricsReportEnvelope.java rename to spi/src/main/java/org/apache/polaris/spi/substrate/metrics/MetricsReportEnvelope.java index 1c647e89ccc..437c4970194 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/metrics/MetricsReportEnvelope.java +++ b/spi/src/main/java/org/apache/polaris/spi/substrate/metrics/MetricsReportEnvelope.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.service.metrics; +package org.apache.polaris.spi.substrate.metrics; import com.google.common.annotations.Beta; import java.time.Instant; From 477ed53ac0f75aa39d8a2c44c616b98bcf939981 Mon Sep 17 00:00:00 2001 From: flyingImer <1973868+flyingImer@users.noreply.github.com> Date: Fri, 31 Jul 2026 01:23:35 +0000 Subject: [PATCH 2/6] refactor(metrics): move LoggingMetricsReporter to extensions/metrics-reports/base Now that the IcebergMetricsReporter SPI lives in its own module, extensions/metrics-reports/base no longer needs runtime/service for anything, and the default logging implementation can live alongside its peers (NoOpMetricsReporter, and PersistingMetricsReporter in the relational-jdbc extension) instead of in the Quarkus runtime module. Adds guava to the module's own dependencies, for the @VisibleForTesting that LoggingMetricsReporter carries on its test constructor. It reaches this module only through a transitive implementation configuration today, which doesn't put it on a consumer's compile classpath. Same pattern as extensions/auth/opa and extensions/semantic-models. --- extensions/metrics-reports/base/build.gradle.kts | 3 ++- .../extension/metrics/reports}/LoggingMetricsReporter.java | 4 +++- .../metrics/reports}/LoggingMetricsReporterTest.java | 4 +++- 3 files changed, 8 insertions(+), 3 deletions(-) rename {runtime/service/src/main/java/org/apache/polaris/service/metrics => extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports}/LoggingMetricsReporter.java (92%) rename {runtime/service/src/test/java/org/apache/polaris/service/metrics => extensions/metrics-reports/base/src/test/java/org/apache/polaris/extension/metrics/reports}/LoggingMetricsReporterTest.java (90%) diff --git a/extensions/metrics-reports/base/build.gradle.kts b/extensions/metrics-reports/base/build.gradle.kts index f2e22cde0e1..a8b10a5439e 100644 --- a/extensions/metrics-reports/base/build.gradle.kts +++ b/extensions/metrics-reports/base/build.gradle.kts @@ -24,11 +24,12 @@ plugins { dependencies { implementation(project(":polaris-core")) - implementation(project(":polaris-runtime-service")) + implementation(project(":polaris-spi")) implementation(platform(libs.iceberg.bom)) implementation("org.apache.iceberg:iceberg-api") + implementation(libs.guava) implementation(libs.jakarta.enterprise.cdi.api) implementation(libs.jakarta.inject.api) implementation(libs.smallrye.common.annotation) diff --git a/runtime/service/src/main/java/org/apache/polaris/service/metrics/LoggingMetricsReporter.java b/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java similarity index 92% rename from runtime/service/src/main/java/org/apache/polaris/service/metrics/LoggingMetricsReporter.java rename to extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java index 1472b0d360c..505a9c73842 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/metrics/LoggingMetricsReporter.java +++ b/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java @@ -16,12 +16,14 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.service.metrics; +package org.apache.polaris.extension.metrics.reports; import com.google.common.annotations.VisibleForTesting; import io.smallrye.common.annotation.Identifier; import jakarta.enterprise.context.ApplicationScoped; import java.util.function.Consumer; +import org.apache.polaris.spi.substrate.metrics.IcebergMetricsReporter; +import org.apache.polaris.spi.substrate.metrics.MetricsReportEnvelope; import org.jspecify.annotations.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/runtime/service/src/test/java/org/apache/polaris/service/metrics/LoggingMetricsReporterTest.java b/extensions/metrics-reports/base/src/test/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporterTest.java similarity index 90% rename from runtime/service/src/test/java/org/apache/polaris/service/metrics/LoggingMetricsReporterTest.java rename to extensions/metrics-reports/base/src/test/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporterTest.java index 501351307de..de6cec2c640 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/metrics/LoggingMetricsReporterTest.java +++ b/extensions/metrics-reports/base/src/test/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporterTest.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.polaris.service.metrics; +package org.apache.polaris.extension.metrics.reports; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; @@ -26,6 +26,8 @@ import org.apache.iceberg.catalog.Namespace; import org.apache.iceberg.catalog.TableIdentifier; import org.apache.iceberg.metrics.MetricsReport; +import org.apache.polaris.spi.substrate.metrics.MetricType; +import org.apache.polaris.spi.substrate.metrics.MetricsReportEnvelope; import org.junit.jupiter.api.Test; class LoggingMetricsReporterTest { From a80d3c2bcc74af84e99ff572bd2cfd177e8761d8 Mon Sep 17 00:00:00 2001 From: flyingImer <1973868+flyingImer@users.noreply.github.com> Date: Fri, 31 Jul 2026 01:23:49 +0000 Subject: [PATCH 3/6] refactor(metrics): wire consumers to the SPI's new module Import-only changes to point every remaining consumer at org.apache.polaris.spi.substrate.metrics: NoOpMetricsReporter, PersistingMetricsReporter, IcebergCatalogHandler, IcebergCatalogHandlerFactory, ServiceProducers, and IcebergCatalogHandlerTest. None of these change behavior; selection logic in ServiceProducers.metricsReporter(...) is untouched. extensions/metrics-reports/persistence/relational-jdbc no longer needs runtime/service either, for the same reason as the base module. Both extensions and runtime/service now take a dependency on the spi module for the contract. runtime/service needs it on testFixtures too, because TestServices supplies a lambda reporter to the handler builder, so the interface has to resolve there as well. runtime/service previously carried its default reporter (LoggingMetricsReporter) directly, so it never needed to depend on the metrics extension modules. Now that the default lives in extensions/metrics-reports/base, add it back as runtimeOnly: the packaged Quarkus app needs it on its runtime classpath for bean discovery, same as the existing runtimeOnly(":polaris-relational-jdbc") line right above it. runtime/server already carries this same dependency for the assembled distribution. --- .../extension/metrics/reports/NoOpMetricsReporter.java | 4 ++-- .../persistence/relational-jdbc/build.gradle.kts | 2 +- .../extension/metrics/jdbc/PersistingMetricsReporter.java | 4 ++-- runtime/service/build.gradle.kts | 3 +++ .../service/catalog/iceberg/IcebergCatalogHandler.java | 6 +++--- .../catalog/iceberg/IcebergCatalogHandlerFactory.java | 2 +- .../org/apache/polaris/service/config/ServiceProducers.java | 2 +- .../service/catalog/iceberg/IcebergCatalogHandlerTest.java | 2 +- 8 files changed, 14 insertions(+), 11 deletions(-) diff --git a/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/NoOpMetricsReporter.java b/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/NoOpMetricsReporter.java index a4af60f809b..b733987fd52 100644 --- a/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/NoOpMetricsReporter.java +++ b/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/NoOpMetricsReporter.java @@ -20,8 +20,8 @@ import io.smallrye.common.annotation.Identifier; import jakarta.enterprise.context.ApplicationScoped; -import org.apache.polaris.service.metrics.IcebergMetricsReporter; -import org.apache.polaris.service.metrics.MetricsReportEnvelope; +import org.apache.polaris.spi.substrate.metrics.IcebergMetricsReporter; +import org.apache.polaris.spi.substrate.metrics.MetricsReportEnvelope; import org.jspecify.annotations.NonNull; /** diff --git a/extensions/metrics-reports/persistence/relational-jdbc/build.gradle.kts b/extensions/metrics-reports/persistence/relational-jdbc/build.gradle.kts index 5377d2f331c..fad6fb5a752 100644 --- a/extensions/metrics-reports/persistence/relational-jdbc/build.gradle.kts +++ b/extensions/metrics-reports/persistence/relational-jdbc/build.gradle.kts @@ -24,8 +24,8 @@ plugins { dependencies { implementation(project(":polaris-core")) + implementation(project(":polaris-spi")) implementation(project(":polaris-relational-jdbc")) - implementation(project(":polaris-runtime-service")) implementation(project(":polaris-extensions-metrics-reports")) implementation(platform(libs.iceberg.bom)) diff --git a/extensions/metrics-reports/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/metrics/jdbc/PersistingMetricsReporter.java b/extensions/metrics-reports/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/metrics/jdbc/PersistingMetricsReporter.java index ad7e0468699..21833c98ffd 100644 --- a/extensions/metrics-reports/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/metrics/jdbc/PersistingMetricsReporter.java +++ b/extensions/metrics-reports/persistence/relational-jdbc/src/main/java/org/apache/polaris/extension/metrics/jdbc/PersistingMetricsReporter.java @@ -31,8 +31,8 @@ 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.apache.polaris.service.metrics.IcebergMetricsReporter; -import org.apache.polaris.service.metrics.MetricsReportEnvelope; +import org.apache.polaris.spi.substrate.metrics.IcebergMetricsReporter; +import org.apache.polaris.spi.substrate.metrics.MetricsReportEnvelope; import org.jspecify.annotations.NonNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/runtime/service/build.gradle.kts b/runtime/service/build.gradle.kts index e85068a982f..ce447a8bdad 100644 --- a/runtime/service/build.gradle.kts +++ b/runtime/service/build.gradle.kts @@ -26,12 +26,14 @@ plugins { dependencies { implementation(project(":polaris-core")) + implementation(project(":polaris-spi")) implementation(project(":polaris-api-management-model")) implementation(project(":polaris-api-management-service")) implementation(project(":polaris-api-iceberg-service")) implementation(project(":polaris-api-catalog-service")) runtimeOnly(project(":polaris-relational-jdbc")) + runtimeOnly(project(":polaris-extensions-metrics-reports")) implementation(project(":polaris-runtime-defaults")) implementation(project(":polaris-runtime-common")) @@ -180,6 +182,7 @@ dependencies { testImplementation(project(":polaris-persistence-nosql-impl")) testFixturesImplementation(project(":polaris-core")) + testFixturesImplementation(project(":polaris-spi")) testFixturesImplementation(project(":polaris-api-management-model")) testFixturesImplementation(project(":polaris-api-management-service")) testFixturesImplementation(project(":polaris-api-iceberg-service")) diff --git a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java index d127bc0bb75..0c73256f68c 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java @@ -132,10 +132,10 @@ import org.apache.polaris.service.http.IfNoneMatch; import org.apache.polaris.service.idempotency.EntityIdempotency; import org.apache.polaris.service.idempotency.IdempotencyRequestContext; -import org.apache.polaris.service.metrics.IcebergMetricsReporter; -import org.apache.polaris.service.metrics.MetricType; -import org.apache.polaris.service.metrics.MetricsReportEnvelope; import org.apache.polaris.service.types.NotificationRequest; +import org.apache.polaris.spi.substrate.metrics.IcebergMetricsReporter; +import org.apache.polaris.spi.substrate.metrics.MetricType; +import org.apache.polaris.spi.substrate.metrics.MetricsReportEnvelope; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import org.slf4j.Logger; diff --git a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerFactory.java b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerFactory.java index b19bbc4c287..2c1f9470910 100644 --- a/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerFactory.java +++ b/runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerFactory.java @@ -39,7 +39,7 @@ import org.apache.polaris.service.config.ReservedProperties; import org.apache.polaris.service.events.EventAttributeMap; import org.apache.polaris.service.idempotency.IdempotencyRequestContext; -import org.apache.polaris.service.metrics.IcebergMetricsReporter; +import org.apache.polaris.spi.substrate.metrics.IcebergMetricsReporter; @RequestScoped public class IcebergCatalogHandlerFactory { 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 166a3b45b27..1990703f2e0 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 @@ -75,7 +75,6 @@ import org.apache.polaris.service.context.RealmContextResolver; import org.apache.polaris.service.credentials.PolarisCredentialManagerConfiguration; import org.apache.polaris.service.events.PolarisEventListenerConfiguration; -import org.apache.polaris.service.metrics.IcebergMetricsReporter; import org.apache.polaris.service.persistence.PersistenceConfiguration; import org.apache.polaris.service.ratelimiter.RateLimiter; import org.apache.polaris.service.ratelimiter.RateLimiterFilterConfiguration; @@ -88,6 +87,7 @@ import org.apache.polaris.service.storage.aws.StsClientsPool; import org.apache.polaris.service.task.TaskHandlerConfiguration; import org.apache.polaris.service.tracing.RequestIdFilter; +import org.apache.polaris.spi.substrate.metrics.IcebergMetricsReporter; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.context.ManagedExecutor; import org.eclipse.microprofile.context.ThreadContext; diff --git a/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerTest.java b/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerTest.java index a72206efad0..946803d31f6 100644 --- a/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerTest.java +++ b/runtime/service/src/test/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandlerTest.java @@ -89,7 +89,7 @@ import org.apache.polaris.service.events.EventAttributeMap; import org.apache.polaris.service.idempotency.IdempotencyConfiguration; import org.apache.polaris.service.idempotency.IdempotencyRequestContext; -import org.apache.polaris.service.metrics.IcebergMetricsReporter; +import org.apache.polaris.spi.substrate.metrics.IcebergMetricsReporter; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; From e4c6ff87f7d532db7e94d8f25ca383a6b1c4d227 Mon Sep 17 00:00:00 2001 From: flyingImer <1973868+flyingImer@users.noreply.github.com> Date: Fri, 31 Jul 2026 01:36:24 +0000 Subject: [PATCH 4/6] fix(metrics): point the reporting log category at the actual logger quarkus.log.category."org.apache.polaris.service.reporting".level=OFF targets a package that only ever held MetricsReportingConfiguration (a config interface, no logger), so it silences nothing. The actual reporter logs under LoggingMetricsReporter, whose class-level javadoc already documents its logger category as org.apache.polaris.extension.metrics.reports. Point the OFF setting there instead, so the shipped default matches what the reporter documents about itself. Pre-existing bug, uncovered by the SPI move in the two preceding commits, not caused by it. --- runtime/defaults/src/main/resources/application.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime/defaults/src/main/resources/application.properties b/runtime/defaults/src/main/resources/application.properties index 060ee4d9024..048ddba8b79 100644 --- a/runtime/defaults/src/main/resources/application.properties +++ b/runtime/defaults/src/main/resources/application.properties @@ -351,7 +351,7 @@ polaris.credential-manager.type=default # Configuration for the behaviour of the metrics endpoint polaris.iceberg-metrics.reporting.type=default # Set to INFO if you want to see iceberg metric reports logged -quarkus.log.category."org.apache.polaris.service.reporting".level=OFF +quarkus.log.category."org.apache.polaris.extension.metrics.reports".level=OFF quarkus.arc.ignored-split-packages=\ org.apache.polaris.service.catalog.api,\ From adb87dd749361020e41c33d8f1bafe6dc70a75c1 Mon Sep 17 00:00:00 2001 From: flyingImer <1973868+flyingImer@users.noreply.github.com> Date: Fri, 31 Jul 2026 01:40:04 +0000 Subject: [PATCH 5/6] refactor(metrics): make the out-of-the-box reporter a no-op Now that IcebergMetricsReporter, LoggingMetricsReporter, and NoOpMetricsReporter are all peers in extensions/metrics-reports/base, "which one runs when nobody configures anything" is a choice that can be made on its own merits rather than following from which impl happened to already live in runtime/service. Swap which class owns the @Identifier("default") value: NoOpMetricsReporter takes it, LoggingMetricsReporter moves to @Identifier("logging"). polaris.iceberg-metrics.reporting.type's own default value, and the application.properties line that sets it, are both left as "default". That string stays a stable, always-valid selection; it now just resolves to the quiet choice instead of the logging one. Deployments that already set the property explicitly (to "default", "logging", or "persisting") are unaffected either way. Verified against org.apache.polaris.service.it.RestCatalogFileIT: testSendMetricsReport still returns 204 with no reporter configured, and (checking the raw test log) no longer logs the report, confirming the no-op path is actually selected and the request still succeeds. --- CHANGELOG.md | 4 ++++ .../extension/metrics/reports/LoggingMetricsReporter.java | 7 +++---- .../extension/metrics/reports/NoOpMetricsReporter.java | 5 +++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8d9f92b5c7..d9ff452810c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,10 @@ request adding CHANGELOG notes for breaking (!) changes and possibly other secti UPDATE polaris_schema.version SET version_value = 5 WHERE version_key = 'version'; ``` See the Relational JDBC metastore documentation for details. +- `polaris.iceberg-metrics.reporting.type` still defaults to `default`, but that value now resolves + to a no-op reporter rather than the logging one, so Iceberg scan and commit reports posted to the + metrics endpoint are discarded out of the box. Set the property to `logging` to keep the previous + behavior. ### Breaking changes - Removed the `--schema-version` (`-v`) option from the admin tool's `bootstrap` command. New realms diff --git a/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java b/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java index 505a9c73842..8418ce832b8 100644 --- a/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java +++ b/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java @@ -29,11 +29,10 @@ import org.slf4j.LoggerFactory; /** - * Default implementation of {@link IcebergMetricsReporter} that logs metrics to the configured - * logger. + * Implementation of {@link IcebergMetricsReporter} that logs metrics to the configured logger. * *
This implementation is selected when {@code polaris.iceberg-metrics.reporting.type} is set to - * {@code "default"} (the default value). + * {@code "logging"}. * *
By default, logging is disabled. To enable metrics logging, set the logger level for {@code * org.apache.polaris.extension.metrics.reports} to {@code INFO} in your logging configuration. @@ -41,7 +40,7 @@ * @see IcebergMetricsReporter */ @ApplicationScoped -@Identifier("default") +@Identifier("logging") public class LoggingMetricsReporter implements IcebergMetricsReporter { private static final Logger LOGGER = LoggerFactory.getLogger(LoggingMetricsReporter.class); diff --git a/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/NoOpMetricsReporter.java b/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/NoOpMetricsReporter.java index b733987fd52..3b68320cd36 100644 --- a/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/NoOpMetricsReporter.java +++ b/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/NoOpMetricsReporter.java @@ -27,10 +27,11 @@ /** * No-op implementation of {@link IcebergMetricsReporter} that silently discards all metrics. * - *
Selected when {@code polaris.iceberg-metrics.reporting.type} is set to {@code "no-op"}. + *
Selected by default, or when {@code polaris.iceberg-metrics.reporting.type} is explicitly set + * to {@code "default"}. */ @ApplicationScoped -@Identifier("no-op") +@Identifier("default") public class NoOpMetricsReporter implements IcebergMetricsReporter { @Override From 0c78d663960de39233f91d76a54674f3756be38f Mon Sep 17 00:00:00 2001 From: flyingImer <1973868+flyingImer@users.noreply.github.com> Date: Fri, 31 Jul 2026 03:14:56 +0000 Subject: [PATCH 6/6] refactor(metrics): drop the logging reporter's silence-by-default gate Before this line of commits, LoggingMetricsReporter was the ambient default: every deployment that configured nothing got it, so silencing its logger by default (via a log-category override, on top of already selecting it) protected against every unconfigured install being noisy out of the box. Now that a no-op reporter is the ambient default, reaching LoggingMetricsReporter at all requires deliberately setting polaris.iceberg-metrics.reporting.type=logging. At that point the original rationale for a second, separate opt-in (bumping a log category to INFO) no longer applies: nobody reaches this reporter without already having made one explicit choice. This also brings it in line with its sibling opt-in reporter, PersistingMetricsReporter, which performs its own purpose (persisting) immediately upon selection with no equivalent secondary gate. Removes the quarkus.log.category."org.apache.polaris.extension.metrics.reports".level=OFF override, so selecting "logging" now logs at INFO right away, matching the root log level like any other unconfigured logger. Updates LoggingMetricsReporter's javadoc: it previously promised logging was disabled by default, a promise the override existed to keep and that no longer applies once the override is gone. --- CHANGELOG.md | 4 +++- .../extension/metrics/reports/LoggingMetricsReporter.java | 5 +---- runtime/defaults/src/main/resources/application.properties | 2 -- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9ff452810c..460f030cfec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,7 +45,9 @@ request adding CHANGELOG notes for breaking (!) changes and possibly other secti - `polaris.iceberg-metrics.reporting.type` still defaults to `default`, but that value now resolves to a no-op reporter rather than the logging one, so Iceberg scan and commit reports posted to the metrics endpoint are discarded out of the box. Set the property to `logging` to keep the previous - behavior. + behavior; it emits at INFO on its own, with no logger-category configuration needed. The + `quarkus.log.category."org.apache.polaris.service.reporting".level=OFF` line that shipped in + application.properties has been removed, since it named a package that contains no logger. ### Breaking changes - Removed the `--schema-version` (`-v`) option from the admin tool's `bootstrap` command. New realms diff --git a/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java b/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java index 8418ce832b8..be0f01afed3 100644 --- a/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java +++ b/extensions/metrics-reports/base/src/main/java/org/apache/polaris/extension/metrics/reports/LoggingMetricsReporter.java @@ -32,10 +32,7 @@ * Implementation of {@link IcebergMetricsReporter} that logs metrics to the configured logger. * *
This implementation is selected when {@code polaris.iceberg-metrics.reporting.type} is set to - * {@code "logging"}. - * - *
By default, logging is disabled. To enable metrics logging, set the logger level for {@code - * org.apache.polaris.extension.metrics.reports} to {@code INFO} in your logging configuration. + * {@code "logging"}. Each report is logged at {@code INFO}. * * @see IcebergMetricsReporter */ diff --git a/runtime/defaults/src/main/resources/application.properties b/runtime/defaults/src/main/resources/application.properties index 048ddba8b79..aacbe016425 100644 --- a/runtime/defaults/src/main/resources/application.properties +++ b/runtime/defaults/src/main/resources/application.properties @@ -350,8 +350,6 @@ polaris.credential-manager.type=default # Configuration for the behaviour of the metrics endpoint polaris.iceberg-metrics.reporting.type=default -# Set to INFO if you want to see iceberg metric reports logged -quarkus.log.category."org.apache.polaris.extension.metrics.reports".level=OFF quarkus.arc.ignored-split-packages=\ org.apache.polaris.service.catalog.api,\