summaryrefslogtreecommitdiffstats
path: root/metrics-proxy/src/test
diff options
context:
space:
mode:
authorgjoranv <gv@verizonmedia.com>2020-01-17 17:12:18 +0100
committergjoranv <gv@verizonmedia.com>2020-01-22 10:56:22 +0100
commita90738cffb70b958809090220fc291813a7a1182 (patch)
tree089e3d54783367915a7a78df2f0420923da6d2f1 /metrics-proxy/src/test
parent9ba0df95ef5e96c38ba53aff3b465ff2238948f8 (diff)
Implement metrics dimensions processing.
- retain only public dimensions - clusterId - serviceId + Move constants for public dimensions from config-model to new class in metrics-proxy
Diffstat (limited to 'metrics-proxy/src/test')
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ApplicationMetricsHandlerTest.java19
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ClusterIdDimensionProcessorTest.java63
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/PublicDimensionsProcessorTest.java59
-rw-r--r--metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ServiceIdDimensionProcessorTest.java43
-rw-r--r--metrics-proxy/src/test/resources/generic-sample.json9
5 files changed, 192 insertions, 1 deletions
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 074b7877430..155bbf094a1 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
@@ -3,6 +3,7 @@ package ai.vespa.metricsproxy.http.application;
import ai.vespa.metricsproxy.core.ConsumersConfig;
import ai.vespa.metricsproxy.core.MetricsConsumers;
+import ai.vespa.metricsproxy.metric.dimensions.PublicDimensions;
import ai.vespa.metricsproxy.metric.model.json.GenericApplicationModel;
import ai.vespa.metricsproxy.metric.model.json.GenericJsonModel;
import ai.vespa.metricsproxy.metric.model.json.GenericMetrics;
@@ -19,6 +20,7 @@ import org.junit.Test;
import java.io.IOException;
import java.util.Arrays;
+import java.util.Map;
import java.util.concurrent.Executors;
import static ai.vespa.metricsproxy.TestUtil.getFileContents;
@@ -34,6 +36,7 @@ import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.options
import static com.yahoo.collections.CollectionUtil.first;
import static java.util.stream.Collectors.toList;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -138,6 +141,22 @@ public class ApplicationMetricsHandlerTest {
}
@Test
+ public void metrics_processors_are_applied() {
+ GenericApplicationModel jsonModel = getResponseAsJsonModel(DEFAULT_PUBLIC_CONSUMER_ID.id);
+
+ GenericService searchnode = jsonModel.nodes.get(0).services.get(0);
+ Map<String, String> dimensions = searchnode.metrics.get(0).dimensions;
+ assertEquals(6, dimensions.size());
+ assertEquals("music.default", dimensions.get(PublicDimensions.APPLICATION_ID));
+ assertEquals("container/default", dimensions.get(PublicDimensions.CLUSTER_ID));
+ assertEquals("us-west", dimensions.get(PublicDimensions.ZONE));
+ assertEquals("search/", dimensions.get(PublicDimensions.API));
+ assertEquals("music", dimensions.get(PublicDimensions.DOCUMENT_TYPE));
+ assertEquals("qrserver0", dimensions.get(PublicDimensions.SERVICE_ID));
+ assertFalse(dimensions.containsKey("non-public"));
+ }
+
+ @Test
public void consumer_is_propagated_in_uri_to_retriever() {
GenericApplicationModel jsonModel = getResponseAsJsonModel(CUSTOM_CONSUMER);
GenericJsonModel nodeModel = jsonModel.nodes.get(0);
diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ClusterIdDimensionProcessorTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ClusterIdDimensionProcessorTest.java
new file mode 100644
index 00000000000..0f4c6a885ec
--- /dev/null
+++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ClusterIdDimensionProcessorTest.java
@@ -0,0 +1,63 @@
+package ai.vespa.metricsproxy.http.application;
+
+import ai.vespa.metricsproxy.metric.model.DimensionId;
+import ai.vespa.metricsproxy.metric.model.MetricsPacket;
+import org.junit.Test;
+
+import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.CLUSTER_ID;
+import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.INTERNAL_CLUSTER_ID;
+import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.INTERNAL_CLUSTER_TYPE;
+import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId;
+import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author gjoranv
+ */
+public class ClusterIdDimensionProcessorTest {
+ private static final DimensionId NEW_ID_DIMENSION = toDimensionId(CLUSTER_ID);
+
+ @Test
+ public void cluster_id_is_replaced_with_type_and_id() {
+ var builder = new MetricsPacket.Builder(toServiceId("foo"));
+ builder.putDimension(toDimensionId(INTERNAL_CLUSTER_TYPE), "type") ;
+ builder.putDimension(toDimensionId(INTERNAL_CLUSTER_ID), "id") ;
+
+ assertEquals("type/id", newClusterId(builder));
+ }
+
+ @Test
+ public void cluster_id_is_type_when_id_is_null() {
+ var builder = new MetricsPacket.Builder(toServiceId("foo"));
+ builder.putDimension(toDimensionId(INTERNAL_CLUSTER_TYPE), "type") ;
+
+ assertEquals(newClusterId(builder), "type");
+ }
+
+ @Test
+ public void cluster_id_is_id_when_type_is_null() {
+ var builder = new MetricsPacket.Builder(toServiceId("foo"));
+ builder.putDimension(toDimensionId(INTERNAL_CLUSTER_ID), "id") ;
+
+ assertEquals(newClusterId(builder), "id");
+ }
+
+ @Test
+ public void cluster_id_is_not_added_when_both_type_and_id_are_null() {
+ var builder = new MetricsPacket.Builder(toServiceId("foo"));
+
+ var processor = new ClusterIdDimensionProcessor();
+ processor.process(builder);
+
+ assertFalse(builder.getDimensionIds().contains(NEW_ID_DIMENSION));
+ }
+
+ private String newClusterId(MetricsPacket.Builder builder) {
+ var processor = new ClusterIdDimensionProcessor();
+ processor.process(builder);
+
+ return builder.getDimensionValue(NEW_ID_DIMENSION);
+ }
+
+}
diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/PublicDimensionsProcessorTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/PublicDimensionsProcessorTest.java
new file mode 100644
index 00000000000..c6f47d70a1f
--- /dev/null
+++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/PublicDimensionsProcessorTest.java
@@ -0,0 +1,59 @@
+package ai.vespa.metricsproxy.http.application;
+
+import ai.vespa.metricsproxy.metric.model.MetricsPacket;
+import org.junit.Test;
+
+import static ai.vespa.metricsproxy.http.application.PublicDimensionsProcessor.getPublicDimensions;
+import static ai.vespa.metricsproxy.http.application.PublicDimensionsProcessor.toDimensionIds;
+import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.APPLICATION_ID;
+import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.commonDimensions;
+import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.publicDimensions;
+import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId;
+import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author gjoranv
+ */
+public class PublicDimensionsProcessorTest {
+
+ @Test
+ public void non_public_dimensions_are_removed() {
+ var builder = new MetricsPacket.Builder(toServiceId("foo"))
+ .putDimension(toDimensionId("a"), "");
+
+ var processor = new PublicDimensionsProcessor(10);
+ processor.process(builder);
+ assertTrue(builder.getDimensionIds().isEmpty());
+ }
+
+ @Test
+ public void public_dimensions_are_retained() {
+ var builder = new MetricsPacket.Builder(toServiceId("foo"))
+ .putDimension(toDimensionId(APPLICATION_ID), "app");
+
+ var processor = new PublicDimensionsProcessor(10);
+ processor.process(builder);
+ assertEquals(1, builder.getDimensionIds().size());
+ assertEquals(toDimensionId(APPLICATION_ID), builder.getDimensionIds().iterator().next());
+ }
+
+ @Test
+ public void common_dimensions_have_priority_when_there_are_too_many() {
+ var builder = new MetricsPacket.Builder(toServiceId("foo"));
+ getPublicDimensions()
+ .forEach(dimensionId -> builder.putDimension(dimensionId, dimensionId.id));
+ assertEquals(publicDimensions.size(), builder.getDimensionIds().size());
+
+ var processor = new PublicDimensionsProcessor(commonDimensions.size());
+ processor.process(builder);
+
+ var includedDimensions = builder.getDimensionIds();
+ assertEquals(commonDimensions.size(), includedDimensions.size());
+
+ toDimensionIds(commonDimensions).forEach(commonDimension ->
+ assertTrue(includedDimensions.contains(commonDimension)));
+ }
+
+}
diff --git a/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ServiceIdDimensionProcessorTest.java b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ServiceIdDimensionProcessorTest.java
new file mode 100644
index 00000000000..3237abdbfa3
--- /dev/null
+++ b/metrics-proxy/src/test/java/ai/vespa/metricsproxy/http/application/ServiceIdDimensionProcessorTest.java
@@ -0,0 +1,43 @@
+package ai.vespa.metricsproxy.http.application;
+
+import ai.vespa.metricsproxy.metric.model.DimensionId;
+import ai.vespa.metricsproxy.metric.model.MetricsPacket;
+import org.junit.Test;
+
+import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.INTERNAL_SERVICE_ID;
+import static ai.vespa.metricsproxy.metric.dimensions.PublicDimensions.SERVICE_ID;
+import static ai.vespa.metricsproxy.metric.model.DimensionId.toDimensionId;
+import static ai.vespa.metricsproxy.metric.model.ServiceId.toServiceId;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * @author gjoranv
+ */
+public class ServiceIdDimensionProcessorTest {
+ private static final DimensionId NEW_ID_DIMENSION = toDimensionId(SERVICE_ID);
+
+ @Test
+ public void new_service_id_is_added_when_internal_service_id_exists() {
+ var builder = new MetricsPacket.Builder(toServiceId("foo"));
+ builder.putDimension(toDimensionId(INTERNAL_SERVICE_ID), "service");
+
+ var processor = new ServiceIdDimensionProcessor();
+ processor.process(builder);
+
+ assertTrue(builder.getDimensionIds().contains(NEW_ID_DIMENSION));
+ assertEquals("service", builder.getDimensionValue(NEW_ID_DIMENSION));
+ }
+
+ @Test
+ public void new_service_id_is_not_added_when_internal_service_id_is_null() {
+ var builder = new MetricsPacket.Builder(toServiceId("foo"));
+
+ var processor = new ServiceIdDimensionProcessor();
+ processor.process(builder);
+
+ assertFalse(builder.getDimensionIds().contains(NEW_ID_DIMENSION));
+ }
+
+}
diff --git a/metrics-proxy/src/test/resources/generic-sample.json b/metrics-proxy/src/test/resources/generic-sample.json
index de617895f86..c9b02696e69 100644
--- a/metrics-proxy/src/test/resources/generic-sample.json
+++ b/metrics-proxy/src/test/resources/generic-sample.json
@@ -33,7 +33,14 @@
"queries.count": 4
},
"dimensions": {
- "documentType": "music"
+ "applicationId": "music.default",
+ "clustertype": "container",
+ "clusterid": "default",
+ "instance": "qrserver0",
+ "zone": "us-west",
+ "api": "search/",
+ "documenttype": "music",
+ "non-public": "will-be-removed"
}
}
]