diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2023-11-23 16:07:43 +0100 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2023-11-23 16:12:51 +0100 |
commit | ef535f6c51393d945d9fe07de38de224d5ae443f (patch) | |
tree | 2f5976537a200aebbf6644b8e1ef93f2c669319d /metrics-proxy | |
parent | f966346429c85fc31c8ea962b518e02a19f77f46 (diff) |
jackson 2.16 changes some of its default settings so we consolidate our use of the ObjectMapper.
Unless special options are used, use a common instance, or create via factory metod.
Diffstat (limited to 'metrics-proxy')
16 files changed, 69 insertions, 88 deletions
diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericApplicationModel.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericApplicationModel.java index a9ebd41fd36..59d1f9e5c83 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericApplicationModel.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericApplicationModel.java @@ -4,7 +4,6 @@ package ai.vespa.metricsproxy.metric.model.json; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.List; @@ -22,9 +21,8 @@ public class GenericApplicationModel { public List<GenericJsonModel> nodes; public String serialize() { - ObjectMapper mapper = JacksonUtil.createObjectMapper(); try { - return mapper.writeValueAsString(this); + return JacksonUtil.objectMapper().writeValueAsString(this); } catch (IOException e) { throw new JsonRenderingException("Could not render application nodes. Check the log for details.", e); } 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 ffb9813d257..c4ba0f39a18 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 @@ -5,7 +5,6 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.List; @@ -33,9 +32,8 @@ public class GenericJsonModel { public List<GenericService> services; public String serialize() { - ObjectMapper mapper = JacksonUtil.createObjectMapper(); try { - return mapper.writeValueAsString(this); + return JacksonUtil.objectMapper().writeValueAsString(this); } catch (IOException e) { throw new JsonRenderingException("Could not render metrics. Check the log for details.", e); } diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonUtil.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonUtil.java index 02f45010873..c32e90ecc9f 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonUtil.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonUtil.java @@ -5,7 +5,6 @@ import ai.vespa.metricsproxy.http.application.Node; import ai.vespa.metricsproxy.metric.model.MetricsPacket; import ai.vespa.metricsproxy.metric.model.ServiceId; import ai.vespa.metricsproxy.metric.model.StatusCode; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.util.ArrayList; @@ -18,7 +17,7 @@ import java.util.stream.Collectors; import static ai.vespa.metricsproxy.metric.ExternalMetrics.VESPA_NODE_SERVICE_ID; import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId; import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId; -import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.createObjectMapper; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static java.util.logging.Level.WARNING; @@ -87,8 +86,7 @@ public class GenericJsonUtil { public static List<MetricsPacket.Builder> toMetricsPackets(String jsonString) { try { - ObjectMapper mapper = createObjectMapper(); - GenericJsonModel jsonModel = mapper.readValue(jsonString, GenericJsonModel.class); + GenericJsonModel jsonModel = objectMapper().readValue(jsonString, GenericJsonModel.class); return toMetricsPackets(jsonModel); } catch (IOException e) { log.log(WARNING, "Could not create metrics packet from string:\n" + jsonString, e); 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 72835a44e7f..8eb7df20218 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 @@ -1,6 +1,7 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package ai.vespa.metricsproxy.metric.model.json; +import ai.vespa.json.Jackson; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.Version; import com.fasterxml.jackson.databind.JsonSerializer; @@ -22,6 +23,7 @@ public class JacksonUtil { private static final ThreadLocal<DecimalFormat> withinLongRangeFormat = ThreadLocal.withInitial(JacksonUtil::createWithinLongRangeFormat); private static final ThreadLocal<DecimalFormat> outsideLongRangeFormat = ThreadLocal.withInitial(JacksonUtil::createOutsideLongRangeFormat); + private static final ObjectMapper objectMapper = createObjectMapper(); private static DecimalFormat createWithinLongRangeFormat() { DecimalFormat df = new DecimalFormat("#.####", new DecimalFormatSymbols(Locale.ENGLISH)); df.setMaximumFractionDigits(13); @@ -35,14 +37,17 @@ public class JacksonUtil { /** * Returns an object mapper with a custom floating point serializer to avoid scientific notation */ - public static ObjectMapper createObjectMapper() { - ObjectMapper mapper = new ObjectMapper(); + private static ObjectMapper createObjectMapper() { + ObjectMapper mapper = Jackson.createMapper(); SimpleModule module = new SimpleModule("DoubleSerializer", new Version(1, 0, 0, "", null, null)); module.addSerializer(Double.class, new DoubleSerializer()); mapper.registerModule(module); return mapper; } + public static ObjectMapper objectMapper() { + return objectMapper; + } /** * Returns an object mapper with a custom floating point serializer to avoid scientific notation */ @@ -63,8 +68,8 @@ public class JacksonUtil { } public static class DoubleSerializer extends JsonSerializer<Double> { - private DecimalFormat withinLongRangeFormat = createWithinLongRangeFormat(); - private DecimalFormat outsideLongRangeFormat = createOutsideLongRangeFormat(); + private final DecimalFormat withinLongRangeFormat = createWithinLongRangeFormat(); + private final DecimalFormat outsideLongRangeFormat = createOutsideLongRangeFormat(); @Override public void serialize(Double value, JsonGenerator jgen, SerializerProvider provider) throws IOException { jgen.writeNumber(format(value, withinLongRangeFormat, outsideLongRangeFormat)); diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtil.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtil.java index 6a88350d5ed..82049da5115 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtil.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtil.java @@ -9,7 +9,6 @@ import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.StreamWriteFeature; import com.fasterxml.jackson.core.util.MinimalPrettyPrinter; -import com.fasterxml.jackson.databind.ObjectMapper; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -21,6 +20,7 @@ import java.util.logging.Logger; import java.util.stream.Collectors; import static ai.vespa.metricsproxy.http.ValuesFetcher.defaultMetricsConsumerId; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static java.util.Collections.emptyList; import static java.util.logging.Level.WARNING; @@ -56,9 +56,8 @@ public class YamasJsonUtil { */ public static List<MetricsPacket.Builder> toMetricsPackets(String jsonString) { List<MetricsPacket.Builder> packets = new ArrayList<>(); - try { - JsonParser jp = new JsonFactory().createParser(jsonString); - jp.setCodec(new ObjectMapper()); + var mapper = objectMapper(); + try (JsonParser jp = mapper.createParser(jsonString)) { while (jp.nextToken() != null) { YamasJsonModel jsonModel = jp.readValueAs(YamasJsonModel.class); packets.add(toMetricsPacketBuilder(jsonModel)); diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java index 43011a24f8c..80ad2256b1c 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/MetricsParser.java @@ -1,6 +1,7 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package ai.vespa.metricsproxy.service; +import ai.vespa.json.Jackson; import ai.vespa.metricsproxy.metric.Metric; import ai.vespa.metricsproxy.metric.model.DimensionId; import ai.vespa.metricsproxy.metric.model.MetricId; @@ -31,14 +32,18 @@ public class MetricsParser { void accept(Metric metric); } - private static final ObjectMapper jsonMapper = new ObjectMapper(); + private static final ObjectMapper jsonMapper = Jackson.mapper(); public static void parse(String data, Collector consumer) throws IOException { - parse(jsonMapper.createParser(data), consumer); + try (JsonParser parser = jsonMapper.createParser(data)) { + parse(parser, consumer); + } } static void parse(InputStream data, Collector consumer) throws IOException { - parse(jsonMapper.createParser(data), consumer); + try (JsonParser parser = jsonMapper.createParser(data)) { + parse(parser, consumer); + } } // Top level 'metrics' object, with e.g. 'time', 'status' and 'metrics'. @@ -123,21 +128,19 @@ public class MetricsParser { for (parser.nextToken(); parser.getCurrentToken() != JsonToken.END_OBJECT; parser.nextToken()) { String fieldName = parser.getCurrentName(); JsonToken token = parser.nextToken(); - if (fieldName.equals("name")) { - name = parser.getText(); - } else if (fieldName.equals("description")) { - description = parser.getText(); - } else if (fieldName.equals("dimensions")) { - dim = parseDimensions(parser, uniqueDimensions); - } else if (fieldName.equals("values")) { - values = parseValues(parser); - } else { - if (token == JsonToken.START_OBJECT || token == JsonToken.START_ARRAY) { - parser.skipChildren(); + switch (fieldName) { + case "name" -> name = parser.getText(); + case "description" -> description = parser.getText(); + case "dimensions" -> dim = parseDimensions(parser, uniqueDimensions); + case "values" -> values = parseValues(parser); + default -> { + if (token == JsonToken.START_OBJECT || token == JsonToken.START_ARRAY) { + parser.skipChildren(); + } } } } - if (name.equals("")) { + if (name.isEmpty()) { throw new IOException("missing name for entry in 'values' array"); } for (Map.Entry<String, Number> value : values) { diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/RemoteHealthMetricFetcher.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/RemoteHealthMetricFetcher.java index b3ade5074b8..2f4a807a4d0 100644 --- a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/RemoteHealthMetricFetcher.java +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/service/RemoteHealthMetricFetcher.java @@ -1,9 +1,9 @@ // Copyright Vespa.ai. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package ai.vespa.metricsproxy.service; +import ai.vespa.json.Jackson; import ai.vespa.metricsproxy.metric.HealthMetric; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.hc.client5.http.impl.classic.CloseableHttpResponse; import org.apache.hc.core5.http.HttpEntity; import org.apache.hc.core5.http.io.entity.EntityUtils; @@ -20,7 +20,6 @@ import java.util.logging.Logger; * @author Jo Kristian Bergum */ public class RemoteHealthMetricFetcher extends HttpMetricFetcher { - private static final ObjectMapper jsonMapper = new ObjectMapper(); private final static Logger log = Logger.getLogger(RemoteHealthMetricFetcher.class.getPackage().getName()); private final static String HEALTH_PATH = STATE_PATH + "health"; @@ -54,7 +53,7 @@ public class RemoteHealthMetricFetcher extends HttpMetricFetcher { private HealthMetric parse(InputStream data) { try { - JsonNode o = jsonMapper.readTree(data); + JsonNode o = Jackson.mapper().readTree(data); JsonNode status = o.get("status"); String code = status.get("code").asText(); String message = ""; diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsHandlerTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsHandlerTest.java index c57fe836269..3a902767f29 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsHandlerTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsHandlerTest.java @@ -10,7 +10,6 @@ import ai.vespa.metricsproxy.metric.model.json.GenericJsonModel; import ai.vespa.metricsproxy.metric.model.json.GenericMetrics; import ai.vespa.metricsproxy.metric.model.json.GenericService; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.github.tomakehurst.wiremock.junit.WireMockRule; import com.yahoo.container.jdisc.RequestHandlerTestDriver; @@ -30,7 +29,7 @@ import static ai.vespa.metricsproxy.http.ValuesFetcher.defaultMetricsConsumerId; import static ai.vespa.metricsproxy.http.application.ApplicationMetricsHandler.METRICS_V1_PATH; import static ai.vespa.metricsproxy.http.application.ApplicationMetricsHandler.METRICS_VALUES_PATH; import static ai.vespa.metricsproxy.http.application.ApplicationMetricsHandler.PROMETHEUS_VALUES_PATH; -import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.createObjectMapper; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static com.github.tomakehurst.wiremock.client.WireMock.get; @@ -47,8 +46,6 @@ import static org.junit.Assert.fail; */ public class ApplicationMetricsHandlerTest { - private static final ObjectMapper jsonMapper = new ObjectMapper(); - private static final String HOST = "localhost"; private static final String URI_BASE = "http://" + HOST; private static final String METRICS_V1_URI = URI_BASE + METRICS_V1_PATH; @@ -105,7 +102,7 @@ public class ApplicationMetricsHandlerTest { @Test public void v1_response_contains_values_uri() throws Exception { String response = testDriver.sendRequest(METRICS_V1_URI).readAll(); - JsonNode root = jsonMapper.readTree(response); + JsonNode root = objectMapper().readTree(response); assertTrue(root.has("resources")); ArrayNode resources = (ArrayNode) root.get("resources"); @@ -121,7 +118,7 @@ public class ApplicationMetricsHandlerTest { @Test public void visually_inspect_values_response_metrics() throws Exception { String response = testDriver.sendRequest(METRICS_VALUES_URI).readAll(); - ObjectMapper mapper = createObjectMapper(); + var mapper = objectMapper(); var jsonModel = mapper.readValue(response, GenericApplicationModel.class); System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonModel)); } @@ -202,14 +199,14 @@ public class ApplicationMetricsHandlerTest { @Test public void invalid_path_yields_error_response() throws Exception { String response = testDriver.sendRequest(METRICS_V1_URI + "/invalid").readAll(); - JsonNode root = jsonMapper.readTree(response); + JsonNode root = objectMapper().readTree(response); assertTrue(root.has("error")); } private GenericApplicationModel getResponseAsJsonModel(String consumer) { String response = testDriver.sendRequest(METRICS_VALUES_URI + "?consumer=" + consumer).readAll(); try { - return createObjectMapper().readValue(response, GenericApplicationModel.class); + return objectMapper().readValue(response, GenericApplicationModel.class); } catch (IOException e) { fail("Failed to create json model: " + e.getMessage()); throw new RuntimeException(e); diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/metrics/MetricsHandlerTestBase.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/metrics/MetricsHandlerTestBase.java index 692c4194bda..8e80dbddf9e 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/metrics/MetricsHandlerTestBase.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/metrics/MetricsHandlerTestBase.java @@ -7,7 +7,6 @@ import ai.vespa.metricsproxy.metric.model.json.GenericMetrics; import ai.vespa.metricsproxy.metric.model.json.GenericService; import ai.vespa.metricsproxy.service.DownService; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import org.junit.Ignore; import org.junit.Test; @@ -19,7 +18,7 @@ import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.INTERNAL_ import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.REASON; import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.SERVICE_ID; import static ai.vespa.metricsproxy.metric.model.StatusCode.DOWN; -import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.createObjectMapper; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static ai.vespa.metricsproxy.service.DummyService.METRIC_1; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -33,8 +32,6 @@ import static org.junit.Assert.fail; */ public abstract class MetricsHandlerTestBase<MODEL> extends HttpHandlerTestBase { - private static final ObjectMapper jsonMapper = new ObjectMapper(); - static String rootUri; static String valuesUri; @@ -45,7 +42,7 @@ public abstract class MetricsHandlerTestBase<MODEL> extends HttpHandlerTestBase private MODEL getResponseAsJsonModel(String consumer) { String response = testDriver.sendRequest(valuesUri + "?consumer=" + consumer).readAll(); try { - return createObjectMapper().readValue(response, modelClass); + return objectMapper().readValue(response, modelClass); } catch (IOException e) { fail("Failed to create json model: " + e.getMessage()); throw new RuntimeException(e); @@ -59,14 +56,14 @@ public abstract class MetricsHandlerTestBase<MODEL> extends HttpHandlerTestBase @Test public void invalid_path_yields_error_response() throws Exception { String response = testDriver.sendRequest(rootUri + "/invalid").readAll(); - JsonNode root = jsonMapper.readTree(response); + JsonNode root = objectMapper().readTree(response); assertTrue(root.has("error")); } @Test public void root_response_contains_values_uri() throws Exception { String response = testDriver.sendRequest(rootUri).readAll(); - JsonNode root = jsonMapper.readTree(response); + JsonNode root = objectMapper().readTree(response); assertTrue(root.has("resources")); ArrayNode resources = (ArrayNode) root.get("resources"); @@ -80,7 +77,7 @@ public abstract class MetricsHandlerTestBase<MODEL> extends HttpHandlerTestBase @Test public void visually_inspect_values_response() throws Exception { String response = testDriver.sendRequest(valuesUri).readAll(); - ObjectMapper mapper = createObjectMapper(); + var mapper = objectMapper(); var jsonModel = mapper.readValue(response, modelClass); System.out.println(mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonModel)); } diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/prometheus/PrometheusHandlerTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/prometheus/PrometheusHandlerTest.java index f8e07c3f2ec..b36f521e4ac 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/prometheus/PrometheusHandlerTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/prometheus/PrometheusHandlerTest.java @@ -4,7 +4,6 @@ package ai.vespa.metricsproxy.http.prometheus; import ai.vespa.metricsproxy.http.HttpHandlerTestBase; import ai.vespa.metricsproxy.service.DummyService; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.yahoo.container.jdisc.RequestHandlerTestDriver; import org.junit.BeforeClass; @@ -14,17 +13,15 @@ import org.junit.Test; import java.util.concurrent.Executors; import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.REASON; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; /** * @author gjoranv */ -@SuppressWarnings("UnstableApiUsage") public class PrometheusHandlerTest extends HttpHandlerTestBase { - private static final ObjectMapper jsonMapper = new ObjectMapper(); - private static final String V1_URI = URI_BASE + PrometheusHandler.V1_PATH; private static final String VALUES_URI = URI_BASE + PrometheusHandler.VALUES_PATH; @@ -45,7 +42,7 @@ public class PrometheusHandlerTest extends HttpHandlerTestBase { @Test public void v1_response_contains_values_uri() throws Exception { String response = testDriver.sendRequest(V1_URI).readAll(); - JsonNode root = jsonMapper.readTree(response); + JsonNode root = objectMapper().readTree(response); assertTrue(root.has("resources")); ArrayNode resources = (ArrayNode) root.get("resources"); diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericApplicationModelTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericApplicationModelTest.java index f773a1095cd..54736851b3f 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericApplicationModelTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericApplicationModelTest.java @@ -4,7 +4,6 @@ package ai.vespa.metricsproxy.metric.model.json; import ai.vespa.metricsproxy.http.application.Node; import ai.vespa.metricsproxy.metric.model.MetricsPacket; import ai.vespa.metricsproxy.metric.model.StatusCode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import java.io.IOException; @@ -16,7 +15,7 @@ import static ai.vespa.metricsproxy.metric.ExternalMetrics.VESPA_NODE_SERVICE_ID import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId; import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId; import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId; -import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.createObjectMapper; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -90,7 +89,7 @@ public class GenericApplicationModelTest { assertEquals("service-dim-value", serviceMetrics.dimensions.get("service-dim")); // Visual inspection - System.out.println(createObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(nodeModel)); + System.out.println(objectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(nodeModel)); } private MetricsPacket createMetricsPacket(String service, Number metricsValue, boolean isNode) { @@ -112,8 +111,7 @@ public class GenericApplicationModelTest { } private static GenericApplicationModel genericJsonModelFromTestFile() throws IOException { - ObjectMapper mapper = createObjectMapper(); - return mapper.readValue(getFileContents(TEST_FILE), GenericApplicationModel.class); + return objectMapper().readValue(getFileContents(TEST_FILE), GenericApplicationModel.class); } } 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 cdcd049ecfc..9eb1ed8cd5a 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 @@ -3,7 +3,6 @@ package ai.vespa.metricsproxy.metric.model.json; import ai.vespa.metricsproxy.metric.model.MetricsPacket; import ai.vespa.metricsproxy.metric.model.StatusCode; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.Test; import java.io.IOException; @@ -14,7 +13,7 @@ import static ai.vespa.metricsproxy.metric.ExternalMetrics.VESPA_NODE_SERVICE_ID import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId; import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId; import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId; -import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.createObjectMapper; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -113,7 +112,7 @@ public class GenericJsonModelTest { assertEquals("service-dim-value", serviceMetrics.dimensions.get("service-dim")); // Visual inspection - System.out.println(createObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(jsonModel)); + System.out.println(objectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(jsonModel)); } @Test @@ -138,8 +137,7 @@ public class GenericJsonModelTest { } private GenericJsonModel genericJsonModelFromTestFile(String filename) throws IOException { - ObjectMapper mapper = createObjectMapper(); - return mapper.readValue(getFileContents(filename), GenericJsonModel.class); + return objectMapper().readValue(getFileContents(filename), GenericJsonModel.class); } @Test diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonModelTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonModelTest.java index ae0f79746e5..8f3a99c1c68 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonModelTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonModelTest.java @@ -16,6 +16,7 @@ import java.util.List; import static ai.vespa.metricsproxy.metric.model.ConsumerId.toConsumerId; import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId; import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -78,8 +79,7 @@ public class YamasJsonModelTest { // Read file that was taken from production (real -life example that is) String filename = getClass().getClassLoader().getResource("yamas-array-no-routing.json").getFile(); BufferedReader reader = Files.newBufferedReader(Paths.get(filename)); - ObjectMapper mapper = new ObjectMapper(); - YamasJsonModel jsonModel = mapper.readValue(reader, YamasJsonModel.class); + YamasJsonModel jsonModel = objectMapper().readValue(reader, YamasJsonModel.class); // Do some sanity checking assertNull(jsonModel.routing); @@ -104,8 +104,7 @@ public class YamasJsonModelTest { private YamasJsonModel getYamasJsonModel(String testFile) throws IOException { String filename = getClass().getClassLoader().getResource(testFile).getFile(); BufferedReader reader = Files.newBufferedReader(Paths.get(filename)); - ObjectMapper mapper = new ObjectMapper(); - return mapper.readValue(reader, YamasJsonModel.class); + return objectMapper().readValue(reader, YamasJsonModel.class); } } diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtilTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtilTest.java index 7281c674745..aa85277b3b7 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtilTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/YamasJsonUtilTest.java @@ -3,7 +3,6 @@ package ai.vespa.metricsproxy.metric.model.json; import ai.vespa.metricsproxy.metric.model.MetricsPacket; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import org.junit.Test; @@ -14,6 +13,7 @@ import java.util.Set; import static ai.vespa.metricsproxy.core.VespaMetrics.vespaMetricsConsumerId; import static ai.vespa.metricsproxy.http.ValuesFetcher.defaultMetricsConsumerId; import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static ai.vespa.metricsproxy.metric.model.json.YamasJsonUtil.YAMAS_ROUTING; import static ai.vespa.metricsproxy.metric.model.json.YamasJsonUtil.toMetricsPackets; import static org.junit.Assert.assertEquals; @@ -24,12 +24,11 @@ import static org.junit.Assert.assertTrue; * @author gjoranv */ public class YamasJsonUtilTest { - private static final ObjectMapper jsonMapper = new ObjectMapper(); private static JsonNode metrics(MetricsPacket packet, boolean addStatus) throws IOException { return metrics(List.of(packet), addStatus).get(0); } private static ArrayNode metrics(List<MetricsPacket> packets, boolean addStatus) throws IOException { - return (ArrayNode) jsonMapper.readTree(YamasJsonUtil.toJson(packets, addStatus)).get("metrics"); + return (ArrayNode) objectMapper().readTree(YamasJsonUtil.toJson(packets, addStatus)).get("metrics"); } @Test diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/NodeMetricGathererTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/NodeMetricGathererTest.java index b67967b7e04..20164b91a55 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/NodeMetricGathererTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/node/NodeMetricGathererTest.java @@ -5,7 +5,6 @@ import ai.vespa.metricsproxy.metric.model.ConsumerId; import ai.vespa.metricsproxy.metric.model.MetricId; import ai.vespa.metricsproxy.metric.model.MetricsPacket; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ObjectNode; import org.junit.Test; @@ -13,6 +12,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static org.junit.Assert.assertEquals; /** @@ -20,8 +20,6 @@ import static org.junit.Assert.assertEquals; */ public class NodeMetricGathererTest { - private static final ObjectMapper jsonMapper = new ObjectMapper(); - @Test public void testJSONObjectIsCorrectlyConvertedToMetricsPacket() { List<MetricsPacket.Builder> builders = new ArrayList<>(); @@ -31,17 +29,17 @@ public class NodeMetricGathererTest { assertEquals("host_life", packet.service.id); assertEquals(123, packet.timestamp); - assertEquals(12l, packet.metrics().get(MetricId.toMetricId("uptime"))); - assertEquals(1l, packet.metrics().get(MetricId.toMetricId("alive"))); + assertEquals(12L, packet.metrics().get(MetricId.toMetricId("uptime"))); + assertEquals(1L, packet.metrics().get(MetricId.toMetricId("alive"))); assertEquals(Set.of(ConsumerId.toConsumerId("Vespa")), packet.consumers()); } private JsonNode generateHostLifePacket() { - ObjectNode jsonObject = jsonMapper.createObjectNode(); + ObjectNode jsonObject = objectMapper().createObjectNode(); jsonObject.put("timestamp", 123); jsonObject.put("application", "host_life"); - ObjectNode metrics = jsonMapper.createObjectNode(); + ObjectNode metrics = objectMapper().createObjectNode(); metrics.put("uptime", 12); metrics.put("alive", 1); jsonObject.set("metrics", metrics); diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcMetricsTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcMetricsTest.java index 0b333db3c71..e6c3ca20e00 100644 --- a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcMetricsTest.java +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/rpc/RpcMetricsTest.java @@ -6,7 +6,6 @@ import ai.vespa.metricsproxy.metric.Metrics; import ai.vespa.metricsproxy.metric.model.ConsumerId; import ai.vespa.metricsproxy.service.VespaService; import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.yahoo.jrt.Request; import com.yahoo.jrt.Spec; @@ -26,6 +25,7 @@ import static ai.vespa.metricsproxy.TestUtil.getFileContents; import static ai.vespa.metricsproxy.core.VespaMetrics.vespaMetricsConsumerId; import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId; import static ai.vespa.metricsproxy.metric.model.MetricId.toMetricId; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.objectMapper; import static ai.vespa.metricsproxy.rpc.IntegrationTester.CUSTOM_CONSUMER_ID; import static ai.vespa.metricsproxy.rpc.IntegrationTester.MONITORING_SYSTEM; import static ai.vespa.metricsproxy.rpc.IntegrationTester.SERVICE_1_CONFIG_ID; @@ -42,8 +42,6 @@ import static org.junit.Assert.assertTrue; */ public class RpcMetricsTest { - private static final ObjectMapper jsonMapper = new ObjectMapper(); - private static final String METRICS_RESPONSE = getFileContents("metrics-storage-simple.json").trim(); private static final String EXTRA_APP = "extra"; private static final Duration RPC_INVOKE_TIMEOUT = Duration.ofSeconds(60); @@ -148,7 +146,7 @@ public class RpcMetricsTest { private static void verifyMetricsFromRpcRequest(VespaService service, RpcClient client) throws IOException { String jsonResponse = getMetricsForYamas(service.getMonitoringName().id, client).trim(); - ArrayNode metrics = (ArrayNode) jsonMapper.readTree(jsonResponse).get("metrics"); + ArrayNode metrics = (ArrayNode) objectMapper().readTree(jsonResponse).get("metrics"); assertEquals("Expected 3 metric messages", 3, metrics.size()); for (int i = 0; i < metrics.size() - 1; i++) { // The last "metric message" contains only status code/message JsonNode jsonObject = metrics.get(i); @@ -184,7 +182,7 @@ public class RpcMetricsTest { private void verifyMetricsFromRpcRequestForAllServices(RpcClient client) throws IOException { // Verify that metrics for all services can be retrieved in one request. String allServicesResponse = getMetricsForYamas(ALL_SERVICES, client).trim(); - ArrayNode allServicesMetrics = (ArrayNode) jsonMapper.readTree(allServicesResponse).get("metrics"); + ArrayNode allServicesMetrics = (ArrayNode) objectMapper().readTree(allServicesResponse).get("metrics"); assertEquals(5, allServicesMetrics.size()); } @@ -221,13 +219,13 @@ public class RpcMetricsTest { } private JsonNode findExtraMetricsObject(String jsonResponse) throws IOException { - ArrayNode metrics = (ArrayNode) jsonMapper.readTree(jsonResponse).get("metrics"); + ArrayNode metrics = (ArrayNode) objectMapper().readTree(jsonResponse).get("metrics"); for (int i = 0; i < metrics.size(); i++) { JsonNode jsonObject = metrics.get(i); assertTrue(jsonObject.has("application")); if (jsonObject.get("application").textValue().equals(EXTRA_APP)) return jsonObject; } - return jsonMapper.createObjectNode(); + return objectMapper().createObjectNode(); } private static String getMetricsForYamas(String service, RpcClient client) { |