Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions bom/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ dependencies {
api(project(":polaris-config-docs-generator"))

api(project(":polaris-core"))
api(project(":polaris-spi"))

api(project(":polaris-relational-jdbc"))

Expand Down
3 changes: 2 additions & 1 deletion extensions/metrics-reports/base/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
* <p>This implementation is selected when {@code polaris.iceberg-metrics.reporting.type} is set to
* {@code "default"} (the default value).
*
* <p>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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.
*
* <p>Selected when {@code polaris.iceberg-metrics.reporting.type} is set to {@code "no-op"}.
* <p>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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions gradle/projects.main.properties
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

polaris-bom=bom
polaris-core=polaris-core
polaris-spi=spi

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar to my other comment: polaris-spi feels too generic.

In this case we're adding a module needed by runtime/service, which is why I proposed to name it polaris-service-spi (path: runtime/service-spi) in the old comment thread. "Service" here meaning REST Catalog services.

Alternative: polaris-rest-spi (path: spi/rest).

Alternative: polaris-catalog-spi (path: spi/catalog).

WDYT?

polaris-api-iceberg-service=api/iceberg-service
polaris-api-management-model=api/management-model
polaris-api-management-service=api/management-service
Expand Down
2 changes: 0 additions & 2 deletions runtime/defaults/src/main/resources/application.properties
Original file line number Diff line number Diff line change
Expand Up @@ -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

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unrelated change?


quarkus.arc.ignored-split-packages=\
org.apache.polaris.service.catalog.api,\
Expand Down
3 changes: 3 additions & 0 deletions runtime/service/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
Expand Down Expand Up @@ -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"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -389,7 +389,7 @@
return catalogHandlerUtils().listTables(baseCatalog, namespace);
}

/**

Check warning on line 392 in runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java

View workflow job for this annotation

GitHub Actions / CI/PR / Gradle Build Checks

@return tag cannot be used in method with void return type.
* Create a table.
*
* @param namespace the namespace to create the table in
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
36 changes: 36 additions & 0 deletions spi/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -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") }
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is substrate?

Why not org.apache.polaris.metrics.spi?

I believe the "owner" module ("metrics" in this case) has higher weight than "spi" because an SPI is needed by a particular module. I do not think we can talk about "general SPI" in Polaris. It is always grounded in a particular need in a particular module to access the pluggable service.


import com.google.common.annotations.Beta;
import org.jspecify.annotations.NonNull;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -28,8 +28,8 @@
*/
@Beta
public enum MetricType {
/** An Iceberg scan report ({@link org.apache.iceberg.metrics.ScanReport}). */

Check warning on line 31 in spi/src/main/java/org/apache/polaris/spi/substrate/metrics/MetricType.java

View workflow job for this annotation

GitHub Actions / CI/PR / Gradle Build Checks

reference not found: org.apache.iceberg.metrics.ScanReport
SCAN,
/** An Iceberg commit report ({@link org.apache.iceberg.metrics.CommitReport}). */

Check warning on line 33 in spi/src/main/java/org/apache/polaris/spi/substrate/metrics/MetricType.java

View workflow job for this annotation

GitHub Actions / CI/PR / Gradle Build Checks

reference not found: org.apache.iceberg.metrics.CommitReport
COMMIT
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -39,7 +39,7 @@
* @param tableId the internal Polaris ID of the table entity
* @param metricType the kind of metrics report ({@link MetricType#SCAN} or {@link
* MetricType#COMMIT})
* @param report the Iceberg metrics report ({@link org.apache.iceberg.metrics.ScanReport} or {@link

Check warning on line 42 in spi/src/main/java/org/apache/polaris/spi/substrate/metrics/MetricsReportEnvelope.java

View workflow job for this annotation

GitHub Actions / CI/PR / Gradle Build Checks

reference not found: org.apache.iceberg.metrics.CommitReport

Check warning on line 42 in spi/src/main/java/org/apache/polaris/spi/substrate/metrics/MetricsReportEnvelope.java

View workflow job for this annotation

GitHub Actions / CI/PR / Gradle Build Checks

reference not found: org.apache.iceberg.metrics.ScanReport
* org.apache.iceberg.metrics.CommitReport})
* @param receivedTimestamp the timestamp when the metrics were received by Polaris
*/
Expand Down
Loading