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

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


The following commit(s) were added to refs/heads/master by this push:
     new d71b9aa04 simplify the convertUnit (#2595)
d71b9aa04 is described below

commit d71b9aa048b90ee9aa257409c5632f2a14e0fa64
Author: lingluojun <[email protected]>
AuthorDate: Tue Aug 27 22:01:44 2024 +0800

    simplify the convertUnit (#2595)
    
    Co-authored-by: tomsun28 <[email protected]>
    Co-authored-by: Eric <[email protected]>
    Co-authored-by: shown <[email protected]>
---
 .../collector/dispatch/MetricsCollect.java         | 47 +++++++++---------
 .../collector/dispatch/unit/UnitConvert.java       |  6 ++-
 ...taSizeConvert.java => AbstractUnitConvert.java} | 57 +++++++++++-----------
 .../dispatch/unit/impl/DataSizeConvert.java        | 53 +++++---------------
 .../dispatch/unit/impl/TimeLengthConvert.java      | 44 +++++------------
 5 files changed, 79 insertions(+), 128 deletions(-)

diff --git 
a/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/MetricsCollect.java
 
b/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/MetricsCollect.java
index 118e8d5a2..a54a391c2 100644
--- 
a/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/MetricsCollect.java
+++ 
b/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/MetricsCollect.java
@@ -17,13 +17,6 @@
 
 package org.apache.hertzbeat.collector.dispatch;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.jexl3.JexlExpression;
@@ -41,6 +34,13 @@ import org.apache.hertzbeat.common.entity.message.CollectRep;
 import org.apache.hertzbeat.common.util.CommonUtil;
 import org.apache.hertzbeat.common.util.JexlExpressionRunner;
 import org.apache.hertzbeat.common.util.Pair;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
 
 /**
  * metrics collection
@@ -134,7 +134,7 @@ public class MetricsCollect implements Runnable, 
Comparable<MetricsCollect> {
         // for prometheus auto
         if 
(DispatchConstants.PROTOCOL_PROMETHEUS.equalsIgnoreCase(metrics.getProtocol())) 
{
             List<CollectRep.MetricsData> metricsData = 
PrometheusAutoCollectImpl
-                    .getInstance().collect(response, metrics);
+                .getInstance().collect(response, metrics);
             validateResponse(metricsData.stream().findFirst().orElse(null));
             collectDataDispatch.dispatchCollectData(timeout, metrics, 
metricsData);
             return;
@@ -145,10 +145,10 @@ public class MetricsCollect implements Runnable, 
Comparable<MetricsCollect> {
         AbstractCollect abstractCollect = 
CollectStrategyFactory.invoke(metrics.getProtocol());
         if (abstractCollect == null) {
             log.error("[Dispatcher] - not support this: app: {}, metrics: {}, 
protocol: {}.",
-                    app, metrics.getName(), metrics.getProtocol());
+                app, metrics.getName(), metrics.getProtocol());
             response.setCode(CollectRep.Code.FAIL);
             response.setMsg("not support " + app + ", "
-                    + metrics.getName() + ", " + metrics.getProtocol());
+                + metrics.getName() + ", " + metrics.getProtocol());
         } else {
             try {
                 abstractCollect.preCheck(metrics);
@@ -158,7 +158,7 @@ public class MetricsCollect implements Runnable, 
Comparable<MetricsCollect> {
                 if (msg == null && e.getCause() != null) {
                     msg = e.getCause().getMessage();
                 }
-                if (e instanceof IllegalArgumentException){
+                if (e instanceof IllegalArgumentException) {
                     log.error("[Metrics PreCheck]: {}.", msg, e);
                 } else {
                     log.error("[Metrics Collect]: {}.", msg, e);
@@ -209,19 +209,19 @@ public class MetricsCollect implements Runnable, 
Comparable<MetricsCollect> {
         // eg: database_pages=Database pages unconventional mapping
         Map<String, String> fieldAliasMap = new HashMap<>(8);
         Map<String, JexlExpression> fieldExpressionMap = 
metrics.getCalculates()
-                .stream()
-                .map(cal -> transformCal(cal, fieldAliasMap))
-                .filter(Objects::nonNull)
-                .collect(Collectors.toMap(arr -> (String) arr[0], arr -> 
(JexlExpression) arr[1], (oldValue, newValue) -> newValue));
+            .stream()
+            .map(cal -> transformCal(cal, fieldAliasMap))
+            .filter(Objects::nonNull)
+            .collect(Collectors.toMap(arr -> (String) arr[0], arr -> 
(JexlExpression) arr[1], (oldValue, newValue) -> newValue));
 
         if (metrics.getUnits() == null) {
             metrics.setUnits(Collections.emptyList());
         }
         Map<String, Pair<String, String>> fieldUnitMap = metrics.getUnits()
-                .stream()
-                .map(this::transformUnit)
-                .filter(Objects::nonNull)
-                .collect(Collectors.toMap(arr -> (String) arr[0], arr -> 
(Pair<String, String>) arr[1], (oldValue, newValue) -> newValue));
+            .stream()
+            .map(this::transformUnit)
+            .filter(Objects::nonNull)
+            .collect(Collectors.toMap(arr -> (String) arr[0], arr -> 
(Pair<String, String>) arr[1], (oldValue, newValue) -> newValue));
 
         List<Metrics.Field> fields = metrics.getFields();
         List<String> aliasFields = metrics.getAliasFields();
@@ -238,7 +238,7 @@ public class MetricsCollect implements Runnable, 
Comparable<MetricsCollect> {
                     aliasFieldValueMap.put(aliasField, aliasFieldValue);
                     // whether the alias field is a number
                     CollectUtil.DoubleAndUnit doubleAndUnit = CollectUtil
-                            .extractDoubleAndUnitFromStr(aliasFieldValue);
+                        .extractDoubleAndUnitFromStr(aliasFieldValue);
                     if (doubleAndUnit != null && doubleAndUnit.getValue() != 
null) {
                         fieldValueMap.put(aliasField, 
doubleAndUnit.getValue());
                         if (doubleAndUnit.getUnit() != null) {
@@ -297,7 +297,7 @@ public class MetricsCollect implements Runnable, 
Comparable<MetricsCollect> {
                         final byte fieldType = field.getType();
                         if (fieldType == CommonConstants.TYPE_NUMBER) {
                             CollectUtil.DoubleAndUnit doubleAndUnit = 
CollectUtil
-                                    .extractDoubleAndUnitFromStr(value);
+                                .extractDoubleAndUnitFromStr(value);
                             final Double tempValue = doubleAndUnit == null ? 
null : doubleAndUnit.getValue();
                             value = tempValue == null ? null : 
String.valueOf(tempValue);
                             aliasFieldUnit = doubleAndUnit == null ? null : 
doubleAndUnit.getUnit();
@@ -343,7 +343,7 @@ public class MetricsCollect implements Runnable, 
Comparable<MetricsCollect> {
 
 
     /**
-     * @param cal cal
+     * @param cal           cal
      * @param fieldAliasMap field alias map
      * @return expr
      */
@@ -364,6 +364,7 @@ public class MetricsCollect implements Runnable, 
Comparable<MetricsCollect> {
 
     /**
      * transform unit
+     *
      * @param unit unit
      * @return units
      */
@@ -419,7 +420,7 @@ public class MetricsCollect implements Runnable, 
Comparable<MetricsCollect> {
 
     private void setNewThreadName(long monitorId, String app, long startTime, 
Metrics metrics) {
         String builder = monitorId + "-" + app + "-" + metrics.getName()
-                + "-" + String.valueOf(startTime).substring(9);
+            + "-" + String.valueOf(startTime).substring(9);
         Thread.currentThread().setName(builder);
     }
 
diff --git 
a/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/UnitConvert.java
 
b/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/UnitConvert.java
index c1b5c31b0..fd50507ad 100644
--- 
a/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/UnitConvert.java
+++ 
b/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/UnitConvert.java
@@ -26,9 +26,10 @@ public interface UnitConvert {
 
     /**
      * convert originUnit value to newUnit value
-     * @param value The collected value
+     *
+     * @param value      The collected value
      * @param originUnit The unit to which the original value corresponds.
-     * @param newUnit The unit to display
+     * @param newUnit    The unit to display
      * @return Converted value
      */
     String convert(String value, String originUnit, String newUnit);
@@ -36,6 +37,7 @@ public interface UnitConvert {
     /**
      * check the unit and confirm to use this implement class
      * Checks for units before and after xxx -> xxx, also to make sure that 
the implementation class is being used
+     *
      * @param unit unit
      * @return true/false
      */
diff --git 
a/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/DataSizeConvert.java
 
b/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/AbstractUnitConvert.java
similarity index 55%
copy from 
collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/DataSizeConvert.java
copy to 
collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/AbstractUnitConvert.java
index 7a8e405ac..0669416a6 100644
--- 
a/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/DataSizeConvert.java
+++ 
b/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/AbstractUnitConvert.java
@@ -17,57 +17,58 @@
 
 package org.apache.hertzbeat.collector.dispatch.unit.impl;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.hertzbeat.collector.dispatch.unit.DataUnit;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.hertzbeat.collector.dispatch.unit.UnitConvert;
-import org.springframework.stereotype.Component;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.Map;
 
 /**
- * the convert of data size
+ * abstract UnitConvert
  */
 @Slf4j
-@Component
-public final class DataSizeConvert implements UnitConvert {
+public abstract class AbstractUnitConvert implements UnitConvert {
+
 
     @Override
     public String convert(String value, String originUnit, String newUnit) {
-        if (value == null || value.isEmpty()) {
+        if (StringUtils.isBlank(value)) {
             return null;
         }
         if (!checkUnit(originUnit) || !checkUnit(newUnit)) {
             return null;
         }
+
         if (originUnit.equalsIgnoreCase(newUnit)) {
             log.warn("The origin unit is the same as the new unit, no need to 
convert");
             return value;
         }
-        BigDecimal size = new BigDecimal(value);
-        // Idea: Value is converted to bytes through origin unit,
-        // and then converted to the value corresponding to the new unit unit
-        for (DataUnit dataUnit : DataUnit.values()) {
-            if (dataUnit.getUnit().equals(originUnit.toUpperCase())) {
-                size = size.multiply(new BigDecimal(dataUnit.getScale()));
-            }
-            if (dataUnit.getUnit().equals(newUnit.toUpperCase())) {
-                size = size.divide(new BigDecimal(dataUnit.getScale()), 12, 
RoundingMode.HALF_UP);
-            }
-        }
-        return size.setScale(4, 
RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
+        BigDecimal wrappedValue = new BigDecimal(value);
+
+        Map<String, Long> unitMap = convertUnitEnumToMap();
+
+        //There is no need to check again,as both the originUnit and newUnit 
have already been checked for existence.
+        Long multipleScale = unitMap.get(originUnit.toUpperCase());
+        wrappedValue = wrappedValue.multiply(new BigDecimal(multipleScale));
+
+        Long divideScale = unitMap.get(newUnit.toUpperCase());
+        wrappedValue = wrappedValue.divide(new BigDecimal(divideScale), 12, 
RoundingMode.HALF_UP);
+
+        return wrappedValue.setScale(4, 
RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
     }
 
     @Override
     public boolean checkUnit(String unit) {
-        if (unit == null || unit.isEmpty()) {
+        if (StringUtils.isBlank(unit)) {
             return false;
         }
-        for (DataUnit dataUnit : DataUnit.values()) {
-            // not case-sensitive
-            if (dataUnit.getUnit().equals(unit.toUpperCase())) {
-                return true;
-            }
-        }
-        return false;
+        Map<String, Long> convertedUnitEnumToMap = convertUnitEnumToMap();
+        return convertedUnitEnumToMap.containsKey(unit.toUpperCase());
     }
+
+    /***
+     * this method can be used to convert   specific enum to map by the 
Inherited class
+     */
+    abstract Map<String, Long> convertUnitEnumToMap();
 }
diff --git 
a/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/DataSizeConvert.java
 
b/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/DataSizeConvert.java
index 7a8e405ac..1308c2484 100644
--- 
a/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/DataSizeConvert.java
+++ 
b/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/DataSizeConvert.java
@@ -17,57 +17,26 @@
 
 package org.apache.hertzbeat.collector.dispatch.unit.impl;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import lombok.extern.slf4j.Slf4j;
 import org.apache.hertzbeat.collector.dispatch.unit.DataUnit;
-import org.apache.hertzbeat.collector.dispatch.unit.UnitConvert;
 import org.springframework.stereotype.Component;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * the convert of data size
  */
-@Slf4j
 @Component
-public final class DataSizeConvert implements UnitConvert {
+public final class DataSizeConvert extends AbstractUnitConvert {
 
-    @Override
-    public String convert(String value, String originUnit, String newUnit) {
-        if (value == null || value.isEmpty()) {
-            return null;
-        }
-        if (!checkUnit(originUnit) || !checkUnit(newUnit)) {
-            return null;
-        }
-        if (originUnit.equalsIgnoreCase(newUnit)) {
-            log.warn("The origin unit is the same as the new unit, no need to 
convert");
-            return value;
-        }
-        BigDecimal size = new BigDecimal(value);
-        // Idea: Value is converted to bytes through origin unit,
-        // and then converted to the value corresponding to the new unit unit
-        for (DataUnit dataUnit : DataUnit.values()) {
-            if (dataUnit.getUnit().equals(originUnit.toUpperCase())) {
-                size = size.multiply(new BigDecimal(dataUnit.getScale()));
-            }
-            if (dataUnit.getUnit().equals(newUnit.toUpperCase())) {
-                size = size.divide(new BigDecimal(dataUnit.getScale()), 12, 
RoundingMode.HALF_UP);
-            }
-        }
-        return size.setScale(4, 
RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
-    }
 
+    /**
+     * convert the enumeration of DataUnit to  map where the key is the unit 
and the value is the conversion coefficient.
+     */
     @Override
-    public boolean checkUnit(String unit) {
-        if (unit == null || unit.isEmpty()) {
-            return false;
-        }
-        for (DataUnit dataUnit : DataUnit.values()) {
-            // not case-sensitive
-            if (dataUnit.getUnit().equals(unit.toUpperCase())) {
-                return true;
-            }
-        }
-        return false;
+    Map<String, Long> convertUnitEnumToMap() {
+        return 
Arrays.stream(DataUnit.values()).collect(Collectors.toMap(DataUnit::getUnit, 
DataUnit::getScale));
     }
+
+
 }
diff --git 
a/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/TimeLengthConvert.java
 
b/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/TimeLengthConvert.java
index a185d6b1a..9766905be 100644
--- 
a/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/TimeLengthConvert.java
+++ 
b/collector/src/main/java/org/apache/hertzbeat/collector/dispatch/unit/impl/TimeLengthConvert.java
@@ -17,48 +17,26 @@
 
 package org.apache.hertzbeat.collector.dispatch.unit.impl;
 
-import java.math.BigDecimal;
-import java.math.RoundingMode;
 import org.apache.hertzbeat.collector.dispatch.unit.TimeLengthUnit;
-import org.apache.hertzbeat.collector.dispatch.unit.UnitConvert;
 import org.springframework.stereotype.Component;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * the convert of time length
  */
 @Component
-public final class TimeLengthConvert implements UnitConvert {
+public final class TimeLengthConvert extends AbstractUnitConvert {
 
-    @Override
-    public String convert(String value, String originUnit, String newUnit) {
-        if (value == null || value.isEmpty()) {
-            return null;
-        }
-        BigDecimal length = new BigDecimal(value);
-        // Idea: Value is converted to nanoseconds through origin unit,
-        // and then converted to the value corresponding to the new unit unit
-        for (TimeLengthUnit timeLengthUnit : TimeLengthUnit.values()) {
-            if (timeLengthUnit.getUnit().equals(originUnit.toUpperCase())) {
-                length = length.multiply(new 
BigDecimal(timeLengthUnit.getScale()));
-            }
-            if (timeLengthUnit.getUnit().equals(newUnit.toUpperCase())) {
-                length = length.divide(new 
BigDecimal(timeLengthUnit.getScale()), 12, RoundingMode.HALF_UP);
-            }
-        }
-        return length.setScale(4, 
RoundingMode.HALF_UP).stripTrailingZeros().toPlainString();
-    }
 
+    /**
+     * convert the enumeration of TimeLengthUnit to  map where the key is the 
unit and the value is the conversion coefficient.
+     */
     @Override
-    public boolean checkUnit(String unit) {
-        if (unit == null || unit.isEmpty()) {
-            return false;
-        }
-        for (TimeLengthUnit timeUnit : TimeLengthUnit.values()) {
-            // not case-sensitive
-            if (timeUnit.getUnit().equals(unit.toUpperCase())) {
-                return true;
-            }
-        }
-        return false;
+    Map<String, Long> convertUnitEnumToMap() {
+        return 
Arrays.stream(TimeLengthUnit.values()).collect(Collectors.toMap(TimeLengthUnit::getUnit,
 TimeLengthUnit::getScale));
     }
+
+
 }


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

Reply via email to