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

lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new 32da0356d2 [core] Introduce CacheStats and expose ScanStats (#4678)
32da0356d2 is described below

commit 32da0356d2a93d033252b0ef998b51b69b8a3f9c
Author: Jiao Mingye <[email protected]>
AuthorDate: Wed Dec 18 10:46:39 2024 +0800

    [core] Introduce CacheStats and expose ScanStats (#4678)
---
 .../generated/catalog_configuration.html           |  2 +-
 .../org/apache/paimon/options/CatalogOptions.java  |  2 +-
 .../org/apache/paimon/catalog/CachingCatalog.java  | 66 ++++++++++++++++++++++
 .../paimon/operation/AbstractFileStoreScan.java    |  2 +
 .../metrics/CacheMetrics.java}                     | 33 ++++++++---
 .../paimon/operation/metrics/ScanMetrics.java      | 23 ++++++--
 .../java/org/apache/paimon/utils/ObjectsCache.java | 12 ++++
 .../java/org/apache/paimon/utils/ObjectsFile.java  |  8 +++
 .../org/apache/paimon/utils/SegmentsCache.java     | 10 ++++
 ...cRegistryImplTest.java => MetricGroupTest.java} |  8 +--
 .../apache/paimon/metrics/TestMetricRegistry.java} |  4 +-
 .../operation/metrics/CommitMetricsTest.java       |  4 +-
 .../operation/metrics/CompactionMetricsTest.java   |  4 +-
 .../paimon/operation/metrics/ScanMetricsTest.java  |  8 ++-
 .../org/apache/paimon/utils/ObjectsCacheTest.java  |  9 ++-
 15 files changed, 166 insertions(+), 29 deletions(-)

diff --git a/docs/layouts/shortcodes/generated/catalog_configuration.html 
b/docs/layouts/shortcodes/generated/catalog_configuration.html
index 6355c95586..03efd178b8 100644
--- a/docs/layouts/shortcodes/generated/catalog_configuration.html
+++ b/docs/layouts/shortcodes/generated/catalog_configuration.html
@@ -30,7 +30,7 @@ under the License.
             <td><h5>cache-enabled</h5></td>
             <td style="word-wrap: break-word;">true</td>
             <td>Boolean</td>
-            <td>Controls whether the catalog will cache databases, tables and 
manifests.</td>
+            <td>Controls whether the catalog will cache databases, tables, 
manifests and partitions.</td>
         </tr>
         <tr>
             <td><h5>cache.expiration-interval</h5></td>
diff --git 
a/paimon-common/src/main/java/org/apache/paimon/options/CatalogOptions.java 
b/paimon-common/src/main/java/org/apache/paimon/options/CatalogOptions.java
index b22274e011..d0cfbeaf39 100644
--- a/paimon-common/src/main/java/org/apache/paimon/options/CatalogOptions.java
+++ b/paimon-common/src/main/java/org/apache/paimon/options/CatalogOptions.java
@@ -87,7 +87,7 @@ public class CatalogOptions {
                     .booleanType()
                     .defaultValue(true)
                     .withDescription(
-                            "Controls whether the catalog will cache 
databases, tables and manifests.");
+                            "Controls whether the catalog will cache 
databases, tables, manifests and partitions.");
 
     public static final ConfigOption<Duration> CACHE_EXPIRATION_INTERVAL_MS =
             key("cache.expiration-interval")
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/catalog/CachingCatalog.java 
b/paimon-core/src/main/java/org/apache/paimon/catalog/CachingCatalog.java
index 99540cf0ce..5c9c785493 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/CachingCatalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/CachingCatalog.java
@@ -312,6 +312,30 @@ public class CachingCatalog extends DelegateCatalog {
         }
     }
 
+    public CacheSizes estimatedCacheSizes() {
+        long databaseCacheSize = databaseCache.estimatedSize();
+        long tableCacheSize = tableCache.estimatedSize();
+        long manifestCacheSize = 0L;
+        long manifestCacheBytes = 0L;
+        if (manifestCache != null) {
+            manifestCacheSize = manifestCache.getSegmentCacheSize();
+            manifestCacheBytes = manifestCache.getSegmentCacheBytes();
+        }
+        long partitionCacheSize = 0L;
+        if (partitionCache != null) {
+            for (Map.Entry<Identifier, List<PartitionEntry>> entry :
+                    partitionCache.asMap().entrySet()) {
+                partitionCacheSize += entry.getValue().size();
+            }
+        }
+        return new CacheSizes(
+                databaseCacheSize,
+                tableCacheSize,
+                manifestCacheSize,
+                manifestCacheBytes,
+                partitionCacheSize);
+    }
+
     // ================================== refresh 
================================================
     // following caches will affect the latency of table, so refresh method is 
provided for engine
 
@@ -321,4 +345,46 @@ public class CachingCatalog extends DelegateCatalog {
             partitionCache.put(identifier, result);
         }
     }
+
+    /** Cache sizes of a caching catalog. */
+    public static class CacheSizes {
+        private final long databaseCacheSize;
+        private final long tableCacheSize;
+        private final long manifestCacheSize;
+        private final long manifestCacheBytes;
+        private final long partitionCacheSize;
+
+        public CacheSizes(
+                long databaseCacheSize,
+                long tableCacheSize,
+                long manifestCacheSize,
+                long manifestCacheBytes,
+                long partitionCacheSize) {
+            this.databaseCacheSize = databaseCacheSize;
+            this.tableCacheSize = tableCacheSize;
+            this.manifestCacheSize = manifestCacheSize;
+            this.manifestCacheBytes = manifestCacheBytes;
+            this.partitionCacheSize = partitionCacheSize;
+        }
+
+        public long databaseCacheSize() {
+            return databaseCacheSize;
+        }
+
+        public long tableCacheSize() {
+            return tableCacheSize;
+        }
+
+        public long manifestCacheSize() {
+            return manifestCacheSize;
+        }
+
+        public long manifestCacheBytes() {
+            return manifestCacheBytes;
+        }
+
+        public long partitionCacheSize() {
+            return partitionCacheSize;
+        }
+    }
 }
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreScan.java
 
b/paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreScan.java
index c73a92062b..4f8a1f3264 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreScan.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/operation/AbstractFileStoreScan.java
@@ -428,6 +428,8 @@ public abstract class AbstractFileStoreScan implements 
FileStoreScan {
         List<ManifestEntry> entries =
                 manifestFileFactory
                         .create()
+                        .withCacheMetrics(
+                                scanMetrics != null ? 
scanMetrics.getCacheMetrics() : null)
                         .read(
                                 manifest.fileName(),
                                 manifest.fileSize(),
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/metrics/MetricRegistryImpl.java 
b/paimon-core/src/main/java/org/apache/paimon/operation/metrics/CacheMetrics.java
similarity index 53%
copy from 
paimon-core/src/main/java/org/apache/paimon/metrics/MetricRegistryImpl.java
copy to 
paimon-core/src/main/java/org/apache/paimon/operation/metrics/CacheMetrics.java
index b815364a85..fdf9ce6921 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/metrics/MetricRegistryImpl.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/operation/metrics/CacheMetrics.java
@@ -16,15 +16,34 @@
  * limitations under the License.
  */
 
-package org.apache.paimon.metrics;
+package org.apache.paimon.operation.metrics;
 
-import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
 
-/** Default implementation of {@link MetricRegistry}. */
-public class MetricRegistryImpl extends MetricRegistry {
+/** Metrics for manifest file cache of a caching catalog. */
+public class CacheMetrics {
 
-    @Override
-    protected MetricGroup createMetricGroup(String groupName, Map<String, 
String> variables) {
-        return new MetricGroupImpl(groupName, variables);
+    private final AtomicLong hitObject;
+    private final AtomicLong missedObject;
+
+    public CacheMetrics() {
+        this.hitObject = new AtomicLong(0);
+        this.missedObject = new AtomicLong(0);
+    }
+
+    public AtomicLong getHitObject() {
+        return hitObject;
+    }
+
+    public void increaseHitObject() {
+        this.hitObject.incrementAndGet();
+    }
+
+    public AtomicLong getMissedObject() {
+        return missedObject;
+    }
+
+    public void increaseMissedObject() {
+        this.missedObject.incrementAndGet();
     }
 }
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/operation/metrics/ScanMetrics.java
 
b/paimon-core/src/main/java/org/apache/paimon/operation/metrics/ScanMetrics.java
index 96f0aec1c0..fdc41baf28 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/operation/metrics/ScanMetrics.java
+++ 
b/paimon-core/src/main/java/org/apache/paimon/operation/metrics/ScanMetrics.java
@@ -30,9 +30,14 @@ public class ScanMetrics {
     public static final String GROUP_NAME = "scan";
 
     private final MetricGroup metricGroup;
+    private Histogram durationHistogram;
+
+    private ScanStats latestScan;
+    private CacheMetrics cacheMetrics;
 
     public ScanMetrics(MetricRegistry registry, String tableName) {
         this.metricGroup = registry.tableMetricGroup(GROUP_NAME, tableName);
+        this.cacheMetrics = new CacheMetrics();
         registerGenericScanMetrics();
     }
 
@@ -41,17 +46,13 @@ public class ScanMetrics {
         return metricGroup;
     }
 
-    private Histogram durationHistogram;
-
-    private ScanStats latestScan;
-
     public static final String LAST_SCAN_DURATION = "lastScanDuration";
     public static final String SCAN_DURATION = "scanDuration";
     public static final String LAST_SCANNED_MANIFESTS = "lastScannedManifests";
-
     public static final String LAST_SCAN_SKIPPED_TABLE_FILES = 
"lastScanSkippedTableFiles";
-
     public static final String LAST_SCAN_RESULTED_TABLE_FILES = 
"lastScanResultedTableFiles";
+    public static final String MANIFEST_HIT_CACHE = "manifestHitCache";
+    public static final String MANIFEST_MISSED_CACHE = "manifestMissedCache";
 
     private void registerGenericScanMetrics() {
         metricGroup.gauge(
@@ -66,10 +67,20 @@ public class ScanMetrics {
         metricGroup.gauge(
                 LAST_SCAN_RESULTED_TABLE_FILES,
                 () -> latestScan == null ? 0L : 
latestScan.getResultedTableFiles());
+        metricGroup.gauge(
+                MANIFEST_HIT_CACHE,
+                () -> cacheMetrics == null ? 0L : 
cacheMetrics.getHitObject().get());
+        metricGroup.gauge(
+                MANIFEST_MISSED_CACHE,
+                () -> cacheMetrics == null ? 0L : 
cacheMetrics.getMissedObject().get());
     }
 
     public void reportScan(ScanStats scanStats) {
         latestScan = scanStats;
         durationHistogram.update(scanStats.getDuration());
     }
+
+    public CacheMetrics getCacheMetrics() {
+        return cacheMetrics;
+    }
 }
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/utils/ObjectsCache.java 
b/paimon-core/src/main/java/org/apache/paimon/utils/ObjectsCache.java
index 1c9d9664f2..6f14c78107 100644
--- a/paimon-core/src/main/java/org/apache/paimon/utils/ObjectsCache.java
+++ b/paimon-core/src/main/java/org/apache/paimon/utils/ObjectsCache.java
@@ -26,6 +26,7 @@ import org.apache.paimon.data.SimpleCollectingOutputView;
 import org.apache.paimon.data.serializer.InternalRowSerializer;
 import org.apache.paimon.memory.MemorySegment;
 import org.apache.paimon.memory.MemorySegmentSource;
+import org.apache.paimon.operation.metrics.CacheMetrics;
 import org.apache.paimon.types.RowType;
 
 import javax.annotation.Nullable;
@@ -47,6 +48,7 @@ public class ObjectsCache<K, V> {
     private final ThreadLocal<InternalRowSerializer> formatSerializer;
     private final FunctionWithIOException<K, Long> fileSizeFunction;
     private final BiFunctionWithIOE<K, Long, CloseableIterator<InternalRow>> 
reader;
+    private CacheMetrics cacheMetrics;
 
     public ObjectsCache(
             SegmentsCache<K> cache,
@@ -71,8 +73,14 @@ public class ObjectsCache<K, V> {
             throws IOException {
         Segments segments = cache.getIfPresents(key);
         if (segments != null) {
+            if (cacheMetrics != null) {
+                cacheMetrics.increaseHitObject();
+            }
             return readFromSegments(segments, readFilter, readVFilter);
         } else {
+            if (cacheMetrics != null) {
+                cacheMetrics.increaseMissedObject();
+            }
             if (fileSize == null) {
                 fileSize = fileSizeFunction.apply(key);
             }
@@ -130,4 +138,8 @@ public class ObjectsCache<K, V> {
             throw new RuntimeException(e);
         }
     }
+
+    public void withCacheMetrics(CacheMetrics cacheMetrics) {
+        this.cacheMetrics = cacheMetrics;
+    }
 }
diff --git a/paimon-core/src/main/java/org/apache/paimon/utils/ObjectsFile.java 
b/paimon-core/src/main/java/org/apache/paimon/utils/ObjectsFile.java
index b0bea8e66a..fc523ce239 100644
--- a/paimon-core/src/main/java/org/apache/paimon/utils/ObjectsFile.java
+++ b/paimon-core/src/main/java/org/apache/paimon/utils/ObjectsFile.java
@@ -25,6 +25,7 @@ import org.apache.paimon.format.FormatWriterFactory;
 import org.apache.paimon.fs.FileIO;
 import org.apache.paimon.fs.Path;
 import org.apache.paimon.fs.PositionOutputStream;
+import org.apache.paimon.operation.metrics.CacheMetrics;
 import org.apache.paimon.types.RowType;
 
 import javax.annotation.Nullable;
@@ -207,4 +208,11 @@ public class ObjectsFile<T> implements SimpleFileReader<T> 
{
             throw new RuntimeException(e);
         }
     }
+
+    public ObjectsFile<T> withCacheMetrics(CacheMetrics cacheMetrics) {
+        if (cache != null) {
+            cache.withCacheMetrics(cacheMetrics);
+        }
+        return this;
+    }
 }
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/utils/SegmentsCache.java 
b/paimon-core/src/main/java/org/apache/paimon/utils/SegmentsCache.java
index d5c2178c8b..0ef4b13a31 100644
--- a/paimon-core/src/main/java/org/apache/paimon/utils/SegmentsCache.java
+++ b/paimon-core/src/main/java/org/apache/paimon/utils/SegmentsCache.java
@@ -90,4 +90,14 @@ public class SegmentsCache<T> {
 
         return new SegmentsCache<>(pageSize, maxMemorySize, maxElementSize);
     }
+
+    public long getSegmentCacheSize() {
+        return cache.estimatedSize();
+    }
+
+    public long getSegmentCacheBytes() {
+        return cache.asMap().entrySet().stream()
+                .mapToLong(entry -> weigh(entry.getKey(), entry.getValue()))
+                .sum();
+    }
 }
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/metrics/MetricRegistryImplTest.java
 b/paimon-core/src/test/java/org/apache/paimon/metrics/MetricGroupTest.java
similarity index 90%
rename from 
paimon-core/src/test/java/org/apache/paimon/metrics/MetricRegistryImplTest.java
rename to 
paimon-core/src/test/java/org/apache/paimon/metrics/MetricGroupTest.java
index 27f9e70ecb..90a063e324 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/metrics/MetricRegistryImplTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/metrics/MetricGroupTest.java
@@ -24,12 +24,12 @@ import java.util.HashMap;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-/** Tests for the {@link MetricRegistryImpl}. */
-public class MetricRegistryImplTest {
+/** Tests for the {@link MetricGroup}. */
+public class MetricGroupTest {
 
     @Test
     public void testGroupRegisterMetrics() {
-        MetricRegistryImpl registry = new MetricRegistryImpl();
+        TestMetricRegistry registry = new TestMetricRegistry();
         MetricGroup group = registry.tableMetricGroup("commit", "myTable");
 
         // these will fail is the registration is propagated
@@ -50,7 +50,7 @@ public class MetricRegistryImplTest {
     @Test
     public void testTolerateMetricNameCollisions() {
         final String name = "abctestname";
-        MetricRegistryImpl registry = new MetricRegistryImpl();
+        TestMetricRegistry registry = new TestMetricRegistry();
         MetricGroup group = registry.tableMetricGroup("commit", "myTable");
 
         Counter counter = group.counter(name);
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/metrics/MetricRegistryImpl.java 
b/paimon-core/src/test/java/org/apache/paimon/metrics/TestMetricRegistry.java
similarity index 89%
rename from 
paimon-core/src/main/java/org/apache/paimon/metrics/MetricRegistryImpl.java
rename to 
paimon-core/src/test/java/org/apache/paimon/metrics/TestMetricRegistry.java
index b815364a85..4b2870041c 100644
--- 
a/paimon-core/src/main/java/org/apache/paimon/metrics/MetricRegistryImpl.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/metrics/TestMetricRegistry.java
@@ -20,8 +20,8 @@ package org.apache.paimon.metrics;
 
 import java.util.Map;
 
-/** Default implementation of {@link MetricRegistry}. */
-public class MetricRegistryImpl extends MetricRegistry {
+/** Implementation of {@link MetricRegistry} for tests. */
+public class TestMetricRegistry extends MetricRegistry {
 
     @Override
     protected MetricGroup createMetricGroup(String groupName, Map<String, 
String> variables) {
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CommitMetricsTest.java
 
b/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CommitMetricsTest.java
index 476790a8c0..6a79a0ae58 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CommitMetricsTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CommitMetricsTest.java
@@ -23,7 +23,7 @@ import org.apache.paimon.manifest.ManifestEntry;
 import org.apache.paimon.metrics.Gauge;
 import org.apache.paimon.metrics.Histogram;
 import org.apache.paimon.metrics.Metric;
-import org.apache.paimon.metrics.MetricRegistryImpl;
+import org.apache.paimon.metrics.TestMetricRegistry;
 
 import org.junit.jupiter.api.Test;
 
@@ -234,6 +234,6 @@ public class CommitMetricsTest {
     }
 
     private CommitMetrics getCommitMetrics() {
-        return new CommitMetrics(new MetricRegistryImpl(), TABLE_NAME);
+        return new CommitMetrics(new TestMetricRegistry(), TABLE_NAME);
     }
 }
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CompactionMetricsTest.java
 
b/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CompactionMetricsTest.java
index 222b99769d..d2f5e8963d 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CompactionMetricsTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/operation/metrics/CompactionMetricsTest.java
@@ -22,7 +22,7 @@ import org.apache.paimon.data.BinaryRow;
 import org.apache.paimon.metrics.Counter;
 import org.apache.paimon.metrics.Gauge;
 import org.apache.paimon.metrics.Metric;
-import org.apache.paimon.metrics.MetricRegistryImpl;
+import org.apache.paimon.metrics.TestMetricRegistry;
 
 import org.junit.jupiter.api.Test;
 
@@ -33,7 +33,7 @@ public class CompactionMetricsTest {
 
     @Test
     public void testReportMetrics() {
-        CompactionMetrics metrics = new CompactionMetrics(new 
MetricRegistryImpl(), "myTable");
+        CompactionMetrics metrics = new CompactionMetrics(new 
TestMetricRegistry(), "myTable");
         assertThat(getMetric(metrics, 
CompactionMetrics.MAX_LEVEL0_FILE_COUNT)).isEqualTo(-1L);
         assertThat(getMetric(metrics, 
CompactionMetrics.AVG_LEVEL0_FILE_COUNT)).isEqualTo(-1.0);
         assertThat(getMetric(metrics, 
CompactionMetrics.COMPACTION_THREAD_BUSY)).isEqualTo(0.0);
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/operation/metrics/ScanMetricsTest.java
 
b/paimon-core/src/test/java/org/apache/paimon/operation/metrics/ScanMetricsTest.java
index a0427d95ca..7ea86a2800 100644
--- 
a/paimon-core/src/test/java/org/apache/paimon/operation/metrics/ScanMetricsTest.java
+++ 
b/paimon-core/src/test/java/org/apache/paimon/operation/metrics/ScanMetricsTest.java
@@ -22,7 +22,7 @@ import org.apache.paimon.metrics.Gauge;
 import org.apache.paimon.metrics.Histogram;
 import org.apache.paimon.metrics.Metric;
 import org.apache.paimon.metrics.MetricGroup;
-import org.apache.paimon.metrics.MetricRegistryImpl;
+import org.apache.paimon.metrics.TestMetricRegistry;
 
 import org.junit.jupiter.api.Test;
 
@@ -48,7 +48,9 @@ public class ScanMetricsTest {
                         ScanMetrics.SCAN_DURATION,
                         ScanMetrics.LAST_SCANNED_MANIFESTS,
                         ScanMetrics.LAST_SCAN_SKIPPED_TABLE_FILES,
-                        ScanMetrics.LAST_SCAN_RESULTED_TABLE_FILES);
+                        ScanMetrics.LAST_SCAN_RESULTED_TABLE_FILES,
+                        ScanMetrics.MANIFEST_HIT_CACHE,
+                        ScanMetrics.MANIFEST_MISSED_CACHE);
     }
 
     /** Tests that the metrics are updated properly. */
@@ -124,6 +126,6 @@ public class ScanMetricsTest {
     }
 
     private ScanMetrics getScanMetrics() {
-        return new ScanMetrics(new MetricRegistryImpl(), TABLE_NAME);
+        return new ScanMetrics(new TestMetricRegistry(), TABLE_NAME);
     }
 }
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/utils/ObjectsCacheTest.java 
b/paimon-core/src/test/java/org/apache/paimon/utils/ObjectsCacheTest.java
index 9d3275e3ab..7e52814a82 100644
--- a/paimon-core/src/test/java/org/apache/paimon/utils/ObjectsCacheTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/utils/ObjectsCacheTest.java
@@ -21,6 +21,8 @@ package org.apache.paimon.utils;
 import org.apache.paimon.data.BinaryString;
 import org.apache.paimon.data.GenericRow;
 import org.apache.paimon.data.InternalRow;
+import org.apache.paimon.metrics.TestMetricRegistry;
+import org.apache.paimon.operation.metrics.ScanMetrics;
 import org.apache.paimon.options.MemorySize;
 import org.apache.paimon.types.DataTypes;
 import org.apache.paimon.types.RowType;
@@ -40,7 +42,7 @@ import static org.assertj.core.api.Assertions.assertThat;
 public class ObjectsCacheTest {
 
     @Test
-    public void test() throws IOException {
+    public void testObjectsCacheAndMetrics() throws IOException {
         Map<String, List<String>> map = new HashMap<>();
         ObjectsCache<String, String> cache =
                 new ObjectsCache<>(
@@ -56,12 +58,15 @@ public class ObjectsCacheTest {
                                                 .map(r -> (InternalRow) r)
                                                 .iterator()));
 
+        ScanMetrics scanMetrics = new ScanMetrics(new TestMetricRegistry(), 
"table");
+        cache.withCacheMetrics(scanMetrics.getCacheMetrics());
         // test empty
         map.put("k1", Collections.emptyList());
         List<String> values =
                 cache.read(
                         "k1", null, Filter.alwaysTrue(), Filter.alwaysTrue(), 
Filter.alwaysTrue());
         assertThat(values).isEmpty();
+        
assertThat(scanMetrics.getCacheMetrics().getMissedObject()).hasValue(1);
 
         // test values
         List<String> expect = Arrays.asList("v1", "v2", "v3");
@@ -70,12 +75,14 @@ public class ObjectsCacheTest {
                 cache.read(
                         "k2", null, Filter.alwaysTrue(), Filter.alwaysTrue(), 
Filter.alwaysTrue());
         assertThat(values).containsExactlyElementsOf(expect);
+        
assertThat(scanMetrics.getCacheMetrics().getMissedObject()).hasValue(2);
 
         // test cache
         values =
                 cache.read(
                         "k2", null, Filter.alwaysTrue(), Filter.alwaysTrue(), 
Filter.alwaysTrue());
         assertThat(values).containsExactlyElementsOf(expect);
+        assertThat(scanMetrics.getCacheMetrics().getHitObject()).hasValue(1);
 
         // test filter
         values =

Reply via email to