aboutsummaryrefslogtreecommitdiffstats
path: root/metrics-proxy
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-12-17 07:12:30 +0100
committerHenning Baldersheim <balder@yahoo-inc.com>2021-12-17 07:17:35 +0100
commit74ab92418ba90fc9f67ddb3fae19df32e694d427 (patch)
tree9348b13444175c19bfa500e877279f79883ff936 /metrics-proxy
parent2eaa27f75d37737eaac6e14a2ac68d94646eb209 (diff)
numbers outside of the range of a long are forced to have a decimal punctuation to enforce parsing as non integer number.
Diffstat (limited to 'metrics-proxy')
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java2
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/JacksonUtil.java29
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java17
3 files changed, 42 insertions, 6 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java
index 9bc0dddb784..133d8fee81f 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java
@@ -9,8 +9,6 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.util.List;
-import java.util.logging.Level;
-import java.util.logging.Logger;
import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_ABSENT;
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/JacksonUtil.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/JacksonUtil.java
index c4f2b7198a4..d599e75b243 100644
--- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/JacksonUtil.java
+++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/JacksonUtil.java
@@ -11,6 +11,7 @@ import com.fasterxml.jackson.databind.module.SimpleModule;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
import java.util.Locale;
/**
@@ -19,12 +20,18 @@ import java.util.Locale;
*/
public class JacksonUtil {
- private static final DecimalFormat decimalFormat = createDecimalFormat();
- private static DecimalFormat createDecimalFormat() {
+ private static final ThreadLocal<DecimalFormat> withinLongRangeFormat = ThreadLocal.withInitial(JacksonUtil::createWithinLongRangeFormat);
+ private static final ThreadLocal<DecimalFormat> outsideLongRangeFormat = ThreadLocal.withInitial(JacksonUtil::createOutsideLongRangeFormat);
+ private static DecimalFormat createWithinLongRangeFormat() {
DecimalFormat df = new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.ENGLISH));
df.setMaximumFractionDigits(13);
return df;
}
+ private static DecimalFormat createOutsideLongRangeFormat() {
+ DecimalFormat df = new DecimalFormat("#.0###", new DecimalFormatSymbols(Locale.ENGLISH));
+ df.setMaximumFractionDigits(13);
+ return df;
+ }
/**
* Returns an object mapper with a custom floating point serializer to avoid scientific notation
*/
@@ -40,13 +47,27 @@ public class JacksonUtil {
* Returns an object mapper with a custom floating point serializer to avoid scientific notation
*/
public static void writeDouble(JsonGenerator jgen, Double value) throws IOException {
- jgen.writeNumber(decimalFormat.format(value));
+ jgen.writeNumber(format(value));
+ }
+
+ public static String format(Double value) {
+ return format(value, withinLongRangeFormat.get(), outsideLongRangeFormat.get());
+ }
+
+ private static String format(Double value, NumberFormat withinLongRange, NumberFormat outsideLongRange) {
+ if ((value <= Long.MAX_VALUE) && (value >= Long.MIN_VALUE)) {
+ return withinLongRange.format(value);
+ } else {
+ return outsideLongRange.format(value);
+ }
}
public static class DoubleSerializer extends JsonSerializer<Double> {
+ private DecimalFormat withinLongRangeFormat = createWithinLongRangeFormat();
+ private DecimalFormat outsideLongRangeFormat = createOutsideLongRangeFormat();
@Override
public void serialize(Double value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
- writeDouble(jgen, value);
+ jgen.writeNumber(format(value, withinLongRangeFormat, outsideLongRangeFormat));
}
}
diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java
index 5a9bc9ee725..5ddd10fd03c 100644
--- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java
+++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java
@@ -143,4 +143,21 @@ public class GenericJsonModelTest {
return mapper.readValue(getFileContents(filename), GenericJsonModel.class);
}
+ @Test
+ public void within_long_range_as_long_if_possible() {
+ assertEquals("7", JacksonUtil.format(7D));
+ assertEquals("7.1", JacksonUtil.format(7.1));
+ assertEquals("-7", JacksonUtil.format(-7D));
+ assertEquals("-7.1", JacksonUtil.format(-7.1));
+ }
+
+ @Test
+ public void outside_long_range_as_decimal_if_possible() {
+ double within = Long.MAX_VALUE;
+ double outside = 3 * within;
+ assertEquals("9223372036854776000", JacksonUtil.format(within));
+ assertEquals("-9223372036854776000", JacksonUtil.format(-within));
+ assertEquals("27670116110564327000.0", JacksonUtil.format(outside));
+ assertEquals("-27670116110564327000.0", JacksonUtil.format(-outside));
+ }
}