diff options
author | Ola Aunrønning <olaa@yahooinc.com> | 2023-08-02 09:53:19 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-02 09:53:19 +0200 |
commit | 3eaa086166d3b31019a59541c2f10b10fa4d0b8d (patch) | |
tree | 64f9613a3885924e8783458bf01fa35d29bebca8 | |
parent | 615d4a7c87b973e207bebaf87fc52394e575c6e4 (diff) | |
parent | bd60d39d2a9dde6bf4bec95f50eba81f4c5c6cff (diff) |
Merge pull request #27940 from vespa-engine/olaa/infrastructure-metric-sets
Infrastructure metric sets
22 files changed, 215 insertions, 80 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java index 62cbf61b336..f8837a4530a 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin; +import ai.vespa.metrics.set.MetricSet; import com.yahoo.cloud.config.SlobroksConfig; import com.yahoo.cloud.config.ZookeepersConfig; import com.yahoo.cloud.config.log.LogdConfig; @@ -20,7 +21,6 @@ import com.yahoo.vespa.model.admin.clustercontroller.ClusterControllerContainer; import com.yahoo.vespa.model.admin.clustercontroller.ClusterControllerContainerCluster; import com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyContainer; import com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyContainerCluster; -import com.yahoo.vespa.model.admin.monitoring.MetricSet; import com.yahoo.vespa.model.admin.monitoring.Monitoring; import com.yahoo.vespa.model.admin.monitoring.builder.Metrics; import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProducer; @@ -31,7 +31,8 @@ import java.util.Collections; import java.util.List; import java.util.Optional; -import static com.yahoo.vespa.model.admin.monitoring.MetricSet.empty; +import static ai.vespa.metrics.set.MetricSet.empty; + /** * This is the admin pseudo-plugin of the Vespa model, responsible for diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/ConsumersConfigGenerator.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/ConsumersConfigGenerator.java index 97a6f27b759..ea3d5e55b07 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/ConsumersConfigGenerator.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/ConsumersConfigGenerator.java @@ -2,17 +2,16 @@ package com.yahoo.vespa.model.admin.metricsproxy; +import ai.vespa.metrics.set.Metric; +import ai.vespa.metrics.set.MetricSet; import ai.vespa.metricsproxy.core.ConsumersConfig.Consumer; import com.yahoo.config.provision.SystemName; -import com.yahoo.vespa.model.admin.monitoring.Metric; -import com.yahoo.vespa.model.admin.monitoring.MetricSet; import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; /** * Helper class to generate config for metrics consumers. diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java index 58e624960f9..df6fee1deb7 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyContainerCluster.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.admin.metricsproxy; +import ai.vespa.metrics.set.MetricSet; import ai.vespa.metricsproxy.core.ConsumersConfig; import ai.vespa.metricsproxy.core.MetricsConsumers; import ai.vespa.metricsproxy.core.MetricsManager; @@ -27,7 +28,6 @@ import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.ThreadedHttpRequestHandler; import com.yahoo.osgi.provider.model.ComponentModel; import com.yahoo.vespa.model.admin.Admin; -import com.yahoo.vespa.model.admin.monitoring.MetricSet; import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import com.yahoo.vespa.model.admin.monitoring.Monitoring; import com.yahoo.vespa.model.container.ContainerCluster; @@ -45,6 +45,7 @@ import java.util.logging.Logger; import java.util.stream.Collectors; import java.util.stream.Stream; +import static ai.vespa.metrics.set.MetricSet.empty; import static com.yahoo.vespa.model.admin.metricsproxy.ConsumersConfigGenerator.addMetrics; import static com.yahoo.vespa.model.admin.metricsproxy.ConsumersConfigGenerator.generateConsumers; import static com.yahoo.vespa.model.admin.metricsproxy.ConsumersConfigGenerator.toConsumerBuilder; @@ -53,7 +54,6 @@ import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyContainerClus import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyContainerCluster.AppDimensionNames.LEGACY_APPLICATION; import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyContainerCluster.AppDimensionNames.SYSTEM; import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyContainerCluster.AppDimensionNames.TENANT; -import static com.yahoo.vespa.model.admin.monitoring.MetricSet.empty; /** * Container cluster for metrics proxy containers. diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricsConsumer.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricsConsumer.java index c6bd4c6e295..e18156876cd 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricsConsumer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricsConsumer.java @@ -1,21 +1,21 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin.monitoring; +import ai.vespa.metrics.set.Metric; +import ai.vespa.metrics.set.MetricSet; import ai.vespa.metricsproxy.core.VespaMetrics; import ai.vespa.metricsproxy.http.ValuesFetcher; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Objects; -import static com.yahoo.vespa.model.admin.monitoring.AutoscalingMetrics.autoscalingMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.DefaultMetrics.defaultMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.NetworkMetrics.networkMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.SystemMetrics.systemMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.VespaMetricSet.vespaMetricSet; -import static java.util.Collections.unmodifiableList; +import static ai.vespa.metrics.set.AutoscalingMetrics.autoscalingMetricSet; +import static ai.vespa.metrics.set.DefaultMetrics.defaultMetricSet; +import static ai.vespa.metrics.set.NetworkMetrics.networkMetricSet; +import static ai.vespa.metrics.set.SystemMetrics.systemMetricSet; +import static ai.vespa.metrics.set.VespaMetricSet.vespaMetricSet; /** * A metric consumer is a set of metrics given an id that can be requested at runtime. diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/PredefinedMetricSets.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/PredefinedMetricSets.java index d0a5b1bbe43..3af2b4f8732 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/PredefinedMetricSets.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/PredefinedMetricSets.java @@ -1,19 +1,19 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin.monitoring.builder; -import com.yahoo.vespa.model.admin.monitoring.MetricSet; +import ai.vespa.metrics.set.MetricSet; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; -import static com.yahoo.vespa.model.admin.monitoring.AutoscalingMetrics.autoscalingMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.DefaultMetrics.defaultMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.NetworkMetrics.networkMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.SystemMetrics.systemMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.DefaultVespaMetrics.defaultVespaMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.VespaMetricSet.vespaMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.InfrastructureMetricSet.infrastructureMetricSet; +import static ai.vespa.metrics.set.AutoscalingMetrics.autoscalingMetricSet; +import static ai.vespa.metrics.set.DefaultMetrics.defaultMetricSet; +import static ai.vespa.metrics.set.DefaultVespaMetrics.defaultVespaMetricSet; +import static ai.vespa.metrics.set.InfrastructureMetricSet.infrastructureMetricSet; +import static ai.vespa.metrics.set.NetworkMetrics.networkMetricSet; +import static ai.vespa.metrics.set.SystemMetrics.systemMetricSet; +import static ai.vespa.metrics.set.VespaMetricSet.vespaMetricSet; /** * A data object for predefined metric sets. diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/xml/MetricsBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/xml/MetricsBuilder.java index f75b2a864f9..a00fe47eb21 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/xml/MetricsBuilder.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/xml/MetricsBuilder.java @@ -1,10 +1,10 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin.monitoring.builder.xml; +import ai.vespa.metrics.set.Metric; +import ai.vespa.metrics.set.MetricSet; import com.yahoo.config.model.ConfigModelContext.ApplicationType; import com.yahoo.text.XML; -import com.yahoo.vespa.model.admin.monitoring.Metric; -import com.yahoo.vespa.model.admin.monitoring.MetricSet; import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import com.yahoo.vespa.model.admin.monitoring.builder.Metrics; import org.w3c.dom.Element; @@ -14,8 +14,9 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; -import static com.yahoo.vespa.model.admin.monitoring.DefaultVespaMetrics.defaultVespaMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.SystemMetrics.systemMetricSet; +import static ai.vespa.metrics.set.DefaultVespaMetrics.defaultVespaMetricSet; +import static ai.vespa.metrics.set.SystemMetrics.systemMetricSet; + /** * @author gjoranv diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java index b809f25ced2..383027438fc 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/DedicatedAdminV4Test.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin; +import ai.vespa.metrics.set.Metric; import com.yahoo.cloud.config.LogforwarderConfig; import com.yahoo.cloud.config.SentinelConfig; import com.yahoo.config.application.api.ApplicationPackage; @@ -15,7 +16,6 @@ import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; import com.yahoo.vespa.model.VespaModel; -import com.yahoo.vespa.model.admin.monitoring.Metric; import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import com.yahoo.vespa.model.admin.monitoring.Monitoring; import org.junit.jupiter.api.Test; diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsConsumersTest.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsConsumersTest.java index 0a1791b3766..d5ce26bafe8 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsConsumersTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsConsumersTest.java @@ -1,13 +1,18 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin.metricsproxy; +import ai.vespa.metrics.set.Metric; +import ai.vespa.metrics.set.MetricSet; import ai.vespa.metricsproxy.core.ConsumersConfig; import com.yahoo.vespa.model.VespaModel; -import com.yahoo.vespa.model.admin.monitoring.Metric; -import com.yahoo.vespa.model.admin.monitoring.MetricSet; import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import org.junit.jupiter.api.Test; +import static ai.vespa.metrics.set.DefaultMetrics.defaultMetricSet; +import static ai.vespa.metrics.set.DefaultVespaMetrics.defaultVespaMetricSet; +import static ai.vespa.metrics.set.NetworkMetrics.networkMetricSet; +import static ai.vespa.metrics.set.SystemMetrics.systemMetricSet; +import static ai.vespa.metrics.set.VespaMetricSet.vespaMetricSet; import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyModelTester.TestMode.hosted; import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyModelTester.TestMode.self_hosted; import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyModelTester.checkMetric; @@ -16,11 +21,6 @@ import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyModelTester.c import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyModelTester.getCustomConsumer; import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyModelTester.getModel; import static com.yahoo.vespa.model.admin.metricsproxy.MetricsProxyModelTester.servicesWithAdminOnly; -import static com.yahoo.vespa.model.admin.monitoring.DefaultMetrics.defaultMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.DefaultVespaMetrics.defaultVespaMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.NetworkMetrics.networkMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.SystemMetrics.systemMetricSet; -import static com.yahoo.vespa.model.admin.monitoring.VespaMetricSet.vespaMetricSet; import static java.util.Collections.singleton; import static org.junit.jupiter.api.Assertions.*; diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyModelTester.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyModelTester.java index 2c9293473ed..fe5b6950d45 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyModelTester.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/metricsproxy/MetricsProxyModelTester.java @@ -2,6 +2,7 @@ package com.yahoo.vespa.model.admin.metricsproxy; +import ai.vespa.metrics.set.Metric; import ai.vespa.metricsproxy.core.ConsumersConfig; import ai.vespa.metricsproxy.http.application.MetricsNodesConfig; import ai.vespa.metricsproxy.metric.dimensions.ApplicationDimensionsConfig; @@ -11,7 +12,6 @@ import ai.vespa.metricsproxy.service.VespaServicesConfig; import com.yahoo.config.model.deploy.DeployState; import com.yahoo.search.config.QrStartConfig; import com.yahoo.vespa.model.VespaModel; -import com.yahoo.vespa.model.admin.monitoring.Metric; import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import com.yahoo.vespa.model.test.VespaModelTester; diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/monitoring/MetricSetTest.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/monitoring/MetricSetTest.java index 7eec4450f33..8235f45aaec 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/admin/monitoring/MetricSetTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/monitoring/MetricSetTest.java @@ -1,6 +1,8 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin.monitoring; +import ai.vespa.metrics.set.Metric; +import ai.vespa.metrics.set.MetricSet; import com.google.common.collect.Sets; import org.junit.jupiter.api.Test; diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/monitoring/MetricTest.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/monitoring/MetricTest.java index e87bb90c36b..f07b8c59322 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/admin/monitoring/MetricTest.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/monitoring/MetricTest.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin.monitoring; +import ai.vespa.metrics.set.Metric; import com.google.common.collect.ImmutableMap; import org.junit.jupiter.api.Test; diff --git a/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricsPacketsHandler.java b/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricsPacketsHandler.java index e06c7c8aa32..c60389fc55e 100644 --- a/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricsPacketsHandler.java +++ b/container-core/src/main/java/com/yahoo/container/jdisc/state/MetricsPacketsHandler.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.container.jdisc.state; +import ai.vespa.metrics.set.InfrastructureMetricSet; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -22,11 +23,15 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import static com.yahoo.container.jdisc.state.JsonUtil.sanitizeDouble; import static com.yahoo.container.jdisc.state.StateHandler.getSnapshotProviderOrThrow; @@ -60,6 +65,7 @@ public class MetricsPacketsHandler extends AbstractRequestHandler { private final SnapshotProvider snapshotProvider; private final String applicationName; private final String hostDimension; + private final Map<String, Set<String>> metricSets; @Inject public MetricsPacketsHandler(Timer timer, @@ -69,6 +75,7 @@ public class MetricsPacketsHandler extends AbstractRequestHandler { snapshotProvider = getSnapshotProviderOrThrow(snapshotProviders); applicationName = config.application(); hostDimension = config.hostname(); + metricSets = getMetricSets(); } @@ -93,14 +100,19 @@ public class MetricsPacketsHandler extends AbstractRequestHandler { private byte[] buildMetricOutput(String query) { try { - if (query != null && query.equals("array-formatted")) { - return getMetricsArray(); + var queryMap = parseQuery(query); + var metricSetId = queryMap.get("metric-set"); + var format = queryMap.get("format"); + + // TODO: Remove "array-formatted" + if ("array".equals(format) || queryMap.containsKey("array-formatted")) { + return getMetricsArray(metricSetId); } - if ("format=prometheus".equals(query)) { + if ("prometheus".equals(format)) { return buildPrometheusOutput(); } - String output = getAllMetricsPackets() + "\n"; + String output = getAllMetricsPackets(metricSetId) + "\n"; return output.getBytes(StandardCharsets.UTF_8); } catch (JsonProcessingException e) { throw new RuntimeException("Bad JSON construction.", e); @@ -109,10 +121,10 @@ public class MetricsPacketsHandler extends AbstractRequestHandler { } } - private byte[] getMetricsArray() throws JsonProcessingException { + private byte[] getMetricsArray(String metricSetId) throws JsonProcessingException { ObjectNode root = jsonMapper.createObjectNode(); ArrayNode jsonArray = jsonMapper.createArrayNode(); - getPacketsForSnapshot(getSnapshot(), applicationName, timer.currentTimeMillis()) + getPacketsForSnapshot(getSnapshot(), metricSetId, applicationName, timer.currentTimeMillis()) .forEach(jsonArray::add); MetricGatherer.getAdditionalMetrics().forEach(jsonArray::add); root.set("metrics", jsonArray); @@ -132,9 +144,9 @@ public class MetricsPacketsHandler extends AbstractRequestHandler { .writeValueAsString(jsonObject); } - private String getAllMetricsPackets() throws JsonProcessingException { + private String getAllMetricsPackets(String metricSetId) throws JsonProcessingException { StringBuilder ret = new StringBuilder(); - List<JsonNode> metricsPackets = getPacketsForSnapshot(getSnapshot(), applicationName, timer.currentTimeMillis()); + List<JsonNode> metricsPackets = getPacketsForSnapshot(getSnapshot(), metricSetId, applicationName, timer.currentTimeMillis()); String delimiter = ""; for (JsonNode packet : metricsPackets) { ret.append(delimiter); // For legibility and parsing in unit tests @@ -166,6 +178,29 @@ public class MetricsPacketsHandler extends AbstractRequestHandler { return packets; } + private List<JsonNode> getPacketsForSnapshot(MetricSnapshot metricSnapshot, String metricSetId, String application, long timestamp) { + if (metricSnapshot == null) return Collections.emptyList(); + if (metricSetId == null) return getPacketsForSnapshot(metricSnapshot, application, timestamp); + Set<String> configuredMetrics = metricSets.getOrDefault(metricSetId, Collections.emptySet()); + List<JsonNode> packets = new ArrayList<>(); + + for (Map.Entry<MetricDimensions, MetricSet> snapshotEntry : metricSnapshot) { + MetricDimensions metricDimensions = snapshotEntry.getKey(); + MetricSet metricSet = snapshotEntry.getValue(); + + ObjectNode packet = jsonMapper.createObjectNode(); + addMetaData(timestamp, application, packet); + addDimensions(metricDimensions, packet); + var metrics = getMetrics(metricSet); + metrics.keySet().retainAll(configuredMetrics); + if (!metrics.isEmpty()) { + addMetrics(metrics, packet); + packets.add(packet); + } + } + return packets; + } + private void addMetaData(long timestamp, String application, ObjectNode packet) { packet.put(APPLICATION_KEY, application); packet.put(TIMESTAMP_KEY, TimeUnit.MILLISECONDS.toSeconds(timestamp)); @@ -208,6 +243,39 @@ public class MetricsPacketsHandler extends AbstractRequestHandler { } } + private Map<String, Number> getMetrics(MetricSet metricSet) { + var metrics = new HashMap<String, Number>(); + for (Map.Entry<String, MetricValue> metric : metricSet) { + String name = metric.getKey(); + MetricValue value = metric.getValue(); + if (value instanceof CountMetric) { + metrics.put(name + ".count", ((CountMetric) value).getCount()); + } else if (value instanceof GaugeMetric) { + GaugeMetric gauge = (GaugeMetric) value; + metrics.put(name + ".average", sanitizeDouble(gauge.getAverage())); + metrics.put(name + ".last", sanitizeDouble(gauge.getLast())); + metrics.put(name + ".max", sanitizeDouble(gauge.getMax())); + if (gauge.getPercentiles().isPresent()) { + for (Tuple2<String, Double> prefixAndValue : gauge.getPercentiles().get()) { + metrics.put(name + "." + prefixAndValue.first + "percentile", prefixAndValue.second.doubleValue()); + } + } + } else { + throw new UnsupportedOperationException("Unknown metric class: " + value.getClass().getName()); + } + } + return metrics; + } + + private void addMetrics(Map<String, Number> metrics, ObjectNode packet) { + ObjectNode metricsObject = jsonMapper.createObjectNode(); + packet.set(METRICS_KEY, metricsObject); + metrics.forEach((name, value) -> { + if (value instanceof Double) metricsObject.put(name, (Double) value); + else metricsObject.put(name, (Long) value); + }); + } + private String getContentType(String query) { if ("format=prometheus".equals(query)) { return "text/plain;charset=utf-8"; @@ -215,4 +283,17 @@ public class MetricsPacketsHandler extends AbstractRequestHandler { return "application/json"; } + private Map<String, String> parseQuery(String query) { + if (query == null) return Map.of(); + return Arrays.stream(query.split("&")) + .map(s -> s.split("=")) + .collect(Collectors.toMap(s -> s[0], s -> s.length < 2 ? "" : s[1])); + } + + private Map<String, Set<String>> getMetricSets() { + // For now - single infrastructure metric set + return Map.of( + InfrastructureMetricSet.infrastructureMetricSet.getId(), InfrastructureMetricSet.infrastructureMetricSet.getMetrics().keySet() + ); + } } diff --git a/container-core/src/test/java/com/yahoo/container/jdisc/state/MetricsPacketsHandlerTest.java b/container-core/src/test/java/com/yahoo/container/jdisc/state/MetricsPacketsHandlerTest.java index 3f5c31e5e7f..38c1072c759 100644 --- a/container-core/src/test/java/com/yahoo/container/jdisc/state/MetricsPacketsHandlerTest.java +++ b/container-core/src/test/java/com/yahoo/container/jdisc/state/MetricsPacketsHandlerTest.java @@ -163,6 +163,61 @@ public class MetricsPacketsHandlerTest extends StateHandlerTestBase { """; assertEquals(expectedResponse, response); } + + @Test + public void test_metric_filtering() { + var context = StateMetricContext.newInstance(Map.of("dim-1", "value1")); + var snapshot = new MetricSnapshot(); + snapshot.set(context, "gauge.metric", 0.2); + snapshot.add(context, "counter.metric", 5); + snapshot.add(context, "configserver.requests", 120); + // Infrastructure set only contains max and average + snapshot.set(context, "lockAttempt.lockedLoad", 500); + + // Without filtering + snapshotProvider.setSnapshot(snapshot); + var response = requestAsString("http://localhost/metrics-packets"); + var expectedResponse = """ + { + "application" : "state-handler-test-base", + "timestamp" : 0, + "dimensions" : { + "dim-1" : "value1", + "host" : "some-hostname" + }, + "metrics" : { + "gauge.metric.average" : 0.2, + "gauge.metric.last" : 0.2, + "gauge.metric.max" : 0.2, + "configserver.requests.count" : 120, + "lockAttempt.lockedLoad.average" : 500.0, + "lockAttempt.lockedLoad.last" : 500.0, + "lockAttempt.lockedLoad.max" : 500.0, + "counter.metric.count" : 5 + } + } + """; + assertEquals(expectedResponse, response); + + // With filtering + response = requestAsString("http://localhost/metrics-packets?metric-set=infrastructure"); + expectedResponse = """ + { + "application" : "state-handler-test-base", + "timestamp" : 0, + "dimensions" : { + "dim-1" : "value1", + "host" : "some-hostname" + }, + "metrics" : { + "lockAttempt.lockedLoad.max" : 500.0, + "configserver.requests.count" : 120, + "lockAttempt.lockedLoad.average" : 500.0 + } + } + """; + assertEquals(expectedResponse, response); + } private List<JsonNode> incrementTimeAndGetJsonPackets() throws Exception { advanceToNextSnapshot(); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java b/metrics/src/main/java/ai/vespa/metrics/set/AutoscalingMetrics.java index 685ca377e70..01793f292cf 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/AutoscalingMetrics.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/AutoscalingMetrics.java @@ -1,5 +1,5 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.admin.monitoring; +package ai.vespa.metrics.set; import ai.vespa.metrics.ContainerMetrics; import ai.vespa.metrics.HostedNodeAdminMetrics; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/DefaultMetrics.java b/metrics/src/main/java/ai/vespa/metrics/set/DefaultMetrics.java index 8652acbd546..ffc947828ff 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/DefaultMetrics.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/DefaultMetrics.java @@ -1,6 +1,6 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.admin.monitoring; +package ai.vespa.metrics.set; import ai.vespa.metrics.ContainerMetrics; import ai.vespa.metrics.SearchNodeMetrics; @@ -18,7 +18,7 @@ import static ai.vespa.metrics.Suffix.max; import static ai.vespa.metrics.Suffix.ninety_five_percentile; import static ai.vespa.metrics.Suffix.ninety_nine_percentile; import static ai.vespa.metrics.Suffix.sum; -import static com.yahoo.vespa.model.admin.monitoring.DefaultVespaMetrics.defaultVespaMetricSet; +import static ai.vespa.metrics.set.DefaultVespaMetrics.defaultVespaMetricSet; /** * Metrics for the 'default' consumer, which is used by default for the generic metrics api and diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/DefaultVespaMetrics.java b/metrics/src/main/java/ai/vespa/metrics/set/DefaultVespaMetrics.java index ac03fcf56cb..93b6bfab002 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/DefaultVespaMetrics.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/DefaultVespaMetrics.java @@ -1,10 +1,10 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.admin.monitoring; +package ai.vespa.metrics.set; import ai.vespa.metrics.ContainerMetrics; import ai.vespa.metrics.SearchNodeMetrics; -import com.google.common.collect.ImmutableSet; +import java.util.LinkedHashSet; import java.util.Set; /** @@ -19,20 +19,11 @@ public class DefaultVespaMetrics { public static final MetricSet defaultVespaMetricSet = createDefaultVespaMetricSet(); private static MetricSet createDefaultVespaMetricSet() { + Set<Metric> metrics = new LinkedHashSet<>(); - Set<Metric> defaultContainerMetrics = - ImmutableSet.of(new Metric(ContainerMetrics.FEED_OPERATIONS.rate()) - ); + metrics.add(new Metric(ContainerMetrics.FEED_OPERATIONS.rate())); + metrics.add(new Metric(SearchNodeMetrics.CONTENT_PROTON_RESOURCE_USAGE_FEEDING_BLOCKED.last())); - Set<Metric> defaultContentMetrics = - ImmutableSet.of(new Metric(SearchNodeMetrics.CONTENT_PROTON_RESOURCE_USAGE_FEEDING_BLOCKED.last()) - ); - - Set<Metric> defaultMetrics = ImmutableSet.<Metric>builder() - .addAll(defaultContainerMetrics) - .addAll(defaultContentMetrics) - .build(); - - return new MetricSet("default-vespa", defaultMetrics); + return new MetricSet("default-vespa", metrics); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/InfrastructureMetricSet.java b/metrics/src/main/java/ai/vespa/metrics/set/InfrastructureMetricSet.java index 92156c959a0..c64be82b937 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/InfrastructureMetricSet.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/InfrastructureMetricSet.java @@ -1,7 +1,12 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.admin.monitoring; - -import ai.vespa.metrics.*; +package ai.vespa.metrics.set; + +import ai.vespa.metrics.ConfigServerMetrics; +import ai.vespa.metrics.ContainerMetrics; +import ai.vespa.metrics.ControllerMetrics; +import ai.vespa.metrics.LogdMetrics; +import ai.vespa.metrics.Suffix; +import ai.vespa.metrics.VespaMetrics; import java.util.Collections; import java.util.EnumSet; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/Metric.java b/metrics/src/main/java/ai/vespa/metrics/set/Metric.java index b2df37c47b2..53ca75b7f30 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/Metric.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/Metric.java @@ -1,5 +1,5 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.admin.monitoring; +package ai.vespa.metrics.set; import java.util.LinkedHashMap; import java.util.Map; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricSet.java b/metrics/src/main/java/ai/vespa/metrics/set/MetricSet.java index fb67100b435..b8409fb7663 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricSet.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/MetricSet.java @@ -1,5 +1,5 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.admin.monitoring; +package ai.vespa.metrics.set; import java.util.Collection; import java.util.LinkedHashMap; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/NetworkMetrics.java b/metrics/src/main/java/ai/vespa/metrics/set/NetworkMetrics.java index 21e7d35fc7c..f967e2a2c31 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/NetworkMetrics.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/NetworkMetrics.java @@ -1,8 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.admin.monitoring; +package ai.vespa.metrics.set; import ai.vespa.metrics.HostedNodeAdminMetrics; -import com.google.common.collect.ImmutableSet; import java.util.Set; @@ -17,7 +16,7 @@ public class NetworkMetrics { private static MetricSet createNetworkMetricSet() { Set<Metric> dockerNetworkMetrics = - ImmutableSet.of(new Metric(HostedNodeAdminMetrics.NET_IN_BYTES.baseName()), + Set.of(new Metric(HostedNodeAdminMetrics.NET_IN_BYTES.baseName()), new Metric(HostedNodeAdminMetrics.NET_IN_ERROR.baseName()), new Metric(HostedNodeAdminMetrics.NET_IN_DROPPED.baseName()), new Metric(HostedNodeAdminMetrics.NET_OUT_BYTES.baseName()), diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/SystemMetrics.java b/metrics/src/main/java/ai/vespa/metrics/set/SystemMetrics.java index 64f2a72d1b4..0560daebc43 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/SystemMetrics.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/SystemMetrics.java @@ -1,9 +1,9 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.admin.monitoring; +package ai.vespa.metrics.set; import ai.vespa.metrics.HostedNodeAdminMetrics; -import com.google.common.collect.ImmutableSet; +import java.util.LinkedHashSet; import java.util.Set; /** @@ -17,7 +17,7 @@ public class SystemMetrics { private static MetricSet createSystemMetricSet() { Set<Metric> dockerNodeMetrics = - ImmutableSet.of(new Metric(HostedNodeAdminMetrics.CPU_UTIL.baseName()), + Set.of(new Metric(HostedNodeAdminMetrics.CPU_UTIL.baseName()), new Metric(HostedNodeAdminMetrics.CPU_SYS_UTIL.baseName()), new Metric(HostedNodeAdminMetrics.CPU_THROTTLED_TIME.baseName()), new Metric(HostedNodeAdminMetrics.CPU_THROTTLED_CPU_TIME.baseName()), @@ -37,19 +37,19 @@ public class SystemMetrics { Set<Metric> nonDockerNodeMetrics = // Disk metrics should be based on /home, or else '/' - or simply add filesystem as dimension - ImmutableSet.of(new Metric("cpu.busy.pct", HostedNodeAdminMetrics.CPU_UTIL.baseName()), + Set.of(new Metric("cpu.busy.pct", HostedNodeAdminMetrics.CPU_UTIL.baseName()), new Metric("mem.used.pct", HostedNodeAdminMetrics.MEM_UTIL.baseName()), new Metric("mem.active.kb", HostedNodeAdminMetrics.MEM_USED.baseName()), new Metric("mem.total.kb", HostedNodeAdminMetrics.MEM_LIMIT.baseName()), new Metric("used.kb", HostedNodeAdminMetrics.DISK_USED.baseName()) ); - Set<Metric> systemMetrics = ImmutableSet.<Metric>builder() - .addAll(dockerNodeMetrics) - .addAll(nonDockerNodeMetrics) - .build(); - return new MetricSet("system", systemMetrics); + Set<Metric> metrics = new LinkedHashSet<>(); + metrics.addAll(dockerNodeMetrics); + metrics.addAll(nonDockerNodeMetrics); + + return new MetricSet("system", metrics); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java b/metrics/src/main/java/ai/vespa/metrics/set/VespaMetricSet.java index a0d866fb001..82717b5709d 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/VespaMetricSet.java +++ b/metrics/src/main/java/ai/vespa/metrics/set/VespaMetricSet.java @@ -1,5 +1,5 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.model.admin.monitoring; +package ai.vespa.metrics.set; import ai.vespa.metrics.ClusterControllerMetrics; import ai.vespa.metrics.ContainerMetrics; @@ -28,7 +28,7 @@ import static ai.vespa.metrics.Suffix.ninety_five_percentile; import static ai.vespa.metrics.Suffix.ninety_nine_percentile; import static ai.vespa.metrics.Suffix.rate; import static ai.vespa.metrics.Suffix.sum; -import static com.yahoo.vespa.model.admin.monitoring.DefaultVespaMetrics.defaultVespaMetricSet; +import static ai.vespa.metrics.set.DefaultVespaMetrics.defaultVespaMetricSet; import static java.util.Collections.singleton; /** |