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();
}