diff --git a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java index 0cb0c9d56a98..c6e17d5cfd58 100644 --- a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java +++ b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/volume/VolumeInfoMetrics.java @@ -51,14 +51,20 @@ public class VolumeInfoMetrics implements MetricsSource { Interns.info("OzoneUsed", "Ozone used space"); private static final MetricsInfo RESERVED = Interns.info("Reserved", "Reserved Space"); - private static final MetricsInfo TOTAL_CAPACITY = - Interns.info("TotalCapacity", "Ozone capacity + reserved space"); private static final MetricsInfo FS_CAPACITY = Interns.info("FilesystemCapacity", "Filesystem capacity as reported by the local filesystem"); private static final MetricsInfo FS_AVAILABLE = Interns.info("FilesystemAvailable", "Filesystem available space as reported by the local filesystem"); private static final MetricsInfo FS_USED = Interns.info("FilesystemUsed", "Filesystem used space (FilesystemCapacity - FilesystemAvailable)"); + private static final MetricsInfo MIN_FREE_SPACE = + Interns.info("MinFreeSpace", + "Minimum free space threshold (soft limit) reported to SCM, " + + "derived from hdds.datanode.volume.min.free.space.percent / hdds.datanode.volume.min.free.space"); + private static final MetricsInfo NON_OZONE_USED = + Interns.info("NonOzoneUsed", + "Space on the filesystem consumed by non-Ozone workloads " + + "(FilesystemUsed - OzoneUsed)"); private final MetricsRegistry registry; private final String metricsSourceName; @@ -238,15 +244,17 @@ public void getMetrics(MetricsCollector collector, boolean all) { SpaceUsageSource.Fixed fsUsage = volumeUsage.realUsage(); SpaceUsageSource usage = volumeUsage.getCurrentUsage(fsUsage); long reserved = volumeUsage.getReservedInBytes(); + long ozoneCapacity = usage.getCapacity(); builder - .addGauge(CAPACITY, usage.getCapacity()) + .addGauge(CAPACITY, ozoneCapacity) .addGauge(AVAILABLE, usage.getAvailable()) .addGauge(USED, usage.getUsedSpace()) .addGauge(RESERVED, reserved) - .addGauge(TOTAL_CAPACITY, usage.getCapacity() + reserved) .addGauge(FS_CAPACITY, fsUsage.getCapacity()) .addGauge(FS_AVAILABLE, fsUsage.getAvailable()) - .addGauge(FS_USED, fsUsage.getUsedSpace()); + .addGauge(FS_USED, fsUsage.getCapacity() - fsUsage.getAvailable()) + .addGauge(MIN_FREE_SPACE, volume.getReportedFreeSpaceToSpare(ozoneCapacity)) + .addGauge(NON_OZONE_USED, VolumeUsage.getOtherUsed(fsUsage)); } } } diff --git a/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn-overview.html b/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn-overview.html index f1a89b779ee2..9b15a0bf374d 100644 --- a/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn-overview.html +++ b/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn-overview.html @@ -57,10 +57,11 @@

Volume Information

Ozone Used Ozone Available Reserved - Total Capacity (Ozone Capacity + Reserved) Filesystem Capacity Filesystem Available Filesystem Used + Min Free Space + Non-Ozone Used Containers State @@ -74,10 +75,11 @@

Volume Information

{{volumeInfo.OzoneUsed}} {{volumeInfo.OzoneAvailable}} {{volumeInfo.Reserved}} - {{volumeInfo.TotalCapacity}} {{volumeInfo.FilesystemCapacity}} {{volumeInfo.FilesystemAvailable}} {{volumeInfo.FilesystemUsed}} + {{volumeInfo.MinFreeSpace}} + {{volumeInfo.NonOzoneUsed}} {{volumeInfo.Containers}} {{volumeInfo["tag.VolumeState"]}} diff --git a/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn.js b/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn.js index cd3a238a883f..3e6c36662dd6 100644 --- a/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn.js +++ b/hadoop-hdds/container-service/src/main/resources/webapps/hddsDatanode/dn.js @@ -34,10 +34,11 @@ volume.OzoneUsed = transform(volume.OzoneUsed); volume.OzoneAvailable = transform(volume.OzoneAvailable); volume.Reserved = transform(volume.Reserved); - volume.TotalCapacity = transform(volume.TotalCapacity); volume.FilesystemCapacity = transform(volume.FilesystemCapacity); volume.FilesystemAvailable = transform(volume.FilesystemAvailable); volume.FilesystemUsed = transform(volume.FilesystemUsed); + volume.MinFreeSpace = transform(volume.MinFreeSpace); + volume.NonOzoneUsed = transform(volume.NonOzoneUsed); }) }); diff --git a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeInfoMetrics.java b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeInfoMetrics.java index 7dc96458fdb7..bca6170d6b61 100644 --- a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeInfoMetrics.java +++ b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestVolumeInfoMetrics.java @@ -19,6 +19,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -43,20 +44,23 @@ void testVolumeInfoMetricsExposeOzoneAndFilesystemGauges() { when(volume.getType()).thenReturn(HddsVolume.VolumeType.DATA_VOLUME); when(volume.getCommittedBytes()).thenReturn(10L); when(volume.getContainers()).thenReturn(3L); + when(volume.getReportedFreeSpaceToSpare(anyLong())).thenReturn(20L); VolumeUsage volumeUsage = mock(VolumeUsage.class); when(volume.getVolumeUsage()).thenReturn(volumeUsage); - // Ozone-usable usage and reserved - when(volumeUsage.getCurrentUsage(any())).thenReturn(new SpaceUsageSource.Fixed( - 1000L, - 900L, - 100L - )); when(volumeUsage.getReservedInBytes()).thenReturn(50L); - // Raw filesystem stats - when(volumeUsage.realUsage()).thenReturn(new SpaceUsageSource.Fixed(2000L, 1500L, 500L)); + // Raw filesystem stats (used = Ozone DU usage on disk) + SpaceUsageSource.Fixed fsUsage = new SpaceUsageSource.Fixed(2000L, 1100L, 500L); + when(volumeUsage.realUsage()).thenReturn(fsUsage); + + // getCurrentUsage(real) preserves real.getUsedSpace(); capacity/available are adjusted for reserved + when(volumeUsage.getCurrentUsage(any())).thenReturn(new SpaceUsageSource.Fixed( + 1950L, // fsCapacity - reserved + 1100L, + 500L // same as fsUsage.getUsedSpace() + )); VolumeInfoMetrics metrics = new VolumeInfoMetrics("test-vol-1", volume); try { @@ -67,13 +71,17 @@ void testVolumeInfoMetricsExposeOzoneAndFilesystemGauges() { MetricsRecordImpl rec = collector.getRecords().get(0); Iterable all = rec.metrics(); - assertThat(findMetric(all, "OzoneCapacity")).isEqualTo(1000L); - assertThat(findMetric(all, "OzoneAvailable")).isEqualTo(900L); - assertThat(findMetric(all, "OzoneUsed")).isEqualTo(100L); + assertThat(findMetric(all, "OzoneCapacity")).isEqualTo(1950L); + assertThat(findMetric(all, "OzoneAvailable")).isEqualTo(1100L); + assertThat(findMetric(all, "OzoneUsed")).isEqualTo(500L); assertThat(findMetric(all, "FilesystemCapacity")).isEqualTo(2000L); - assertThat(findMetric(all, "FilesystemAvailable")).isEqualTo(1500L); - assertThat(findMetric(all, "FilesystemUsed")).isEqualTo(500L); + assertThat(findMetric(all, "FilesystemAvailable")).isEqualTo(1100L); + assertThat(findMetric(all, "FilesystemUsed")).isEqualTo(900L); // FilesystemCapacity - FilesystemAvailable + + assertThat(findMetric(all, "MinFreeSpace")).isEqualTo(20L); + // NonOzoneUsed = FilesystemUsed - OzoneUsed = 900 - 500 + assertThat(findMetric(all, "NonOzoneUsed")).isEqualTo(400L); } finally { metrics.unregister(); }