diff options
10 files changed, 143 insertions, 12 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 a4275879c93..2b60b4d12e7 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 @@ -12,6 +12,7 @@ import com.yahoo.config.provision.Zone; import com.yahoo.vespa.model.*; import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import com.yahoo.vespa.model.admin.monitoring.Yamas; +import com.yahoo.vespa.model.admin.monitoring.builder.Metrics; import com.yahoo.vespa.model.container.ContainerCluster; import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProducer; import com.yahoo.vespa.model.filedistribution.FileDistributor; @@ -36,7 +37,8 @@ public class Admin extends AbstractConfigProducer implements Serializable { private static final long serialVersionUID = 1L; private final Yamas yamas; - private final Map<String, MetricsConsumer> metricsConsumers; + private final Metrics metrics; + private final Map<String, MetricsConsumer> legacyMetricsConsumers; private final List<Configserver> configservers = new ArrayList<>(); private final List<Slobrok> slobroks = new ArrayList<>(); @@ -53,10 +55,15 @@ public class Admin extends AbstractConfigProducer implements Serializable { private FileDistributionConfigProducer fileDistribution; private final boolean multitenant; - public Admin(AbstractConfigProducer parent, Yamas yamas, Map<String, MetricsConsumer> metricsConsumers, boolean multitenant) { + public Admin(AbstractConfigProducer parent, + Yamas yamas, + Metrics metrics, + Map<String, MetricsConsumer> legacyMetricsConsumers, + boolean multitenant) { super(parent, "admin"); this.yamas = yamas; - this.metricsConsumers = metricsConsumers; + this.metrics = metrics; + this.legacyMetricsConsumers = legacyMetricsConsumers; this.multitenant = multitenant; } @@ -69,9 +76,11 @@ public class Admin extends AbstractConfigProducer implements Serializable { return yamas; } + public Metrics getUserMetrics() { return metrics; } + /** Returns the configured userMetricConsumers. Null if not configured */ - public Map<String, MetricsConsumer> getUserMetricsConsumers(){ - return metricsConsumers; + public Map<String, MetricsConsumer> getLegacyUserMetricsConsumers(){ + return legacyMetricsConsumers; } /** Returns a list of all config servers */ diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/Metric.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/Metric.java index 14997ed5872..3a48b51b640 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/Metric.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/Metric.java @@ -1,6 +1,7 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin.monitoring; +import javax.annotation.concurrent.Immutable; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; @@ -12,6 +13,7 @@ import java.util.Map; * @author trygve * @author gjoranv */ +@Immutable public class Metric { public final String name; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricSet.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricSet.java index 5e498ee207a..ad1cb4ab5ae 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricSet.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/MetricSet.java @@ -1,6 +1,7 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin.monitoring; +import javax.annotation.concurrent.Immutable; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; @@ -16,6 +17,7 @@ import static java.util.Collections.unmodifiableMap; * * @author gjoranv */ +@Immutable public class MetricSet { private final String id; @@ -84,9 +86,7 @@ public class MetricSet { private Map<String, Metric> toMapByName(Collection<Metric> metrics) { Map<String, Metric> metricMap = new LinkedHashMap<>(); - for (Metric metric : metrics) { - metricMap.put(metric.name, metric); - } + metrics.forEach(metric -> metricMap.put(metric.name, metric)); return metricMap; } 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 d71f3d18e28..250a84c55c7 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,6 +1,7 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.admin.monitoring; +import javax.annotation.concurrent.Immutable; import java.util.Map; /** @@ -8,6 +9,7 @@ import java.util.Map; * * @author trygve */ +@Immutable public class MetricsConsumer { private final String id; private final MetricSet metricSet; diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/Metrics.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/Metrics.java new file mode 100644 index 00000000000..b6b0dedc6b1 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/Metrics.java @@ -0,0 +1,27 @@ +// Copyright 2016 Yahoo Inc. 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.MetricsConsumer; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * A mutable helper class representing the user defined metrics and consumers. + * + * @author gjoranv + */ +public class Metrics { + + private final Map<String, MetricsConsumer> consumers = new LinkedHashMap<>(); + + public void addConsumer(MetricsConsumer consumer) { + consumers.put(consumer.getId(), consumer); + } + + public Map<String, MetricsConsumer> getConsumers() { + return Collections.unmodifiableMap(consumers); + } + +} 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 new file mode 100644 index 00000000000..bbeccb52bcb --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/PredefinedMetricSets.java @@ -0,0 +1,29 @@ +// Copyright 2016 Yahoo Inc. 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 com.yahoo.vespa.model.admin.monitoring.VespaMetricSet; + +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * A data object for predefined metric sets. + * + * @author gjoranv + */ +public class PredefinedMetricSets { + + public static final Map<String, MetricSet> predefinedMetricSets = toMapById( + new VespaMetricSet() + ); + + private static Map<String, MetricSet> toMapById(MetricSet... metricSets) { + Map<String, MetricSet> availableMetricSets = new LinkedHashMap<>(); + for (MetricSet metricSet : metricSets) + availableMetricSets.put(metricSet.getId(), metricSet); + return Collections.unmodifiableMap(availableMetricSets); + } + +} 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 new file mode 100644 index 00000000000..a577ae6dcab --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/monitoring/builder/xml/MetricsBuilder.java @@ -0,0 +1,55 @@ +// Copyright 2016 Yahoo Inc. 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 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; + +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author gjoranv + */ +public class MetricsBuilder { + + private static final String ID_ATTRIBUTE = "id"; + private final Map<String, MetricSet> availableMetricSets; + + public MetricsBuilder(Map<String, MetricSet> availableMetricSets) { + this.availableMetricSets = availableMetricSets; + } + + public Metrics buildMetrics(Element metricsElement) { + Metrics metrics = new Metrics(); + for (Element consumerElement : XML.getChildren(metricsElement, "consumer")) { + String consumerId = consumerElement.getAttribute(ID_ATTRIBUTE); + MetricSet metricSet = buildMetricSet(consumerId, consumerElement); + metrics.addConsumer(new MetricsConsumer(consumerId, metricSet)); + } + return metrics; + } + + private MetricSet buildMetricSet(String consumerId, Element consumerElement) { + List<Metric> metrics = XML.getChildren(consumerElement, "metric").stream() + .map(metricElement -> new Metric(metricElement.getAttribute(ID_ATTRIBUTE))) + .collect(Collectors.toCollection(LinkedList::new)); + + List<MetricSet> metricSets = XML.getChildren(consumerElement, "metric-set").stream() + .map(metricSetElement -> availableMetricSets.get(metricSetElement.getAttribute(ID_ATTRIBUTE))) + .collect(Collectors.toCollection(LinkedList::new)); + + return new MetricSet(metricSetId(consumerId), metrics, metricSets); + } + + private static String metricSetId(String consumerName) { + return "user-metrics-" + consumerName; + } + +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java index ae70efb8a3b..6b619bff829 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminBuilderBase.java @@ -10,12 +10,17 @@ import com.yahoo.vespa.model.HostSystem; import com.yahoo.vespa.model.admin.*; import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import com.yahoo.vespa.model.admin.monitoring.Yamas; +import com.yahoo.vespa.model.admin.monitoring.builder.Metrics; +import com.yahoo.vespa.model.admin.monitoring.builder.PredefinedMetricSets; +import com.yahoo.vespa.model.admin.monitoring.builder.xml.MetricsBuilder; import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProducer; import com.yahoo.config.application.api.FileRegistry; import org.w3c.dom.Element; import java.util.*; +import static com.yahoo.vespa.model.admin.monitoring.builder.PredefinedMetricSets.predefinedMetricSets; + /** * A base class for admin model builders, to support common functionality across versions. * @@ -56,9 +61,11 @@ public abstract class DomAdminBuilderBase extends VespaDomBuilder.DomConfigProdu @Override protected Admin doBuild(AbstractConfigProducer parent, Element adminE) { Yamas yamas = getYamas(XML.getChild(adminE, "yamas")); - Map<String, MetricsConsumer> metricsConsumers = DomMetricBuilderHelper.buildMetricsConsumers(XML.getChild(adminE, "metric-consumers")); - Admin admin = new Admin(parent, yamas, metricsConsumers, multitenant); + Metrics metrics = new MetricsBuilder(predefinedMetricSets).buildMetrics(XML.getChild(adminE, "metrics")); + Map<String, MetricsConsumer> legacyMetricsConsumers = DomMetricBuilderHelper.buildMetricsConsumers(XML.getChild(adminE, "metric-consumers")); + + Admin admin = new Admin(parent, yamas, metrics, legacyMetricsConsumers, multitenant); doBuildAdmin(admin, adminE); diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java index b70dfb6cfaa..c80d17f8202 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java @@ -658,7 +658,7 @@ public class ContentCluster extends AbstractConfigProducer implements StorDistri removedtags("thread"). tags("disk")); - Map<String, MetricsConsumer> consumers = getRoot().getAdmin().getUserMetricsConsumers(); + Map<String, MetricsConsumer> consumers = getRoot().getAdmin().getLegacyUserMetricsConsumers(); if (consumers != null) { for (Map.Entry<String, MetricsConsumer> e : consumers.entrySet()) { MetricsmanagerConfig.Consumer.Builder b = getMetricBuilder(e.getKey(), builder); 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 79c41b487a3..9b4219a87cf 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 @@ -84,7 +84,7 @@ public class DedicatedAdminV4Test { assertEquals("vespa.routing", yamas.getClustername()); assertEquals(60L, (long)yamas.getIntervalSeconds()); - MetricsConsumer consumer = model.getAdmin().getUserMetricsConsumers().get("yamas"); + MetricsConsumer consumer = model.getAdmin().getLegacyUserMetricsConsumers().get("yamas"); assertNotNull(consumer); assertEquals(3, consumer.getMetrics().size()); Metric metric = consumer.getMetrics().get("nginx.upstreams.down.last"); |