summaryrefslogtreecommitdiffstats
path: root/metrics-proxy
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2019-05-24 10:50:49 +0200
committergjoranv <gv@verizonmedia.com>2019-05-24 17:32:34 +0200
commitd551b662584af812091c21246852adaade7ab6dc (patch)
treed4c19d739b5ecb293be54cfd3badb97d10716e6d /metrics-proxy
parentef338fb8cd3d0ee9614dee792d7f3f2269973ce2 (diff)
Add json model for generic metrics format.
Diffstat (limited to 'metrics-proxy')
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModel.java44
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericMetrics.java30
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericNode.java30
-rw-r--r--metrics-proxy/src/main/java/ai/vespa/metricsproxy/metric/model/json/GenericService.java47
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/metric/model/json/GenericJsonModelTest.java44
-rw-r--r--metrics-proxy/src/test/resources/generic-sample.json50
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