diff --git a/CHANGELOG.md b/CHANGELOG.md index a8d9f92b5c7..460f030cfec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,12 @@ 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; 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/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/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 83% 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..be0f01afed3 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,30 +16,28 @@ * 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; /** - * 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). - * - *
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 */ @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 a4af60f809b..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 @@ -20,17 +20,18 @@ 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; /** * 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 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 { 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/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/runtime/defaults/src/main/resources/application.properties b/runtime/defaults/src/main/resources/application.properties index 060ee4d9024..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.service.reporting".level=OFF quarkus.arc.ignored-split-packages=\ org.apache.polaris.service.catalog.api,\ 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; 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;