You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iceberg.apache.org by pv...@apache.org on 2026/06/23 16:24:45 UTC

(iceberg) branch main updated: Data: Add metrics reporter to generic scan builder (#16664)

This is an automated email from the ASF dual-hosted git repository.

pvary pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/iceberg.git


The following commit(s) were added to refs/heads/main by this push:
     new df6ea08200 Data: Add metrics reporter to generic scan builder (#16664)
df6ea08200 is described below

commit df6ea0820030d217d5f645469419cdbb3f54a41f
Author: Aleksandr Efimov <ho...@gmail.com>
AuthorDate: Tue Jun 23 19:24:38 2026 +0300

    Data: Add metrics reporter to generic scan builder (#16664)
---
 .../java/org/apache/iceberg/data/IcebergGenerics.java |  6 ++++++
 .../java/org/apache/iceberg/data/TestLocalScan.java   | 19 +++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/data/src/main/java/org/apache/iceberg/data/IcebergGenerics.java b/data/src/main/java/org/apache/iceberg/data/IcebergGenerics.java
index 352658752d..7bf8f5c778 100644
--- a/data/src/main/java/org/apache/iceberg/data/IcebergGenerics.java
+++ b/data/src/main/java/org/apache/iceberg/data/IcebergGenerics.java
@@ -24,6 +24,7 @@ import org.apache.iceberg.Table;
 import org.apache.iceberg.TableScan;
 import org.apache.iceberg.expressions.Expression;
 import org.apache.iceberg.io.CloseableIterable;
+import org.apache.iceberg.metrics.MetricsReporter;
 
 public class IcebergGenerics {
   private IcebergGenerics() {}
@@ -96,6 +97,11 @@ public class IcebergGenerics {
       return this;
     }
 
+    public ScanBuilder metricsReporter(MetricsReporter reporter) {
+      this.tableScan = tableScan.metricsReporter(reporter);
+      return this;
+    }
+
     public CloseableIterable<Record> build() {
       return new TableScanIterable(tableScan, reuseContainers);
     }
diff --git a/data/src/test/java/org/apache/iceberg/data/TestLocalScan.java b/data/src/test/java/org/apache/iceberg/data/TestLocalScan.java
index 0f85596afb..aee5eb5fa7 100644
--- a/data/src/test/java/org/apache/iceberg/data/TestLocalScan.java
+++ b/data/src/test/java/org/apache/iceberg/data/TestLocalScan.java
@@ -58,7 +58,10 @@ import org.apache.iceberg.Tables;
 import org.apache.iceberg.expressions.Expressions;
 import org.apache.iceberg.hadoop.HadoopInputFile;
 import org.apache.iceberg.hadoop.HadoopTables;
+import org.apache.iceberg.io.CloseableIterable;
 import org.apache.iceberg.io.DataWriter;
+import org.apache.iceberg.metrics.InMemoryMetricsReporter;
+import org.apache.iceberg.metrics.ScanReport;
 import org.apache.iceberg.relocated.com.google.common.base.Preconditions;
 import org.apache.iceberg.relocated.com.google.common.collect.ImmutableList;
 import org.apache.iceberg.relocated.com.google.common.collect.ImmutableMap;
@@ -289,6 +292,22 @@ public class TestLocalScan {
     assertThat(records).as("Random record set should match").isEqualTo(expected);
   }
 
+  @TestTemplate
+  public void testScanMetricsReporter() throws IOException {
+    InMemoryMetricsReporter reporter = new InMemoryMetricsReporter();
+
+    try (CloseableIterable<Record> results =
+        IcebergGenerics.read(sharedTable).metricsReporter(reporter).build()) {
+      assertThat(Sets.newHashSet(results)).hasSize(9);
+    }
+
+    ScanReport scanReport = reporter.scanReport();
+    assertThat(scanReport).isNotNull();
+    assertThat(scanReport.tableName()).isEqualTo(sharedTable.name());
+    assertThat(scanReport.snapshotId()).isEqualTo(sharedTable.currentSnapshot().snapshotId());
+    assertThat(scanReport.scanMetrics().resultDataFiles().value()).isEqualTo(3);
+  }
+
   @TestTemplate
   public void testFilter() {
     Iterable<Record> result = IcebergGenerics.read(sharedTable).where(lessThan("id", 3)).build();