Skip to content

Commit 0072e18

Browse files
committed
Add metastore metrics to IcebergMetadata.getMetrics
1 parent f323516 commit 0072e18

File tree

4 files changed

+73
-0
lines changed

4 files changed

+73
-0
lines changed

plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/IcebergMetadata.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2328,6 +2328,12 @@ public Optional<Object> getInfo(ConnectorSession session, ConnectorTableHandle t
23282328
totalDeleteFiles));
23292329
}
23302330

2331+
@Override
2332+
public io.trino.spi.metrics.Metrics getMetrics(ConnectorSession session)
2333+
{
2334+
return catalog.getMetrics();
2335+
}
2336+
23312337
@Override
23322338
public void dropTable(ConnectorSession session, ConnectorTableHandle tableHandle)
23332339
{

plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/TrinoCatalog.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.trino.spi.connector.RelationColumnsMetadata;
2525
import io.trino.spi.connector.RelationCommentMetadata;
2626
import io.trino.spi.connector.SchemaTableName;
27+
import io.trino.spi.metrics.Metrics;
2728
import io.trino.spi.security.TrinoPrincipal;
2829
import jakarta.annotation.Nullable;
2930
import org.apache.iceberg.BaseTable;
@@ -200,4 +201,9 @@ void createMaterializedView(
200201
void updateColumnComment(ConnectorSession session, SchemaTableName schemaTableName, ColumnIdentity columnIdentity, Optional<String> comment);
201202

202203
Optional<CatalogSchemaTableName> redirectTable(ConnectorSession session, SchemaTableName tableName, String hiveCatalogName);
204+
205+
default Metrics getMetrics()
206+
{
207+
return Metrics.EMPTY;
208+
}
203209
}

plugin/trino-iceberg/src/main/java/io/trino/plugin/iceberg/catalog/hms/TrinoHiveCatalog.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
import io.trino.spi.connector.SchemaTableName;
5454
import io.trino.spi.connector.TableNotFoundException;
5555
import io.trino.spi.connector.ViewNotFoundException;
56+
import io.trino.spi.metrics.Metrics;
5657
import io.trino.spi.security.TrinoPrincipal;
5758
import io.trino.spi.type.TypeManager;
5859
import org.apache.iceberg.BaseTable;
@@ -880,6 +881,12 @@ public Optional<CatalogSchemaTableName> redirectTable(ConnectorSession session,
880881
return Optional.empty();
881882
}
882883

884+
@Override
885+
public Metrics getMetrics()
886+
{
887+
return metastore.getMetrics();
888+
}
889+
883890
@Override
884891
protected void invalidateTableCache(SchemaTableName schemaTableName)
885892
{

plugin/trino-iceberg/src/test/java/io/trino/plugin/iceberg/BaseIcebergConnectorTest.java

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
import io.trino.metadata.QualifiedObjectName;
3434
import io.trino.metadata.TableHandle;
3535
import io.trino.operator.OperatorStats;
36+
import io.trino.plugin.base.metrics.DistributionSnapshot;
37+
import io.trino.plugin.base.metrics.LongCount;
3638
import io.trino.plugin.hive.HiveCompressionCodec;
3739
import io.trino.plugin.hive.TestingHivePlugin;
3840
import io.trino.server.DynamicFilterService;
@@ -42,6 +44,7 @@
4244
import io.trino.spi.connector.ConstraintApplicationResult;
4345
import io.trino.spi.connector.SchemaTableName;
4446
import io.trino.spi.connector.TableNotFoundException;
47+
import io.trino.spi.metrics.Metrics;
4548
import io.trino.spi.predicate.Domain;
4649
import io.trino.spi.predicate.TupleDomain;
4750
import io.trino.sql.planner.Plan;
@@ -56,9 +59,11 @@
5659
import io.trino.testing.DistributedQueryRunner;
5760
import io.trino.testing.MaterializedResult;
5861
import io.trino.testing.MaterializedRow;
62+
import io.trino.testing.QueryFailedException;
5963
import io.trino.testing.QueryRunner;
6064
import io.trino.testing.QueryRunner.MaterializedResultWithPlan;
6165
import io.trino.testing.TestingConnectorBehavior;
66+
import io.trino.testing.TestingSession;
6267
import io.trino.testing.sql.TestTable;
6368
import org.apache.avro.Schema;
6469
import org.apache.avro.file.DataFileReader;
@@ -111,8 +116,10 @@
111116
import static com.google.common.collect.Iterables.getOnlyElement;
112117
import static com.google.common.collect.MoreCollectors.onlyElement;
113118
import static com.google.common.util.concurrent.Uninterruptibles.sleepUninterruptibly;
119+
import static io.airlift.units.Duration.succinctDuration;
114120
import static io.trino.SystemSessionProperties.DETERMINE_PARTITION_COUNT_FOR_WRITE_ENABLED;
115121
import static io.trino.SystemSessionProperties.ENABLE_DYNAMIC_FILTERING;
122+
import static io.trino.SystemSessionProperties.ITERATIVE_OPTIMIZER_TIMEOUT;
116123
import static io.trino.SystemSessionProperties.MAX_HASH_PARTITION_COUNT;
117124
import static io.trino.SystemSessionProperties.MAX_WRITER_TASK_COUNT;
118125
import static io.trino.SystemSessionProperties.SCALE_WRITERS;
@@ -179,6 +186,7 @@
179186
import static org.assertj.core.api.Assertions.assertThat;
180187
import static org.assertj.core.api.Assertions.assertThatThrownBy;
181188
import static org.assertj.core.api.Assertions.offset;
189+
import static org.assertj.core.api.Fail.fail;
182190
import static org.junit.jupiter.api.Assumptions.abort;
183191

184192
public abstract class BaseIcebergConnectorTest
@@ -9214,6 +9222,52 @@ public void testCreateTableWithDataLocationButObjectStoreLayoutDisabled()
92149222
"Data location can only be set when object store layout is enabled");
92159223
}
92169224

9225+
@Test
9226+
public void testCatalogMetadataMetrics()
9227+
{
9228+
MaterializedResultWithPlan result = getQueryRunner().executeWithPlan(
9229+
getSession(),
9230+
"SELECT count(*) FROM region r, nation n WHERE r.regionkey = n.regionkey");
9231+
Map<String, Metrics> metrics = getCatalogMetadataMetrics(result.queryId());
9232+
assertCountMetricExists(metrics, "iceberg", "metastore.all.time.total");
9233+
assertDistributionMetricExists(metrics, "iceberg", "metastore.all.time.distribution");
9234+
assertCountMetricExists(metrics, "iceberg", "metastore.getTable.time.total");
9235+
assertDistributionMetricExists(metrics, "iceberg", "metastore.getTable.time.distribution");
9236+
}
9237+
9238+
@Test
9239+
public void testCatalogMetadataMetricsWithOptimizerTimeoutExceeded()
9240+
{
9241+
String query = "SELECT count(*) FROM region r, nation n WHERE r.regionkey = n.regionkey";
9242+
try {
9243+
Session smallOptimizerTimeout = TestingSession.testSessionBuilder(getSession())
9244+
.setSystemProperty(ITERATIVE_OPTIMIZER_TIMEOUT, succinctDuration(1, MILLISECONDS).toString())
9245+
.build();
9246+
MaterializedResultWithPlan result = getQueryRunner().executeWithPlan(smallOptimizerTimeout, query);
9247+
fail(format("Expected query to fail: %s [QueryId: %s]", query, result.queryId()));
9248+
}
9249+
catch (QueryFailedException e) {
9250+
assertThat(e.getMessage()).contains("The optimizer exhausted the time limit");
9251+
Map<String, Metrics> metrics = getCatalogMetadataMetrics(e.getQueryId());
9252+
assertCountMetricExists(metrics, "iceberg", "metastore.all.time.total");
9253+
assertCountMetricExists(metrics, "iceberg", "metastore.getTable.time.total");
9254+
}
9255+
}
9256+
9257+
protected static void assertDistributionMetricExists(Map<String, Metrics> metrics, String catalog, String metricKey)
9258+
{
9259+
assertThat(metrics.get(catalog).getMetrics()).isNotEmpty();
9260+
assertThat(metrics.get(catalog).getMetrics()).containsKey(metricKey);
9261+
assertThat(((DistributionSnapshot) metrics.get(catalog).getMetrics().get(metricKey)).total()).isGreaterThan(0);
9262+
}
9263+
9264+
protected static void assertCountMetricExists(Map<String, Metrics> metrics, String catalog, String metricKey)
9265+
{
9266+
assertThat(metrics.get(catalog).getMetrics()).isNotEmpty();
9267+
assertThat(metrics.get(catalog).getMetrics()).containsKey(metricKey);
9268+
assertThat(((LongCount) metrics.get(catalog).getMetrics().get(metricKey)).getTotal()).isGreaterThan(0);
9269+
}
9270+
92179271
@Test
92189272
@Override
92199273
public void testSetFieldMapKeyType()

0 commit comments

Comments
 (0)