diff options
author | gjoranv <gv@verizonmedia.com> | 2019-05-24 10:50:49 +0200 |
---|---|---|
committer | gjoranv <gv@verizonmedia.com> | 2019-05-24 17:32:34 +0200 |
commit | d551b662584af812091c21246852adaade7ab6dc (patch) | |
tree | d4c19d739b5ecb293be54cfd3badb97d10716e6d /metrics-proxy/src | |
parent | ef338fb8cd3d0ee9614dee792d7f3f2269973ce2 (diff) |
Add json model for generic metrics format.
Diffstat (limited to 'metrics-proxy/src')
6 files changed, 245 insertions, 0 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 new file mode 100644 index 00000000000..5e19a6a2236 --- /dev/null +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java @@ -0,0 +1,44 @@ +/* + * Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + */ + +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.annotation.JsonPropertyOrder; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.util.List; +import java.util.logging.Logger; + +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_ABSENT; + +/** + * @author gjoranv + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(NON_ABSENT) +@JsonPropertyOrder({ "node", "services" }) +public class GenericJsonModel { + private static Logger log = Logger.getLogger(GenericJsonModel.class.getName()); + + @JsonProperty("node") + public GenericNode node; + + @JsonProperty("services") + public List<GenericService> services; + + public String serialize() { + ObjectMapper mapper = JacksonUtil.createObjectMapper(); + try { + return mapper.writeValueAsString(this); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("Could not render metrics. Check the log for details."); + } + } + +} diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericMetrics.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericMetrics.java new file mode 100644 index 00000000000..0756269e2ff --- /dev/null +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericMetrics.java @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + */ + +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.annotation.JsonPropertyOrder; + +import java.util.Map; + +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_ABSENT; + +/** + * @author gjoranv + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(NON_ABSENT) +@JsonPropertyOrder({ "values", "dimensions" }) +public class GenericMetrics { + + @JsonProperty("values") + public Map<String, Double> values; + + @JsonProperty("dimensions") + public Map<String, String> dimensions; + +} diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericNode.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericNode.java new file mode 100644 index 00000000000..5f5f5a8f802 --- /dev/null +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericNode.java @@ -0,0 +1,30 @@ +/* + * Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + */ + +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.annotation.JsonPropertyOrder; + +import java.util.List; + +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_ABSENT; + +/** + * @author gjoranv + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(NON_ABSENT) +@JsonPropertyOrder({ "timestamp", "metrics" }) +public class GenericNode { + + @JsonProperty("timestamp") + public Long timestamp; + + @JsonProperty("metrics") + public List<GenericMetrics> metrics; + +} diff --git a/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericService.java b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericService.java new file mode 100644 index 00000000000..89bba514ebb --- /dev/null +++ b/metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericService.java @@ -0,0 +1,47 @@ +/* + * Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + */ + +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.annotation.JsonPropertyOrder; + +import java.util.List; + +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_ABSENT; +import static com.fasterxml.jackson.annotation.JsonInclude.Include.NON_EMPTY; + +/** + * @author gjoranv + */ +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonInclude(NON_ABSENT) +@JsonPropertyOrder({ "name", "timestamp", "status", "metrics" }) +public class GenericService { + + @JsonProperty("name") + public String name; + + @JsonProperty("timestamp") + public Long timestamp; + + @JsonProperty("status") + public Status status; + + @JsonProperty("metrics") + public List<GenericMetrics> metrics; + + @JsonInclude(NON_EMPTY) + @JsonPropertyOrder({ "code", "description" }) + public static class Status { + @JsonProperty("code") + public String code; + + @JsonProperty("description") + public String description; + } + +} 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 new file mode 100644 index 00000000000..eff8d31f47c --- /dev/null +++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java @@ -0,0 +1,44 @@ +/* + * Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. + */ + +package ai.vespa.metricsproxy.metric.model.json; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.Test; + +import java.io.IOException; + +import static ai.vespa.metricsproxy.TestUtil.getContents; +import static ai.vespa.metricsproxy.metric.model.json.JacksonUtil.createObjectMapper; +import static org.junit.Assert.assertEquals; + +/** + * @author gjoranv + */ +public class GenericJsonModelTest { + private static final String TEST_FILE = "generic-sample.json"; + + @Test + public void deserialize_serialize_roundtrip() throws IOException { + GenericJsonModel jsonModel = genericJsonModelFromTestFile(); + + // Do some sanity checking + assertEquals(2, jsonModel.services.size()); + assertEquals(2, jsonModel.node.metrics.size()); + assertEquals(16.222, jsonModel.node.metrics.get(0).values.get("cpu.util"), 0.01d); + + String expected = getContents(TEST_FILE).trim().replaceAll("\\s+", "");; + + String serialized = jsonModel.serialize(); + String trimmed = serialized.trim().replaceAll("\\s+", ""); + + assertEquals(expected, trimmed); + } + + private GenericJsonModel genericJsonModelFromTestFile() throws IOException { + ObjectMapper mapper = createObjectMapper(); + return mapper.readValue(getContents(TEST_FILE), GenericJsonModel.class); + } + +} diff --git a/metrics-proxy/src/test/resources/generic-sample.json b/metrics-proxy/src/test/resources/generic-sample.json new file mode 100644 index 00000000000..684b297e768 --- /dev/null +++ b/metrics-proxy/src/test/resources/generic-sample.json @@ -0,0 +1,50 @@ +{ + "node": { + "timestamp": 1234, + "metrics": [ + { + "values": { + "cpu.util": 16.222 + }, + "dimensions": { + "state": "active" + } + }, + { + "values": { + "network.in.bytes": 123123123 + }, + "dimensions": { + "interface": "eth0" + } + } + ] + }, + "services": [ + { + "name": "searchnode", + "timestamp": 1234, + "status": { + "code": "up" + }, + "metrics": [ + { + "values": { + "queries.count": 4 + }, + "dimensions": { + "documentType": "music" + } + } + ] + }, + { + "name": "slobrok", + "timestamp": 1234, + "status": { + "code": "unknown", + "description": "Unable to fetch metrics from service 'slobrok'" + } + } + ] +}
\ No newline at end of file |