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

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


The following commit(s) were added to refs/heads/master by this push:
     new 80426c5ba3 HDDS-12165. Refactor VolumeInfoMetrics to use 
getCurrentUsage (#7784)
80426c5ba3 is described below

commit 80426c5ba3e5325f5144068de58fdf8ac3675a09
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Sat Feb 1 08:22:38 2025 +0100

    HDDS-12165. Refactor VolumeInfoMetrics to use getCurrentUsage (#7784)
---
 .../container/common/volume/VolumeInfoMetrics.java | 111 +++++++++------------
 .../container/common/volume/TestHddsVolume.java    |  12 +--
 2 files changed, 52 insertions(+), 71 deletions(-)

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 cd31b8063d..4e553d2566 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
@@ -18,11 +18,18 @@
 
 package org.apache.hadoop.ozone.container.common.volume;
 
+import org.apache.hadoop.hdds.fs.SpaceUsageSource;
+import org.apache.hadoop.metrics2.MetricsCollector;
+import org.apache.hadoop.metrics2.MetricsInfo;
+import org.apache.hadoop.metrics2.MetricsRecordBuilder;
+import org.apache.hadoop.metrics2.MetricsSource;
 import org.apache.hadoop.metrics2.MetricsSystem;
 import org.apache.hadoop.metrics2.annotation.Metric;
 import org.apache.hadoop.metrics2.annotation.Metrics;
 import org.apache.hadoop.metrics2.lib.DefaultMetricsSystem;
 import org.apache.hadoop.metrics2.lib.MutableRate;
+import org.apache.hadoop.metrics2.lib.Interns;
+import org.apache.hadoop.metrics2.lib.MetricsRegistry;
 import org.apache.hadoop.ozone.OzoneConsts;
 
 
@@ -31,20 +38,37 @@
  */
 @Metrics(about = "Ozone Volume Information Metrics",
     context = OzoneConsts.OZONE)
-public class VolumeInfoMetrics {
-
-  private String metricsSourceName = VolumeInfoMetrics.class.getSimpleName();
+public class VolumeInfoMetrics implements MetricsSource {
+
+  private static final String SOURCE_BASENAME =
+      VolumeInfoMetrics.class.getSimpleName();
+
+  private static final MetricsInfo CAPACITY =
+      Interns.info("Capacity", "Capacity");
+  private static final MetricsInfo AVAILABLE =
+      Interns.info("Available", "Available Space");
+  private static final MetricsInfo USED =
+      Interns.info("Used", "Used Space");
+  private static final MetricsInfo RESERVED =
+      Interns.info("Reserved", "Reserved Space");
+  private static final MetricsInfo TOTAL_CAPACITY =
+      Interns.info("TotalCapacity", "Total Capacity");
+
+  private final MetricsRegistry registry;
+  private final String metricsSourceName;
   private final HddsVolume volume;
   @Metric("Returns the RocksDB compact times of the Volume")
   private MutableRate dbCompactLatency;
-  private long containers;
 
   /**
    * @param identifier Typically, path to volume root. E.g. /data/hdds
    */
-  public VolumeInfoMetrics(String identifier, HddsVolume ref) {
-    this.metricsSourceName += '-' + identifier;
-    this.volume = ref;
+  public VolumeInfoMetrics(String identifier, HddsVolume volume) {
+    this.volume = volume;
+
+    metricsSourceName = SOURCE_BASENAME + '-' + identifier;
+    registry = new MetricsRegistry(metricsSourceName);
+
     init();
   }
 
@@ -88,63 +112,6 @@ public String getVolumeType() {
     return volume.getType().name();
   }
 
-  public String getMetricsSourceName() {
-    return metricsSourceName;
-  }
-
-  /**
-   * Test conservative avail space.
-   * |----used----|   (avail)   |++++++++reserved++++++++|
-   * |<------- capacity ------->|
-   * |<------------------- Total capacity -------------->|
-   * A) avail = capacity - used
-   * B) capacity = used + avail
-   * C) Total capacity = used + avail + reserved
-   */
-
-  /**
-   * Return the Storage type for the Volume.
-   */
-  @Metric("Returns the Used space")
-  public long getUsed() {
-    return volume.getVolumeInfo().map(VolumeInfo::getScmUsed)
-            .orElse(0L);
-  }
-
-  /**
-   * Return the Total Available capacity of the Volume.
-   */
-  @Metric("Returns the Available space")
-  public long getAvailable() {
-    return volume.getVolumeInfo().map(VolumeInfo::getAvailable)
-            .orElse(0L);
-  }
-
-  /**
-   * Return the Total Reserved of the Volume.
-   */
-  @Metric("Fetches the Reserved Space")
-  public long getReserved() {
-    return volume.getVolumeInfo().map(VolumeInfo::getReservedInBytes)
-            .orElse(0L);
-  }
-
-  /**
-   * Return the Total capacity of the Volume.
-   */
-  @Metric("Returns the Capacity of the Volume")
-  public long getCapacity() {
-    return getUsed() + getAvailable();
-  }
-
-  /**
-   * Return the Total capacity of the Volume.
-   */
-  @Metric("Returns the Total Capacity of the Volume")
-  public long getTotalCapacity() {
-    return (getUsed() + getAvailable() + getReserved());
-  }
-
   @Metric("Returns the Committed bytes of the Volume")
   public long getCommitted() {
     return volume.getCommittedBytes();
@@ -161,4 +128,20 @@ public void dbCompactTimesNanoSecondsIncr(long time) {
   public long getContainers() {
     return volume.getContainers();
   }
+
+  @Override
+  public void getMetrics(MetricsCollector collector, boolean all) {
+    MetricsRecordBuilder builder = collector.addRecord(metricsSourceName);
+    registry.snapshot(builder, all);
+    volume.getVolumeInfo().ifPresent(volumeInfo -> {
+      SpaceUsageSource usage = volumeInfo.getCurrentUsage();
+      long reserved = volumeInfo.getReservedInBytes();
+      builder
+          .addGauge(CAPACITY, usage.getCapacity())
+          .addGauge(AVAILABLE, usage.getAvailable())
+          .addGauge(USED, usage.getUsedSpace())
+          .addGauge(RESERVED, reserved)
+          .addGauge(TOTAL_CAPACITY, usage.getCapacity() + reserved);
+    });
+  }
 }
diff --git 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestHddsVolume.java
 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestHddsVolume.java
index b6a6d2566f..99056dd79b 100644
--- 
a/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestHddsVolume.java
+++ 
b/hadoop-hdds/container-service/src/test/java/org/apache/hadoop/ozone/container/common/volume/TestHddsVolume.java
@@ -37,6 +37,8 @@
 import org.apache.hadoop.hdds.fs.SpaceUsageSource;
 import org.apache.hadoop.hdds.scm.ScmConfigKeys;
 import org.apache.hadoop.hdfs.server.datanode.checker.VolumeCheckResult;
+import org.apache.hadoop.metrics2.MetricsCollector;
+import org.apache.hadoop.metrics2.impl.MetricsCollectorImpl;
 import org.apache.hadoop.ozone.OzoneConfigKeys;
 
 import static org.apache.hadoop.hdds.fs.MockSpaceUsagePersistence.inMemory;
@@ -504,13 +506,9 @@ public void testFailedVolumeSpace() throws IOException {
     VolumeInfoMetrics volumeInfoMetrics = volume.getVolumeInfoStats();
 
     try {
-      // In case of failed volume all stats should return 0.
-      assertEquals(0, volumeInfoMetrics.getUsed());
-      assertEquals(0, volumeInfoMetrics.getAvailable());
-      assertEquals(0, volumeInfoMetrics.getCapacity());
-      assertEquals(0, volumeInfoMetrics.getReserved());
-      assertEquals(0, volumeInfoMetrics.getTotalCapacity());
-      assertEquals(0, volumeInfoMetrics.getCommitted());
+      // In case of failed volume, metrics should not throw
+      MetricsCollector collector = new MetricsCollectorImpl();
+      volumeInfoMetrics.getMetrics(collector, true);
     } finally {
       // Shutdown the volume.
       volume.shutdown();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to