Skip to content

Commit 8940129

Browse files
committed
Added interface for reporting metrics
1 parent ba08463 commit 8940129

File tree

8 files changed

+139
-5
lines changed

8 files changed

+139
-5
lines changed

runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogAdapter.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
import org.apache.polaris.service.events.listeners.PolarisEventListener;
8888
import org.apache.polaris.service.http.IcebergHttpUtil;
8989
import org.apache.polaris.service.http.IfNoneMatch;
90+
import org.apache.polaris.service.reporting.MetricsReporter;
9091
import org.apache.polaris.service.types.CommitTableRequest;
9192
import org.apache.polaris.service.types.CommitViewRequest;
9293
import org.apache.polaris.service.types.NotificationRequest;
@@ -150,6 +151,7 @@ public class IcebergCatalogAdapter
150151
private final Instance<ExternalCatalogFactory> externalCatalogFactories;
151152
private final PolarisEventListener polarisEventListener;
152153
private final AccessConfigProvider accessConfigProvider;
154+
private final MetricsReporter metricsReporter;
153155

154156
@Inject
155157
public IcebergCatalogAdapter(
@@ -167,7 +169,8 @@ public IcebergCatalogAdapter(
167169
CatalogHandlerUtils catalogHandlerUtils,
168170
@Any Instance<ExternalCatalogFactory> externalCatalogFactories,
169171
PolarisEventListener polarisEventListener,
170-
AccessConfigProvider accessConfigProvider) {
172+
AccessConfigProvider accessConfigProvider,
173+
MetricsReporter metricsReporter) {
171174
this.diagnostics = diagnostics;
172175
this.realmContext = realmContext;
173176
this.callContext = callContext;
@@ -184,6 +187,7 @@ public IcebergCatalogAdapter(
184187
this.externalCatalogFactories = externalCatalogFactories;
185188
this.polarisEventListener = polarisEventListener;
186189
this.accessConfigProvider = accessConfigProvider;
190+
this.metricsReporter = metricsReporter;
187191
}
188192

189193
/**
@@ -224,7 +228,8 @@ IcebergCatalogHandler newHandlerWrapper(SecurityContext securityContext, String
224228
catalogHandlerUtils,
225229
externalCatalogFactories,
226230
polarisEventListener,
227-
accessConfigProvider);
231+
accessConfigProvider,
232+
metricsReporter);
228233
}
229234

230235
@Override
@@ -755,7 +760,13 @@ public Response reportMetrics(
755760
ReportMetricsRequest reportMetricsRequest,
756761
RealmContext realmContext,
757762
SecurityContext securityContext) {
758-
return Response.status(Response.Status.NO_CONTENT).build();
763+
return withCatalog(
764+
securityContext,
765+
prefix,
766+
catalog -> {
767+
catalog.reportMetric(prefix, namespace, table, reportMetricsRequest);
768+
return Response.status(Response.Status.NO_CONTENT).build();
769+
});
759770
}
760771

761772
@Override

runtime/service/src/main/java/org/apache/polaris/service/catalog/iceberg/IcebergCatalogHandler.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import org.apache.iceberg.rest.requests.CreateViewRequest;
6969
import org.apache.iceberg.rest.requests.RegisterTableRequest;
7070
import org.apache.iceberg.rest.requests.RenameTableRequest;
71+
import org.apache.iceberg.rest.requests.ReportMetricsRequest;
7172
import org.apache.iceberg.rest.requests.UpdateNamespacePropertiesRequest;
7273
import org.apache.iceberg.rest.requests.UpdateTableRequest;
7374
import org.apache.iceberg.rest.responses.CreateNamespaceResponse;
@@ -112,6 +113,7 @@
112113
import org.apache.polaris.service.events.listeners.PolarisEventListener;
113114
import org.apache.polaris.service.http.IcebergHttpUtil;
114115
import org.apache.polaris.service.http.IfNoneMatch;
116+
import org.apache.polaris.service.reporting.MetricsReporter;
115117
import org.apache.polaris.service.types.NotificationRequest;
116118
import org.slf4j.Logger;
117119
import org.slf4j.LoggerFactory;
@@ -140,7 +142,7 @@ public class IcebergCatalogHandler extends CatalogHandler implements AutoCloseab
140142
private final CatalogHandlerUtils catalogHandlerUtils;
141143
private final PolarisEventListener polarisEventListener;
142144
private final AccessConfigProvider accessConfigProvider;
143-
145+
private final MetricsReporter metricsReporter;
144146
// Catalog instance will be initialized after authorizing resolver successfully resolves
145147
// the catalog entity.
146148
protected Catalog baseCatalog = null;
@@ -164,7 +166,8 @@ public IcebergCatalogHandler(
164166
CatalogHandlerUtils catalogHandlerUtils,
165167
Instance<ExternalCatalogFactory> externalCatalogFactories,
166168
PolarisEventListener polarisEventListener,
167-
AccessConfigProvider accessConfigProvider) {
169+
AccessConfigProvider accessConfigProvider,
170+
MetricsReporter metricsReporter) {
168171
super(
169172
diagnostics,
170173
callContext,
@@ -180,6 +183,7 @@ public IcebergCatalogHandler(
180183
this.catalogHandlerUtils = catalogHandlerUtils;
181184
this.polarisEventListener = polarisEventListener;
182185
this.accessConfigProvider = accessConfigProvider;
186+
this.metricsReporter = metricsReporter;
183187
}
184188

185189
private CatalogEntity getResolvedCatalogEntity() {
@@ -589,6 +593,11 @@ public LoadTableResponse registerTable(Namespace namespace, RegisterTableRequest
589593
return catalogHandlerUtils.registerTable(baseCatalog, namespace, request);
590594
}
591595

596+
public void reportMetric(
597+
String prefix, String namespace, String table, ReportMetricsRequest reportMetricsRequest) {
598+
metricsReporter.reportMetric(prefix, namespace, table, reportMetricsRequest);
599+
}
600+
592601
public boolean sendNotification(TableIdentifier identifier, NotificationRequest request) {
593602
PolarisAuthorizableOperation op = PolarisAuthorizableOperation.SEND_NOTIFICATIONS;
594603

runtime/service/src/main/java/org/apache/polaris/service/config/ServiceProducers.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@
7979
import org.apache.polaris.service.ratelimiter.RateLimiterFilterConfiguration;
8080
import org.apache.polaris.service.ratelimiter.TokenBucketConfiguration;
8181
import org.apache.polaris.service.ratelimiter.TokenBucketFactory;
82+
import org.apache.polaris.service.reporting.MetricsReporter;
83+
import org.apache.polaris.service.reporting.MetricsReportingConfiguration;
8284
import org.apache.polaris.service.secrets.SecretsManagerConfiguration;
8385
import org.apache.polaris.service.storage.StorageConfiguration;
8486
import org.apache.polaris.service.storage.aws.S3AccessConfig;
@@ -405,4 +407,11 @@ public PolarisCredentialManager polarisCredentialManager(
405407
public void closeTaskExecutor(@Disposes @Identifier("task-executor") ManagedExecutor executor) {
406408
executor.close();
407409
}
410+
411+
@Produces
412+
@RequestScoped
413+
public MetricsReporter metricsReporter(
414+
MetricsReportingConfiguration config, @Any Instance<MetricsReporter> reporters) {
415+
return reporters.select(Identifier.Literal.of(config.type())).get();
416+
}
408417
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.apache.polaris.service.reporting;
2+
3+
import io.smallrye.common.annotation.Identifier;
4+
import jakarta.enterprise.context.RequestScoped;
5+
import org.apache.iceberg.rest.requests.ReportMetricsRequest;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
@RequestScoped
10+
@Identifier("default")
11+
public class DefaultMetricsReporter implements MetricsReporter {
12+
private static final Logger LOGGER = LoggerFactory.getLogger(DefaultMetricsReporter.class);
13+
14+
@Override
15+
public void reportMetric(
16+
String prefix, String namespace, String table, ReportMetricsRequest reportMetricsRequest) {
17+
// Do Nothing
18+
}
19+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.apache.polaris.service.reporting;
2+
3+
import io.smallrye.common.annotation.Identifier;
4+
import jakarta.enterprise.context.RequestScoped;
5+
import org.apache.iceberg.rest.requests.ReportMetricsRequest;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
@RequestScoped
10+
@Identifier("logging")
11+
public class LoggingMetricsReporter implements MetricsReporter {
12+
private static final Logger LOGGER = LoggerFactory.getLogger(LoggingMetricsReporter.class);
13+
14+
@Override
15+
public void reportMetric(
16+
String prefix, String namespace, String table, ReportMetricsRequest reportMetricsRequest) {
17+
LOGGER.info(prefix);
18+
LOGGER.info(namespace);
19+
LOGGER.info(table);
20+
LOGGER.info(reportMetricsRequest.toString());
21+
}
22+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.apache.polaris.service.reporting;
2+
3+
import org.apache.iceberg.rest.requests.ReportMetricsRequest;
4+
5+
public interface MetricsReporter {
6+
public void reportMetric(
7+
String prefix, String namespace, String table, ReportMetricsRequest reportMetricsRequest);
8+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.apache.polaris.service.reporting;
2+
3+
import io.smallrye.config.ConfigMapping;
4+
import io.smallrye.config.WithDefault;
5+
6+
@ConfigMapping(prefix = "polaris.metrics.reporting")
7+
public interface MetricsReportingConfiguration {
8+
@WithDefault("default")
9+
String type();
10+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.apache.polaris.service.reporting;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import com.google.common.collect.ImmutableMap;
6+
import io.quarkus.test.junit.QuarkusTest;
7+
import io.quarkus.test.junit.TestProfile;
8+
import jakarta.inject.Inject;
9+
import java.util.Map;
10+
import org.junit.jupiter.api.Test;
11+
12+
@QuarkusTest
13+
public class MetricsReportingConfigurationTest {
14+
@Inject MetricsReportingConfiguration metricsConfig;
15+
16+
@Test
17+
@TestProfile(MetricsReportingConfiguration.DefaultProfile.class)
18+
void testDefault() {
19+
String type = metricsConfig.type();
20+
assertThat(type).isEqualTo("default");
21+
}
22+
23+
@Test
24+
@TestProfile(MetricsReportingConfiguration.LoggingProfile.class)
25+
void testLogging() {
26+
assertThat(metricsConfig.type()).isEqualTo("logging");
27+
}
28+
29+
public static class DefaultProfile implements QuarkusTestProfile {
30+
@Override
31+
public Map<String, String> getConfigOverrides() {
32+
return ImmutableMap.<String, String>builder()
33+
.put("polaris.metrics.reporting.type", "default")
34+
.build();
35+
}
36+
}
37+
38+
public static class LoggingProfile implements QuarkusTestProfile {
39+
@Override
40+
public Map<String, String> getConfigOverrides() {
41+
return ImmutableMap.<String, String>builder()
42+
.put("polaris.metrics.reporting.type", "logging")
43+
.build();
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)