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]