diff options
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)); + } } |