Update metrics singularly This work is preparatory to avoid loading all the metrics at startup. Updating a metric at a time will allow later on to inizialize metrics only when collected and avoid defaulting them to 0. Bug: Issue 16236 Change-Id: I0f58cac3604c0011938f25d712f03ab274048bff
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCache.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCache.java index a08f845..b3a0fc8 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCache.java +++ b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCache.java
@@ -83,9 +83,15 @@ return metrics; } - public void setMetrics(Map<String, Long> metrics, String projectName) { - this.collectedAt.put(projectName, clock.millis()); - this.metrics = metrics; + public void setMetrics(Map<GitRepoMetric, Long> newMetrics, String projectName) { + newMetrics.forEach( + (repoMetric, value) -> { + logger.atFine().log( + String.format( + "Collected %s for project %s: %d", repoMetric.getName(), projectName, value)); + metrics.put(getMetricName(repoMetric.getName(), projectName), value); + }); + collectedAt.put(projectName, clock.millis()); } public List<GitRepoMetric> getMetricsNames() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/UpdateGitMetricsTask.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/UpdateGitMetricsTask.java index a1acb24..7bdfb95 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/UpdateGitMetricsTask.java +++ b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/UpdateGitMetricsTask.java
@@ -20,12 +20,11 @@ import com.google.gerrit.server.git.GitRepositoryManager; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; -import com.googlesource.gerrit.plugins.gitrepometrics.collectors.MetricsCollector; +import com.googlesource.gerrit.plugins.gitrepometrics.collectors.GitRepoMetric; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; -import java.util.stream.StreamSupport; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.internal.storage.file.FileRepository; import org.eclipse.jgit.lib.Repository; @@ -64,24 +63,13 @@ ? ((DelegateRepository) repository).delegate() : repository; - Iterable<MetricsCollector> iterable = () -> gitRepoMetricsCache.getCollectors().iterator(); - HashMap<String, Long> newMetrics = - StreamSupport.stream(iterable.spliterator(), false) - .map( - metricsCollector -> - metricsCollector.collect((FileRepository) unwrappedRepo, projectName)) - .reduce( - new HashMap<>(), - (accumulator, latestMetrics) -> { - HashMap<String, Long> newVal = new HashMap<>(); - newVal.putAll(accumulator); - newVal.putAll(latestMetrics); - return newVal; - }); - - logger.atInfo().log( - "Here all the metrics for %s - %s", projectNameKey.get(), getStringFromMap(newMetrics)); - gitRepoMetricsCache.setMetrics(newMetrics, projectName); + gitRepoMetricsCache.getCollectors().stream() + .forEach( + metricsCollector -> { + HashMap<GitRepoMetric, Long> metrics = + metricsCollector.collect((FileRepository) unwrappedRepo, projectName); + gitRepoMetricsCache.setMetrics(metrics, projectName); + }); } catch (RepositoryNotFoundException e) { logger.atSevere().withCause(e).log("Cannot find repository for %s", projectName); } catch (IOException e) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/FSMetricsCollector.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/FSMetricsCollector.java index 87e2b0e..2142830 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/FSMetricsCollector.java +++ b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/FSMetricsCollector.java
@@ -26,30 +26,32 @@ public class FSMetricsCollector implements MetricsCollector { private static final FluentLogger logger = FluentLogger.forEnclosingClass(); - public static String numberOfKeepFiles = "numberOfKeepFiles"; - public static String numberOfEmptyDirectories = "numberOfEmptyDirectories"; - public static String numberOfDirectories = "numberOfDirectories"; - public static String numberOfFiles = "numberOfFiles"; + protected static final GitRepoMetric numberOfKeepFiles = + new GitRepoMetric("numberOfKeepFiles", "Number of keep files on filesystem", "Count"); + protected static final GitRepoMetric numberOfEmptyDirectories = + new GitRepoMetric( + "numberOfEmptyDirectories", "Number of empty directories on filesystem", "Count"); + protected static final GitRepoMetric numberOfDirectories = + new GitRepoMetric("numberOfDirectories", "Number of directories on filesystem", "Count"); + protected static final GitRepoMetric numberOfFiles = + new GitRepoMetric("numberOfFiles", "Number of directories on filesystem", "Count"); + + private static final ImmutableList<GitRepoMetric> availableMetrics = + ImmutableList.of( + numberOfKeepFiles, numberOfEmptyDirectories, numberOfFiles, numberOfDirectories); @Override - public HashMap<String, Long> collect(FileRepository repository, String projectName) { - HashMap<String, Long> metrics = new HashMap<>(); - + public HashMap<GitRepoMetric, Long> collect(FileRepository repository, String projectName) { + HashMap<GitRepoMetric, Long> metrics = new HashMap<>(); HashMap<String, AtomicInteger> partialMetrics = filesAndDirectoriesCount(repository, projectName); - putMetric( - projectName, - metrics, + + metrics.put( numberOfEmptyDirectories, - partialMetrics.get(numberOfEmptyDirectories).longValue()); - putMetric( - projectName, - metrics, - numberOfDirectories, - partialMetrics.get(numberOfDirectories).longValue()); - putMetric(projectName, metrics, numberOfFiles, partialMetrics.get(numberOfFiles).longValue()); - putMetric( - projectName, metrics, numberOfKeepFiles, partialMetrics.get(numberOfKeepFiles).longValue()); + partialMetrics.get(numberOfEmptyDirectories.getName()).longValue()); + metrics.put(numberOfDirectories, partialMetrics.get(numberOfDirectories.getName()).longValue()); + metrics.put(numberOfFiles, partialMetrics.get(numberOfFiles.getName()).longValue()); + metrics.put(numberOfKeepFiles, partialMetrics.get(numberOfKeepFiles.getName()).longValue()); return metrics; } @@ -59,10 +61,10 @@ HashMap<String, AtomicInteger> counter = new HashMap<String, AtomicInteger>() { { - put(numberOfFiles, new AtomicInteger(0)); - put(numberOfDirectories, new AtomicInteger(0)); - put(numberOfEmptyDirectories, new AtomicInteger(0)); - put(numberOfKeepFiles, new AtomicInteger(0)); + put(numberOfFiles.getName(), new AtomicInteger(0)); + put(numberOfDirectories.getName(), new AtomicInteger(0)); + put(numberOfEmptyDirectories.getName(), new AtomicInteger(0)); + put(numberOfKeepFiles.getName(), new AtomicInteger(0)); } }; try { @@ -71,16 +73,22 @@ .forEach( path -> { if (path.toFile().isFile()) { - counter.get(numberOfFiles).updateAndGet(metricCounter -> metricCounter + 1); + counter + .get(numberOfFiles.getName()) + .updateAndGet(metricCounter -> metricCounter + 1); if (path.toFile().getName().endsWith(".keep")) { - counter.get(numberOfKeepFiles).updateAndGet(metricCounter -> metricCounter + 1); + counter + .get(numberOfKeepFiles.getName()) + .updateAndGet(metricCounter -> metricCounter + 1); } } if (path.toFile().isDirectory()) { - counter.get(numberOfDirectories).updateAndGet(metricCounter -> metricCounter + 1); + counter + .get(numberOfDirectories.getName()) + .updateAndGet(metricCounter -> metricCounter + 1); if (Objects.requireNonNull(path.toFile().listFiles()).length == 0) { counter - .get(numberOfEmptyDirectories) + .get(numberOfEmptyDirectories.getName()) .updateAndGet(metricCounter -> metricCounter + 1); } } @@ -99,11 +107,6 @@ @Override public ImmutableList<GitRepoMetric> availableMetrics() { - return ImmutableList.of( - new GitRepoMetric(numberOfKeepFiles, "Number of keep files on filesystem", "Count"), - new GitRepoMetric( - numberOfEmptyDirectories, "Number of empty directories on filesystem", "Count"), - new GitRepoMetric(numberOfDirectories, "Number of directories on filesystem", "Count"), - new GitRepoMetric(numberOfFiles, "Number of directories on filesystem", "Count")); + return availableMetrics; } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/GitRepoMetric.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/GitRepoMetric.java index b016fbc..af75c9d 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/GitRepoMetric.java +++ b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/GitRepoMetric.java
@@ -14,6 +14,8 @@ package com.googlesource.gerrit.plugins.gitrepometrics.collectors; +import java.util.Objects; + public class GitRepoMetric { private final String name; private final String description; @@ -36,4 +38,19 @@ public String getDescription() { return description; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + GitRepoMetric that = (GitRepoMetric) o; + return Objects.equals(name, that.name) + && Objects.equals(unit, that.unit) + && Objects.equals(description, that.description); + } + + @Override + public int hashCode() { + return Objects.hash(name, description, unit); + } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/GitStatsMetricsCollector.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/GitStatsMetricsCollector.java index bb9d9cd..6e65fb5 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/GitStatsMetricsCollector.java +++ b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/GitStatsMetricsCollector.java
@@ -24,28 +24,47 @@ public class GitStatsMetricsCollector implements MetricsCollector { private static final FluentLogger logger = FluentLogger.forEnclosingClass(); - public static String numberOfPackedObjects = "numberOfPackedObjects"; - public static String numberOfPackFiles = "numberOfPackFiles"; - public static String numberOfLooseObjects = "numberOfLooseObjects"; - public static String numberOfLooseRefs = "numberOfLooseRefs"; - public static String numberOfPackedRefs = "numberOfPackedRefs"; - public static String sizeOfLooseObjects = "sizeOfLooseObjects"; - public static String sizeOfPackedObjects = "sizeOfPackedObjects"; - public static String numberOfBitmaps = "numberOfBitmaps"; + public static final GitRepoMetric numberOfPackedObjects = + new GitRepoMetric("numberOfPackedObjects", "Number of packed objects", "Count"); + public static final GitRepoMetric numberOfPackFiles = + new GitRepoMetric("numberOfPackFiles", "Number of pack files", "Count"); + public static final GitRepoMetric numberOfLooseObjects = + new GitRepoMetric("numberOfLooseObjects", "Number of loose objects", "Count"); + public static final GitRepoMetric numberOfLooseRefs = + new GitRepoMetric("numberOfLooseRefs", "Number of loose refs", "Count"); + public static final GitRepoMetric numberOfPackedRefs = + new GitRepoMetric("numberOfPackedRefs", "Number of packed refs", "Count"); + public static final GitRepoMetric sizeOfLooseObjects = + new GitRepoMetric("sizeOfLooseObjects", "Size of loose objects", "Count"); + public static final GitRepoMetric sizeOfPackedObjects = + new GitRepoMetric("sizeOfPackedObjects", "Size of packed objects", "Count"); + public static final GitRepoMetric numberOfBitmaps = + new GitRepoMetric("numberOfBitmaps", "Number of bitmaps", "Count"); + + private static final ImmutableList<GitRepoMetric> availableMetrics = + ImmutableList.of( + numberOfPackedObjects, + numberOfPackFiles, + numberOfLooseObjects, + numberOfLooseRefs, + numberOfPackedRefs, + sizeOfLooseObjects, + sizeOfPackedObjects, + numberOfBitmaps); @Override - public HashMap<String, Long> collect(FileRepository repository, String projectName) { - HashMap<String, Long> metrics = new HashMap<>(availableMetrics().size()); + public HashMap<GitRepoMetric, Long> collect(FileRepository repository, String projectName) { + HashMap<GitRepoMetric, Long> metrics = new HashMap<>(availableMetrics().size()); try { GC.RepoStatistics statistics = new GC(repository).getStatistics(); - putMetric(projectName, metrics, numberOfPackedObjects, statistics.numberOfPackedObjects); - putMetric(projectName, metrics, numberOfPackFiles, statistics.numberOfPackFiles); - putMetric(projectName, metrics, numberOfLooseObjects, statistics.numberOfLooseObjects); - putMetric(projectName, metrics, numberOfLooseRefs, statistics.numberOfLooseRefs); - putMetric(projectName, metrics, numberOfPackedRefs, statistics.numberOfPackedRefs); - putMetric(projectName, metrics, sizeOfLooseObjects, statistics.sizeOfLooseObjects); - putMetric(projectName, metrics, sizeOfPackedObjects, statistics.sizeOfPackedObjects); - putMetric(projectName, metrics, numberOfBitmaps, statistics.numberOfBitmaps); + metrics.put(numberOfPackedObjects, statistics.numberOfPackedObjects); + metrics.put(numberOfPackFiles, statistics.numberOfPackFiles); + metrics.put(numberOfLooseObjects, statistics.numberOfLooseObjects); + metrics.put(numberOfLooseRefs, statistics.numberOfLooseRefs); + metrics.put(numberOfPackedRefs, statistics.numberOfPackedRefs); + metrics.put(sizeOfLooseObjects, statistics.sizeOfLooseObjects); + metrics.put(sizeOfPackedObjects, statistics.sizeOfPackedObjects); + metrics.put(numberOfBitmaps, statistics.numberOfBitmaps); logger.atInfo().log("New Git Statistics metrics collected: %s", statistics.toString()); } catch (IOException e) { logger.atSevere().log("Something went wrong: %s", e.getMessage()); @@ -55,15 +74,7 @@ @Override public ImmutableList<GitRepoMetric> availableMetrics() { - return ImmutableList.of( - new GitRepoMetric(numberOfPackedObjects, "Number of packed objects", "Count"), - new GitRepoMetric(numberOfPackFiles, "Number of pack files", "Count"), - new GitRepoMetric(numberOfLooseObjects, "Number of loose objects", "Count"), - new GitRepoMetric(numberOfLooseRefs, "Number of loose refs", "Count"), - new GitRepoMetric(numberOfPackedRefs, "Number of packed refs", "Count"), - new GitRepoMetric(sizeOfLooseObjects, "Size of loose objects", "Count"), - new GitRepoMetric(sizeOfPackedObjects, "Size of packed objects", "Count"), - new GitRepoMetric(numberOfBitmaps, "Number of bitmaps", "Count")); + return availableMetrics; } @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/MetricsCollector.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/MetricsCollector.java index bfe06f4..b4114f5 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/MetricsCollector.java +++ b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/MetricsCollector.java
@@ -14,8 +14,6 @@ package com.googlesource.gerrit.plugins.gitrepometrics.collectors; -import static com.googlesource.gerrit.plugins.gitrepometrics.GitRepoMetricsCache.getMetricName; - import com.google.common.collect.ImmutableList; import java.util.HashMap; import org.eclipse.jgit.internal.storage.file.FileRepository; @@ -28,10 +26,10 @@ * * @param projectName to collect metrics for * @param repository {@link FileRepository} to collect metrics from - * @return {@code HashMap<String, Long>} where the key is the metric name and the value is the - * corresponding metric value collected. + * @return {@code HashMap<GitRepoMetric, Long>} where the key is the {@link GitRepoMetric} and the + * value is the corresponding metric value collected. */ - HashMap<String, Long> collect(FileRepository repository, String projectName); + HashMap<GitRepoMetric, Long> collect(FileRepository repository, String projectName); /** * Returns the name of the metric collector. @@ -47,9 +45,4 @@ * metric collector implementation. */ ImmutableList<GitRepoMetric> availableMetrics(); - - default void putMetric( - String projectName, HashMap<String, Long> metrics, String metricName, long value) { - metrics.put(getMetricName(metricName, projectName), value); - } }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/FakeMetricsCollector.java b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/FakeMetricsCollector.java index c0148c6..eee6274 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/FakeMetricsCollector.java +++ b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/FakeMetricsCollector.java
@@ -23,9 +23,14 @@ import org.eclipse.jgit.internal.storage.file.FileRepository; class FakeMetricsCollector implements MetricsCollector { + public static final GitRepoMetric fakeMetric1 = + new GitRepoMetric("fake-metric-1", "Fake metric 1", "Count"); + public static final GitRepoMetric fakeMetric2 = + new GitRepoMetric("fake-metric-2", "Fake metric 2", "Count"); + @Override - public HashMap<String, Long> collect(FileRepository repository, String projectName) { - return Maps.newHashMap(ImmutableMap.of("fake-metrics-1", 1L, "fake-metrics-2", 2L)); + public HashMap<GitRepoMetric, Long> collect(FileRepository repository, String projectName) { + return Maps.newHashMap(ImmutableMap.of(fakeMetric1, 1L, fakeMetric2, 2L)); } @Override @@ -35,8 +40,6 @@ @Override public ImmutableList<GitRepoMetric> availableMetrics() { - return ImmutableList.of( - new GitRepoMetric("fake-metric-1", "Fake metric 1", "Count"), - new GitRepoMetric("fake-metric-2", "Fake metric 2", "Count")); + return ImmutableList.of(fakeMetric1, fakeMetric2); } }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheTest.java b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheTest.java index e379813..e7fd9eb 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheTest.java
@@ -18,17 +18,18 @@ import com.codahale.metrics.Metric; import com.codahale.metrics.MetricRegistry; -import com.google.common.collect.ImmutableMap; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.metrics.CallbackMetric0; import com.google.gerrit.metrics.Description; import com.google.gerrit.metrics.DisabledMetricMaker; +import com.googlesource.gerrit.plugins.gitrepometrics.collectors.GitRepoMetric; import com.googlesource.gerrit.plugins.gitrepometrics.collectors.MetricsCollector; import java.io.IOException; import java.time.Clock; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.Collections; +import java.util.HashMap; import org.junit.Before; import org.junit.Test; @@ -47,7 +48,7 @@ configSetupUtils = new ConfigSetupUtils(Collections.singletonList(enabledRepo)); fakeStatsCollector = new FakeMetricsCollector(); - ds = new DynamicSet<>(); + ds = new DynamicSet<MetricsCollector>(); ds.add("git-repo-metrics", fakeStatsCollector); } @@ -118,7 +119,13 @@ new GitRepoMetricsCache( ds, new FakeMetricMaker(), new MetricRegistry(), gitRepoMetricsConfig); - gitRepoMetricsCache.setMetrics(ImmutableMap.of("anyMetric", 0L), enabledRepo); + gitRepoMetricsCache.setMetrics( + new HashMap<GitRepoMetric, Long>() { + { + put(new GitRepoMetric("anyMetric", "anyMetricDescription", "Count"), 0L); + } + }, + enabledRepo); assertThat(gitRepoMetricsCache.shouldCollectStats(enabledRepo)).isTrue(); } @@ -132,7 +139,13 @@ new GitRepoMetricsCache( ds, new FakeMetricMaker(), new MetricRegistry(), gitRepoMetricsConfig); - gitRepoMetricsCache.setMetrics(ImmutableMap.of("anyMetric", 0L), enabledRepo); + gitRepoMetricsCache.setMetrics( + new HashMap<GitRepoMetric, Long>() { + { + put(new GitRepoMetric("anyMetric", "anyMetricDescription", "Count"), 0L); + } + }, + enabledRepo); assertThat(gitRepoMetricsCache.shouldCollectStats(enabledRepo)).isFalse(); } @@ -151,7 +164,13 @@ Clock.fixed( Instant.now().minus(2, ChronoUnit.SECONDS), Clock.systemDefaultZone().getZone())); - gitRepoMetricsCache.setMetrics(ImmutableMap.of("anyMetric", 0L), enabledRepo); + gitRepoMetricsCache.setMetrics( + new HashMap<GitRepoMetric, Long>() { + { + put(new GitRepoMetric("anyMetric", "anyMetricDescription", "Count"), 0L); + } + }, + enabledRepo); assertThat(gitRepoMetricsCache.shouldCollectStats(enabledRepo)).isTrue(); } @@ -167,7 +186,13 @@ long currentTimeStamp = System.currentTimeMillis(); - gitRepoMetricsCache.setMetrics(ImmutableMap.of("anyMetric", 0L), enabledRepo); + gitRepoMetricsCache.setMetrics( + new HashMap<GitRepoMetric, Long>() { + { + put(new GitRepoMetric("anyMetric", "anyMetricDescription", "Count"), 0L); + } + }, + enabledRepo); assertThat(gitRepoMetricsCache.getCollectedAt().get(enabledRepo)).isAtLeast(currentTimeStamp); }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/FSMetricsCollectorTest.java b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/FSMetricsCollectorTest.java index f330af3..92fc552 100644 --- a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/FSMetricsCollectorTest.java +++ b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/FSMetricsCollectorTest.java
@@ -43,17 +43,17 @@ File objectDirectory = repository.getObjectsDirectory(); Files.createFile(new File(objectDirectory, "pack/keep1.keep").toPath()); - HashMap<String, Long> metrics = new FSMetricsCollector().collect(repository, "testRepo"); - + HashMap<GitRepoMetric, Long> metrics = new FSMetricsCollector().collect(repository, "testRepo"); // This is the FS structure, from the "objects" directory, metrics are collected from: // . // ├── info // └── pack // └── keep1.keep - assertThat(metrics.get("numberofkeepfiles_testrepo")).isEqualTo(1); // keep1.keep - assertThat(metrics.get("numberoffiles_testrepo")).isEqualTo(1); // keep1.keep - assertThat(metrics.get("numberofdirectories_testrepo")).isEqualTo(3); // info, pack and . - assertThat(metrics.get("numberofemptydirectories_testrepo")).isEqualTo(1); // info + assertThat(metrics.get(FSMetricsCollector.numberOfKeepFiles)).isEqualTo(1); // keep1.keep + assertThat(metrics.get(FSMetricsCollector.numberOfFiles)).isEqualTo(1); // keep1.keep + assertThat(metrics.get(FSMetricsCollector.numberOfDirectories)) + .isEqualTo(3); // info, pack and . + assertThat(metrics.get(FSMetricsCollector.numberOfEmptyDirectories)).isEqualTo(1); // info } private FileRepository createRepository(String repoName) throws Exception {